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

标签 jsf primefaces converters selectonemenu

信息

  • 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/

相关文章:

html - 如何防止 p :menubar from being overlapped by the contents of a CSS template?

jQuery 事件绑定(bind)

ajax - 标签库支持命名空间 : http://java. sun.com/jsf/core,但没有为名称定义标签:ajax

JSF & Primefaces & IE Ajax 不工作

java - 在 Java 中将时间转换为 float ,反之亦然

mysql - 转换器应用程序拒绝 MS Access 2010 accdb 文件

java - 将日历日期格式设置为受时区影响的 dd-MM-yyyy

java - 不同浏览器窗口中的 JSF session 问题

java - JSF 表达式语言的代码风格指南

html - 我如何使用 Primefaces 命令按钮更新表(不是数据表)