Как связать выбранное значение в selectOneMenu - PullRequest
1 голос
/ 21 августа 2011

Из пяти опций в 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();
    }}

In 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();
}

1 Ответ

4 голосов
/ 21 августа 2011

Смотрите здесь:

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

Ваш equals() метод определенно нарушен. Это возвращает true для каждого другого User объекта, даже если он внутренне содержит совершенно другой идентификатор пользователя / имя. Таким образом, выбранный элемент соответствует каждому доступному значению выбранного элемента. Вот почему вы видите, что последний элемент предварительно выбирается каждый раз.

Если предположить, что свойство 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);
}

Подсказка: немного приличная IDE, такая как Eclipse, может автоматически генерировать equals()hashCode()) метод.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...