2012-02-20 3 views
1

Я получил эту ошибку много раз .. Я использую два h: selectonemenu на моей странице JSF, mediaList и Unitlist. при выборе любого носителя. мой UnitList заполняется автоматически, но некоторое время он дает ошибку проверки: значение недействительно;Ошибка проверки :: Значение недействительно в меню выбора

Мой JSF код

<h:selectOneMenu id="media" value="#{workOrderMbean.selectedMedia}" converter="MediaConverter" onchange="submit()" valueChangeListener="#{workOrderMbean.onChangeMediaCombo}" immediate="true"> 
    <f:selectItems value="#{workOrderMbean.mediaCombo}"/> 
</h:selectOneMenu> 

<h:selectOneMenu id="hUnit" value="#{workOrderMbean.selectedHeightUnit}" converter="UnitConverter" > 
    <f:selectItems value="#{workOrderMbean.unitCombo}"/> 
</h:selectOneMenu> 

onchane событие Mediacombo является

public void onChangeMediaCombo(ValueChangeEvent e) throws SearchBLException { 

     if (e.getNewValue() != null) { 
      Media media = (Media) e.getNewValue(); 
      if (unitCombo != null && !unitCombo.isEmpty()) { 
       unitCombo.clear(); 
       seclectedWidthUnit=new Unit(); 
       selectedHeightUnit=new Unit(); 
      } 
      unitCombo = ComboLoader.getUnitsComboByMediaid(media.getMediaId()); 
     } 
     else 
     { 
      if (unitCombo != null && !unitCombo.isEmpty()) { 
       unitCombo.clear(); 
       seclectedWidthUnit=null; 
       selectedHeightUnit=null; 
      } 
      unitCombo = ComboLoader.getUnitsComboByMediaid(-1); 
     } 
    } 

я также использую конвертер для 'Unit'

мой медиа конвертер

@FacesConverter (value = "MediaConverter") Публичный класс MediaConverter реализует конвертер {

MediaDAO mediadao=new MediaDAOImpl(); 

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    Media media=null; 
    try { 
     media=mediadao.getMedia(Integer.parseInt(value)); 
    } catch (SearchBLException ex) { 
     Logger.getLogger(MediaConverter.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return media; 
} 

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    String str = ""; 
if (value instanceof Media) { 
    str = "" + ((Media) value).getMediaId(); 
} 
return str; 
} 

}

+2

«PLZ помочь мне ..» Я думаю, вы можете опустить это здесь. Ты не нищий на улицах Индии, ты ?;) –

ответ

4

Проблема, скорее всего, в вашем конвертерного и модели класса (СМИ).

Вы не показываете, как именно вы выполняете преобразование, но я полагаю, что вы конвертируете в String, возвращая Идентификатор СМИ и переходя к Media, получив новый экземпляр из какого-то места, например, в БД?

В этом случае вашему классу Media необходимо реализовать собственный метод equals и hashcode.

JSF сравнивает, если значение, присваиваемое пользователем, соответствует значениям в списке, который вы связываете с selectitems. Он использует equals для этого, который по умолчанию сравнивает идентификаторы объектов (типы ссылок на память). Если у вас нет точных экземпляров, это всегда будет ложным.

Вместо определения метода equals вы также можете позволить конвертеру получить требуемый объект модели из того же списка, что и selectitems. Некоторое время назад была статья об http://jdevelopment.nl.

+1

Привет, Майк .. Большое спасибо, я получил свою проблему. теперь я изменил свой конвертер в качестве упомянутой статьи. теперь его рабочий штраф .. Большое спасибо вам большое ... –

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