JSF2:selectOneMenu with custom selectItems:选中所有项目

Han*_*ank 2 java jsf jsf-2

感谢这里的一些很棒的文章,我已经能够<h:selectOneMenu />使用包含对象的selectItems 构建一个.在提供自定义FacesConverter并修复缺少的equals()/ hashcode()方法之后,我可以使用它来更改辅助bean的属性并将其写入数据库.

唯一奇怪的是 - 元素的所有 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
}
Run Code Online (Sandbox Code Playgroud)

Category.java

@Entity
public class Category {
  private Long id;
  private String name;

  // getters, setters, equals, hashcode
}
Run Code Online (Sandbox Code Playgroud)

editStore.xhtml

<h:form>
....
  <h:selectOneMenu value="#{backingBean.store.category}" id="category">
    <f:selectItems value="#{backingBean.categorySelectItems}" />
  </h:selectOneMenu>
....
</h:form>
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

我没有列出Category-Converter(它在对象和它的ID之间转换).

这创建的HTML是:

<select id="category" name="category" size="1">
  <option value="251" selected="selected">Kosmetik</option>
  <option value="222" selected="selected">Sportwaren</option>
</select>
Run Code Online (Sandbox Code Playgroud)

显然,store.category只能包含一个项目...为什么两个选项元素都"被选中"?无论什么类别被分配给商店,HTML总是"选择"所有选项元素.

现在如何SelectItem选择JSF ?

Boz*_*zho 5

几乎可以肯定问题出在equals(..)方法中,该方法返回true所有比较对象.测试一下,让你的IDE生成方法(连同hashCode())