3

这个奇怪的问题让我失去了好几天,我仔细检查了所有内容,但我的 selectOneMenu 根本不起作用,我不明白为什么。

所以这是我的代码:

我的jsf

<p:selectOneMenu id="entityType"  
      value="#{entityBean.entity.type}" 
      style="width:240px;" 
      converter="entityTypeConverter"
      valueChangeListener="#{entityBean.entityTypeListener}"
      required="true">
      <f:selectItems value="#{entityBean.typeList}"
              var="et"
              itemLabel="#{et.name}"
              itemValue="#{et}" />
</p:selectOneMenu>

我的转换器:

    @FacesConverter("entityTypeConverter")
    public class EntityTypeConverter implements Converter {
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            Long id = Long.parseLong(value);

            return EntityType.findEntityType(id);
        }

        public String getAsString(FacesContext context, UIComponent component, Object value) {

            return value instanceof EntityType ? ((EntityType) value).getId().toString() : "";
        }
    }

它在我创建时按预期工作(它传递所选值),但是当我尝试编辑实体时,所选类型实际上从未被选中。我尝试使用 primefaces 3.1.1 和 3.2,但在查看/编辑模式下我无法获得选定的值。

我究竟做错了什么?

提前致谢!

4

1 回答 1

10

如果equals()您的EntityType类的方法丢失或损坏,则可能会发生这种情况。鉴于id您的类中有一个属性EntityType似乎足以唯一地标识实例,因此以下最小实现应该为您完成:

@Override
public boolean equals(Object other) {
    return (other instanceof EntityType) && (id != null)
        ? id.equals(((EntityType) other).id)
        : (other == this);
}

@Override
public int hashCode() {
    return (id != null)
        ? (this.getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

hashCode() is just mandatory as per equals() contract.

于 2012-05-24T02:23:08.827 回答