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

Jsf selectOneMenu在提交后始终显示列表中的最后一项作为选定项,jsf,primefaces,converter,selectonemenu,Jsf,Primefaces,Converter,Selectonemenu,信息 JSF2.0 Primefaces 3.4 这两个对象都是人对象 我有一个简单的下拉菜单,它包含在一个表单中,在表单提交时提交选择(AJAX调用): 不会呈现刚刚提交的新更改。它呈现人员列表中的最后一个人对象。 以下是其他作品: 转换器: @FacesConverter("personconverter") public class PersonConverter implements Converter { @Override public Object getAsObject(F

信息

  • JSF2.0
  • Primefaces 3.4
  • 这两个对象都是人对象
我有一个简单的下拉菜单,它包含在一个表单中,在表单提交时提交选择(AJAX调用):

不会呈现刚刚提交的新更改。它呈现人员列表中的最后一个人对象。

以下是其他作品:

转换器:

@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

com.obj.Person
com.converter.PersonConverter

您的
equals()
hashCode()
的实现被严重破坏。通过这种方式,每个
Person
实例都被视为彼此平等,因此JSF将无法根据可用项列表识别正确的选定项。你必须至少根据他们的需求来实现它们

相应地修复它,因为它具有表示唯一标识符的
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();
}

我知道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));
我的问题已经解决了:-)


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

Ah-谢谢。我对JSF比较陌生,所以我大致了解了这两种方法的用途。你对我为什么看到我做的事的解释很有道理。非常感谢,不客气。它不一定与JSF相关。它是基本Java的基本部分。另请参阅附加说明-您的博客/条目对我的学习有很大的帮助。最好通过直接添加代码或有时更好地添加相关问题的参考来改进已接受的答案。这在Stackoverflow中得到高度赞赏。见鬼,Kukeltje。如你所知,我喜欢谈论:-),但我不理解第二部分,我对修改(或完成)另一个用户的帖子有一些保留(如巴卢斯,非常“平衡”=“捆扎在它里面”法语)。StackOverflow游戏化促使我创建另一个帖子,期望获得一些分数;-)还有一件事我喜欢答案简短的时候。出于另一个原因,我认为完成BalusC的回答并不有趣。用户可以继续投票选出最佳答案,如果我的例子有趣的话,也可以在一段时间内投票给我。这是我的观点。
@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));
    }
//2018-09-04:BS: big BUG
//return (!nId.equals(that.nId));
return (nId.equals(that.nId));