Основные лица selectOneMenu не работает, когда это должно

Я теряю дни с этой странной проблемой, я дважды проверил все, но мой selectOneMenu просто не работает, и я не могу понять, почему.

Итак, вот мои коды:

Мой JSF

<p:selectOneMenu id="entityType"  
      value="#{entityBean.entity.type}" 
      style="width:240px;" 
      converter="entityTypeConverter"
      valueChangeListener="#{entityBean.entityTypeListener}"
      required="true">
      <f:selectItems value="#{entityBean.typeList}"
              var="et"
              itemLabel="#{et.name}"
              itemValue="#{et}" />
</p:selectOneMenu>

Мой конвертер:

    @FacesConverter("entityTypeConverter")
    public class EntityTypeConverter implements Converter {
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            Long id = Long.parseLong(value);

            return EntityType.findEntityType(id);
        }

        public String getAsString(FacesContext context, UIComponent component, Object value) {

            return value instanceof EntityType ? ((EntityType) value).getId().toString() : "";
        }
    }

Он работает, как и ожидалось, когда я создаю (он передает выбранное значение), но когда я пытаюсь редактировать сущность, выбранный тип фактически никогда не выбирается. Я пробовал с простыми главами 3.1.1 и 3.2, но я не могу получить выбранное значение в режиме просмотра / редактирования.

Что я делаю неправильно?

Заранее спасибо!

1 ответ

Решение

Это может произойти, если equals() метод вашего EntityType класс отсутствует или сломан. Учитывая тот факт, что вы id собственность в вашем EntityType класс, который, кажется, идентифицирует экземпляр достаточно уникально, следующая минимальная реализация должна сделать это для вас:

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

@Override
public int hashCode() {
    return (id != null)
        ? (this.getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

hashCode() просто обязателен согласно equals() контракт.

Другие вопросы по тегам