【问题标题】:selectOneMenu shows after submit always the last item in the list as selected itemselectOneMenu 在提交后始终将列表中的最后一项显示为选定项
【发布时间】:2013-04-18 09:57:53
【问题描述】:

信息

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

当我向服务器提交请求时,绑定到 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

【问题讨论】:

    标签: jsf primefaces converter selectonemenu


    【解决方案1】:

    我知道 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 选择一个项目;但是保存页面并再次显示后,保存的项目不会显示,并且总是显示列表的最后一项。

    错误只是我只有一个“!” in return 声明是完全不正确的。

    我把它替换为

    //2018-09-04:BS: big BUG
    //return (!nId.equals(that.nId));
    return (nId.equals(that.nId));
    

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

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

    【讨论】:

    • 更好地改进接受的答案通过直接添加代码或者有时甚至更好地添加对相关 Stackoverflow 问题的引用。这在 Stackoverflow 中受到高度赞赏。
    • 见鬼 Kukeltje。如你所知,我喜欢说话 :-) 但我不理解第二部分,我对修改(或完成)另一个用户的帖子有些沉默(就像 Balus 那样非常“Balaise”=“束缚在 IT “在法语中)。 StackOverflow 游戏化推动我创建另一个帖子,期望获得一些分数;-) 另一件事。我喜欢答案很简短。由于这个其他原因,我认为完成 BalusC 答案并不有趣。用户可以继续为最佳答案投票,如果我的示例很有趣,有时可以投票给我。这是我的观点。
    【解决方案2】:

    您的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 比较陌生,所以我有点看了一下这两种方法的目的。你对我为什么看到我所做的事情的解释非常有道理。非常感谢。
    • 不客气。它不一定与JSF有关。它是基本 Java 的基础部分。另请参阅docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
    • 额外附注 - 您的博客/条目对我的学习很有帮助。
    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    相关资源
    最近更新 更多