信息
- JSF 2.0
- Primefaces 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>
当我向服务器提交请求时,绑定(bind)到 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
最佳答案
您的 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();
}
关于jsf - selectOneMenu 在提交后始终显示列表中的最后一项作为所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198954/