Благодаря некоторым замечательным статьям, я смог создать <h:selectOneMenu />
с объектами selectItems, содержащими объекты. После предоставления пользовательского FacesConverter и исправления недостающих методов equals () / hashcode () я могу использовать его для изменения свойства базового компонента и его записи в БД.
Единственная странная вещь состоит в том, что все HTML <option />
элементы <select />
-элемента checked="checked"
! Другими словами: <h:selectOneMenu />
не отражает текущее значение связанного свойства!
подробности:
Store.java
@Entity
public class Store {
private Long id;
private String name;
@ManyToOne
private Category category;
// getters, setters, equals, hashcode
}
Category.java
@Entity
public class Category {
private Long id;
private String name;
// getters, setters, equals, hashcode
}
editStore.xhtml
<h:form>
....
<h:selectOneMenu value="#{backingBean.store.category}" id="category">
<f:selectItems value="#{backingBean.categorySelectItems}" />
</h:selectOneMenu>
....
</h:form>
BackingBean.java
public class BackingBean {
private Store store;
// inject data-access-facades via @EJB
// Constructor
// getters, setters
public List<SelectItem> getCategorySelectItems
List<SelectItem> items = new ArrayList<SelectItem>();
for (Category cat : categoryFacade.findAll() ) {
items.add(new SelectItem(cat, cat.getName()));
}
return items;
}
// action methods
}
Я пропускаю перечисление Category-Converter (он конвертирует объект и его идентификатор).
HTML-код, который он создает:
<select id="category" name="category" size="1">
<option value="251" selected="selected">Kosmetik</option>
<option value="222" selected="selected">Sportwaren</option>
</select>
Очевидно, что store.category
может содержать только один элемент ... почему оба параметра-элемента "выбраны"? Независимо от того, какая категория назначена магазину, HTML всегда «выбирает» все option-элементы.
Как теперь JSF, какой SelectItem
должен быть выбран?