我多次犯这个错误..我在我的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;
}
}
答案 0 :(得分:4)
问题很可能出在您的转换器和模型类(媒体)中。
您没有显示您是如何完全进行转换的,但我猜您是通过返回Media的Id来转换为String,并通过从某个位置(例如DB)获取新实例来转换回Media?
在这种情况下,您的Media类需要实现自定义的equals和hashcode方法。
JSF会比较用户发送的值是否与您绑定到选择项的列表中的值相对应。它使用equals,默认情况下比较对象ID(内存引用的种类)。除非您具有完全相同的实例,否则这将始终为false。
除了定义equals方法之外,您还可以让转换器从选择项的相同列表中获取所需的模型对象。关于这一点,有一篇关于http://jdevelopment.nl的文章。