Возникает раздражающая проблема, когда я заполняю выборку из детализации двумя selectOneMenu
.Первое меню Сектор , которое управляет другим Категория .Я загружаю выбор для Категории в зависимости от Сектора, и все это работает нормально.
Но когда я редактирую бизнес-объект, к которому прикреплен Сектор категории (с одним).Категория не отображается при первой загрузке страницы edit.xhtml .Я знаю, что значение корректно в компоненте SessionScoped
.Если я выберу другую Секторную категорию, а затем вернусь к начальному Сектору, категория будет должным образом установлена при том, что она была сохранена в первую очередь.
Классы POJO (Секторная категория) имеют hashCode()
иequals(Object object)
функции.
У меня есть сгенерированные CRUD JSF-конвертеры для объекта POJO, но я не думаю, что это вызывает проблему.Я думаю, что второй selectOneMenu
не отображает свое значение, как должно по какой-то причине.Если я переверну родительский объект (сектор) на что-то другое и вернусь к исходному состоянию, отобразится правильное значение из управляемого bean-компонента.
Как я могу заставить компонент категории selectOneMenu
отображать значение вуправляемый бин?
Привет Крис
Сообщение об ошибке Faces
FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=null[severity=(ERROR 2), summary=(No activity selected), detail=(No activity selected)]
Edit.xhtml
...
<h:outputLabel value="Sector:" />
<h:selectOneMenu id="sectorSelector" value="#{activityController.selectedSector}" title="#{bundle.CreateSectorLabel_sectorName}" required="false" requiredMessage="#{bundle.CreateSectorRequiredMessage_sectorName}"
valueChangeListener="#{activityController.changeSectorMenu}"
disabled="#{activityController.activityStatusOngoing or activityController.activityStatusComplete}">
<f:ajax event="change" execute="@this" render="categoryMenu"/>
<f:selectItems value="#{sectorController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>
<h:outputLabel value="Category:" />
<h:selectOneMenu id="categoryMenu" value="#{activityController.selectedCategory}" title="#{bundle.CreateSectorLabel_sectorName}"
required="true" requiredMessage="#{bundle.CreateCategoryRequiredMessage_sector}"
disabled="#{activityController.activityStatusOngoing}" rendered="true">
<f:selectItems value="#{activityController.categorySelection}"/>
</h:selectOneMenu>
...
Бин контроллера для категории
@ManagedBean(name = "categoryController")
@SessionScoped
public class CategoryController implements Serializable{
....
@FacesConverter(forClass = Category.class)
public static class CategoryControllerConverter implements Converter {
@Override
public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
if (value == null || value.length() == 0) {
return null;
}
CategoryController controller = (CategoryController) facesContext.getApplication().getELResolver().
getValue(facesContext.getELContext(), null, "categoryController");
return controller.ejbFacade.find(getKey(value));
}
java.lang.Integer getKey(String value) {
java.lang.Integer key;
key = Integer.valueOf(value);
return key;
}
String getStringKey(java.lang.Integer value) {
StringBuffer sb = new StringBuffer();
sb.append(value);
return sb.toString();
}
@Override
public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
if (object == null) {
return null;
}
if (object instanceof Category) {
Category o = (Category) object;
return getStringKey(o.getIdCategory());
}
else {
throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + CategoryController.class.getName());
}
}
}
Часть объекта POJO
...
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idCategory")
private Integer idCategory;
...