2013-04-24 55 views
1

信息selectOneMenu用於顯示提交後總是最後一個項目在列表中選擇的項目

  • JSF 2.0
  • Primefaces 3.4
  • 這兩個對象是人對象

我有一個簡單的降下拉菜單包含在表單提交表單中(AJAX呼叫):

<h:form> 

.... 

        <p:selectOneMenu converter="personconverter" 
         value="#{searchperson.viewPerson.relatedTo}" filter="true" 
         filterMatchMode="startsWith"> 
         <f:selectItems value="#{searchperson.people}" var="person" 
          itemLabel="#{person.fullName}" itemValue="#{person}" /> 
        </p:selectOneMenu> 
.... 
        <p:commandButton value="Save" 
         actionListener="#{searchperson.updatePerson}" /> 
</h:form> 

當我向服務器提交請求時,綁定到selectOneMenu的對象正確傳遞,並且能夠使用此更改更新後端。

當頁面被重新呈現,P中的值:selectOneMenu用於:

(value="#{searchperson.viewPerson.relatedTo}") 

不會呈現剛提交了新的變化。它呈現人員列表中的最後一個Person對象。

下面是另件:

轉換器:

@FacesConverter("personconverter") 
public class PersonConverter implements Converter { 

@Override 
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) { 

    People pApi = new People(); 
    Person per = new Person(); 

    try { 
     per = pApi.getPerson(Long.parseLong(value)); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
    return per; 
} 

@Override 
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { 

    return String.valueOf(((Person) arg2).getId()); 
} 

}

對象類

@Override 
public boolean equals(Object object) { 
    return true; //just to pass through temporarily 
} 

@Override 
public int hashCode() { 
    return 0; 
} 

面-config.xml中

<converter> 
    <converter-for-class>com.obj.Person</converter-for-class> 
    <converter-class>com.converter.PersonConverter</converter-class> 
</converter 

回答

2

equals()hashCode()的實現嚴重中斷。這種方式Person的實例被認爲是彼此相等,因此JSF將無法基於可用項目列表標識正確的選定項目。您必須至少根據其contracts執行它們。

修復它相應的,因爲它有一個id屬性表示唯一標識符:

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

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

啊 - 謝謝你。我對JSF比較陌生,所以我查了一下這兩種方法的用途。而你爲什麼看到我所做的解釋很有道理。非常感激。 – user2124871 2013-04-24 18:38:08

+0

不客氣。這不一定與JSF有關。這是基本Java的基本部分。另請參閱http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html – BalusC 2013-04-24 18:40:08

+0

額外PS - 您的博客/條目對我的學習非常有幫助。 – user2124871 2013-04-24 18:40:37

相關問題