情報
- 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