selectOneMenu在提交后始终显示列表中的最后一项作为所选项目

时间:2013-04-24 17:54:18

标签: jsf primefaces converter 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 个答案:

答案 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));

我的问题已经解决了:-)

在履历表中:即使小部件的某些部分继续正常工作,一个坏角色也可能会完全破坏应用程序。