【问题标题】:How to bind the selected value in selectOneMenu如何在 selectOneMenu 中绑定选定的值
【发布时间】:2011-08-21 06:45:13
【问题描述】:

在 selectOneMenu 的五个选项中,我选择了第二个选项并保留了实体。 在编辑持久化实体时,selectOneMenu 始终将最后一个选项作为其值。

例如,

<h:selectOneMenu value="#{userHome.user.leader}">
    <f:selectItems value="#{userHome.availableLeaders}" var="leader" itemLabel="#        {leader.name}" itemValue="#{leader}"/>
</h:selectOneMenu>

其中availableLeaders 是填充@PostConstruct 方法的用户列表。

我希望 selectOneMenu 在编辑时有第二个选项(选择)。

@FacesConverter(forClass = User.class, value = "userConverter")
public class UserConverter implements Converter {

    public UserConverter() {
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
            EntityManagerFactory emf =     Persistence.createEntityManagerFactory("DefaultPersistenceUnit");
            EntityManager em = emf.createEntityManager();
            Query q = em.createQuery("select query");
        return q.resultList().get(0);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return ((User) value).getName();
    }}

在 User.java 中

public boolean equals(Object other) {
    if (this.getClass().isInstance(other)) {
        return true;
    } else {
        return false;
    }
}

public int hashCode() {
    HashCodeBuilder builder = new HashCodeBuilder();
    builder.append(getId());
    builder.append(getName());
    return builder.toHashCode();
}

【问题讨论】:

    标签: jsf


    【解决方案1】:

    看这里:

    public boolean equals(Object other) {
        if (this.getClass().isInstance(other)) {
            return true;
        } else {
            return false;
        }
    }
    

    你的equals() 方法肯定坏了。这将为 每个 其他 User 对象返回 true,即使它在内部拥有完全不同的用户 ID/名称。因此所选项目匹配每个可用的选择项目值。这就是为什么您每次都会看到最后一个项目被预选的原因。

    假设id 属性对每个用户都是唯一的,那么equals() 方法应该看起来像这样:

    public boolean equals(Object other) {
        if (!(other instanceof User)) {
            return false;
        }
    
        if (other == this) {
            return true;
        }
    
        if (id != null) {
            return id.equals(((User) other).id);
        }
    
        return false;
    }
    

    也可以总结如下

    public boolean equals(Object other) {
        return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this);
    }
    

    提示:像 Eclipse 这样的 IDE 可以自动生成 equals()(和 hashCode())方法。

    另见:

    【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2013-01-27
    • 2010-10-10
    • 1970-01-01
    • 2012-06-12
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多