2012-05-23 58 views
3

我失去了這個奇怪的問題的日子,我加倍檢查了一切,但我的selectOneMenu根本不工作,我不明白爲什麼。primefaces 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,但在查看/編輯模式下無法獲取所選值。

我在做什麼錯?

在此先感謝!

+0

實體和entityType只是幻想名稱 –

+0

使用'p:ajax'而不是valueChangeListener ... – Daniel

+0

沒有valueChangeListener的同樣的問題。我的問題是當我加載編輯頁面時獲取選定的值。我認爲值=「#{entityBean.entity.type}」和轉換器應該這樣做,但顯然這不適用於我。 –

回答

10

如果您的EntityType類的equals()方法丟失或損壞,可能會發生這種情況。假設你已經在你的EntityType類的id財產,這似乎標識實例唯一不足的事實,下面的最小的實現應該爲你做:

@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()僅僅是強制性的,因爲每equals()contract

+0

謝謝你的回答,我的平等方法是missig!現在它工作正常! –

+0

不客氣:) – BalusC