2

情報

  • JSF2.0
  • プライムフェイス 3.4
  • どちらのオブジェクトも People オブジェクトです

フォーム送信時に選択を送信するフォーム内に含まれる単純なドロップダウンメニューがあります(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;
}

face-config.xml

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

2 に答える 2

3

equals()との実装hashCode()はひどく壊れています。このように、 のすべてのインスタンスはPerson互いに等しいと見なされるため、JSF は使用可能なアイテムのリストに基づいて、選択された正しいアイテムを識別することができません。少なくともそれらの契約に従って実装する必要があります。

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();
}
于 2013-04-24T18:15:05.207 に答える