验证错误::值在Selectone菜单中无效

时间:2012-02-20 07:05:59

标签: jsf-2

我多次犯这个错误..我在我的JSF页面中使用了两个h:selectonemenu,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>

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”) 公共类MediaConverter实现Converter {

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

}

1 个答案:

答案 0 :(得分:4)

问题很可能出在您的转换器和模型类(媒体)中。

您没有显示您是如何完全进行转换的,但我猜您是通过返回Media的Id来转换为String,并通过从某个位置(例如DB)获取新实例来转换回Media?

在这种情况下,您的Media类需要实现自定义的equals和hashcode方法。

JSF会比较用户发送的值是否与您绑定到选择项的列表中的值相对应。它使用equals,默认情况下比较对象ID(内存引用的种类)。除非您具有完全相同的实例,否则这将始终为false。

除了定义equals方法之外,您还可以让转换器从选择项的相同列表中获取所需的模型对象。关于这一点,有一篇关于http://jdevelopment.nl的文章。