2012-05-23 2 views
3

Я теряю дни с этой странной проблемой, я дважды проверял все, но мой selectOneMenu просто не работает, и я не могу понять, почему.primefaces 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, но я не могу получить выбранное значение в режиме просмотра/редактирования.

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

Заранее благодарен!

+0

Сущность и сущностьType - просто фантастические имена –

+0

использовать 'p: ajax' вместо valueChangeListener ... – Daniel

+0

Такая же проблема без valueChangeListener. Моя проблема - получить значение, выбранное при загрузке страницы редактирования. Я думаю, что значение = "# {entityBean.entity.type}", и конвертер должен это сделать, но, по-видимому, это не работает со мной. –

ответ

10

Это может случиться, если у вас отсутствует или не работает метод 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()contract.

+0

Спасибо за ваш ответ, мой метод равных был missig! Теперь он работает отлично! –

+0

Добро пожаловать :) – BalusC