2012-02-20 43 views
1

有效,我得到這個錯誤很多時候..我用兩個H:selectOneMenu用於在我的JSF頁面,medialist中和Unitlist。同時選擇任何媒體。我的單元列表會自動填充,但有一段時間會給出驗證錯誤:值無效;驗證錯誤::值不是Selectone菜單

我的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> 

Mediacombo的onchane事件

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

我也使用 '單位'

我的媒體轉換器是

@FacesConverter轉換器( value =「MediaConverter」) public class 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幫助我。」我想你可以ommit這裏。你不是印度街頭的乞丐,是嗎?;) – 2012-02-20 09:47:01

回答

4

的問題是最有可能在你的轉換器和模型類(媒體)。

你不告訴你究竟是如何做轉換,但我想你是通過返回介質的ID,並通過如DB一些地方得到一個新的實例轉換回媒體轉換爲字符串?

在這種情況下,您的媒體類需要實現自定義equals和hashCode方法。

JSF如果用戶發送的值與綁定到一個SelectItems列表中的值對應進行比較。它使用equals,默認情況下比較對象Ids(內存引用的種類)。除非你有完全相同的實例,否則這將始終是錯誤的。

相反定義的equals方法,則可以選擇讓你的轉換器讓你從相同的列表需要作爲一個SelectItems來自模型對象。關於這個,有一篇關於http://jdevelopment.nl的文章。

+1

嗨邁克..非常感謝我得到了我的問題。現在我改變了我提到的文章轉換器。現在它的工作很好..謝謝你非常感謝你... – 2012-02-21 09:31:57