信息
我有一个简单的下拉菜单,该菜单包含在表单提交(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
答案 0 :(得分:3)
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();
}
答案 1 :(得分:0)
我知道BalusC是解决此问题的最佳答案;但是我也遇到了同样的问题,我仅会举例说明它,以帮助其他人理解该问题。
在更正它之前,我使用以下Java服务器代码
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (getClass() != o.getClass()) return false;
if (o == null)
{
return (nId == null);
}
PostLabellingMeetingEntity that = (PostLabellingMeetingEntity) o;
if (nId == null)
{
return (that.nId == null);
}
return (!nId.equals(that.nId));
}
错误未得到纠正,我可以使用SelectOneMenu选择一个项目;但是在保存页面并再次显示后,将不会显示已保存的项目,并且始终显示列表的最后一项。
错误仅是我只有一个“!”在返回语句中完全不正确。
我替换为
//2018-09-04:BS: big BUG
//return (!nId.equals(that.nId));
return (nId.equals(that.nId));
我的问题已经解决了:-)
在履历表中:即使小部件的某些部分继续正常工作,一个坏角色也可能会完全破坏应用程序。