Primefaces使用转换器验证错误并等于工作

时间:2017-04-07 12:52:41

标签: jsf primefaces converter

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

任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:1)

解决了!我能想象的最大的最小错误!

return baremeBean.loadById(Integer.parseInt(value));

我的 loadById 方法返回了一个列表而不是一个简单的对象....对不起伙计们!