2013-04-17 3 views
3

Я использую selectonemenu так:selectonemenu Ошибка проверки: Значение не является допустимым

<h:selectOneMenu value="#{MyBean.zajecie.przedmiot}"> 
    <f:selectItems value="#{MyBean.przedmioty}" var="p" 
     itemLabel="#{p.nazwa}" itemValue="#{p}" /> 
    <f:converter converterId="converter.PrzedmiotConverter" /> 
</h:selectOneMenu> 

MyBean:

private Zajecie zajecie;//+set get 
private List<Przedmiot> przedmioty;//+set get 

@PostConstruct 
private void init() { 
    przedmioty = przedmiotDao.findByLogin("login"); 
    zajecie = new Zajecie(); 
} 

и методы преобразователя:

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    PrzedmiotDao przedmiotDao = DaoFactory.getInstance().getPrzedmiotDao(); 
    Przedmiot przedmiot = przedmiotDao.findById(Przedmiot.class, Integer.parseInt(value)); 
    return przedmiot; 
} 

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    Przedmiot przedmiot = (Przedmiot) value; 
    String idAsString = String.valueOf(przedmiot.getPrzedmiotId()); 
    return idAsString; 
} 

selectonemenu компонент заселяется, как и предполагалось. Когда я отправлю, он показывает Validation Error: Value is not valid. Я знаю, что мне нужен правильный метод equals() для моих объектов, поэтому я сгенерировал его с помощью eclipse, используя только поле id. Затем мне пришлось сменить тест getClass() != obj.getClass() на obj instanceof Przedmiot, потому что obj.getClass() вернул что-то вроде этого: Przedmiot_$$_javassist_1. Я не уверен, что это актуально, потому что obj оказывается null. Что я делаю не так?

Edit:

MyBean является ViewScoped.

Смешно, что аналогичный код с использованием одного и того же преобразователя работает в другой части приложения. Разница в том, что в рабочей части я просто просматриваю список типа Przedmiot, и я получаю его по-другому.

@PostConstruct 
private void init() { 
    student = studentDao.findByLogin(ra.getUser()); 
} 

<h:selectOneMenu value="#{otherBean.przedmiot}"> 
    <f:selectItems value="#{otherBean.student.grupa.przedmiots}" var="p" 
     itemLabel="#{p.nazwa}" itemValue="#{p}" /> 
    <f:converter converterId="converter.PrzedmiotConverter" /> 
</h:selectOneMenu> 

ответ

1

В конверторе: Integer.parseInt(value) и в <f:selectItems установке itemValue="#{p}", поэтому каждый #{p} является экземпляром Przedmiot типа.

Смотрите также: Why selectOneMenu Send ItemLabel to the converter?

+0

Thats not working. Я не могу бросить String в Przedmiot. Не означает ли значение присваиваемого значения уникальный идентификатор, как описано в ссылке, которую вы дали? – user2270884

+0

ой, извините, вы получаете сообщение об ошибке при загрузке страницы или отправке на сервер? –

+0

На submit. Проверка не выполняется. – user2270884

4

решаемые его. Было, конечно, плохо написано метод equals(). Прежде всего, в моем вопросе была ошибка. obj не решился, но other.przedmiotId сделал. Простите за это. Посмотрите на метод порожденного затмения:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Przedmiot))//changed this from (getClass() != obj.getClass()) 
     return false; 
    Przedmiot other = (Przedmiot) obj; 
    if (przedmiotId == null) { 
     if (other.przedmiotId != null) 
      return false; 
    } else if (!przedmiotId.equals(other.przedmiotId)) 
     return false; 
    return true; 
} 

Проблема заключается в other.przedmiotId. При получении значения с помощью геттера other.getPrzedmiotId() он больше не принимает значение null.

Смежные вопросы