gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:00:27 24 4
gpt4 key购买 nike

信息

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

    人脸配置.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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com