我在JSF中遇到了PrimeFaces的 p:selectOneMenu 问题。我读了很多关于同样问题的问题,但没有帮助我。
当我按照以前在项目中的任何位置设置我的组件时,如果我尝试选择 selectOneMenu 中的一项,则会出现此错误:
验证错误:值无效
很多人通过纠正转换器类或 equals()方法来解决这个问题,但是在矿井中没有任何问题。
转换器
@RequestScoped
public class BaremeConverter implements Converter {
@EJB
private BaremeBean baremeBean;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
return baremeBean.loadById(Integer.parseInt(value));
} catch(NumberFormatException e) {
return null;
}
}
else {
return null;
}
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if(object != null) {
return String.valueOf(((Bareme) object).getId());
}
else {
return null;
}
}
}
BaremeBean 是此类的entityBean,它正在加载数据。我的工作空间充满了这样的转换器,所以除非我错过了这个,它应该在这里工作。
Bareme类的equals()方法
@Override
public boolean equals(Object object) {
if (!(object instanceof Bareme)) {
return false;
}
Bareme other = (Bareme) object;
return !((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id)));
}
这是Netbeans生成的equals()方法,这里也没有看错。
最后,我给出了我使用的组件的代码,和以前的代码一样,相同的代码适用于我得到的其他类。
<h:outputLabel for="forfaitBareme" value="Barème" />
<p:selectOneMenu id="forfaitBareme" class="print-w100p-lab" value="#{transportFacturationBean.forfait.bareme}" converter="#{baremeConverter}" >
<f:selectItem itemLabel="" itemValue="#{null}" />
<f:selectItems value="#{transportFacturationBean.baremesForfait}" var="b" itemLabel="#{b.id}" itemValue="#{b}" />
<p:ajax event="change" update=":centralPanel" process="@form" />
</p:selectOneMenu>
transportFacturationBean.baremesForfait 是一个包含少量Bareme的java.util.List。
您应该知道使用我项目的另一个自定义对象,下面的代码运行良好。 Camion 的实现方式与 Bareme 相同,它们的转换器类似,而且它们的equals()方法都是Netbeans生成的。
<h:outputLabel for="forfaitCamion" value="Camion" />
<p:selectOneMenu id="forfaitCamion" class="print-w100p-lab" value="#{transportFacturationBean.forfait.camion}" converter="#{camionConverter}" >
<f:selectItem itemLabel="" itemValue="#{null}" />
<f:selectItems value="#{transportFacturationBean.camions}" var="c" itemLabel="#{c.type}" itemValue="#{c}" />
<p:ajax event="change" update=":centralPanel" process="@form" />
</p:selectOneMenu>
任何帮助将不胜感激!提前谢谢!
答案 0 :(得分:1)
解决了!我能想象的最大的最小错误!
return baremeBean.loadById(Integer.parseInt(value));
我的 loadById 方法返回了一个列表而不是一个简单的对象....对不起伙计们!