JSF验证错误:值无效

时间:2017-06-08 16:34:36

标签: jsf primefaces jsf-2

我在收到错误“验证错误:值无效”时遇到问题。提交表单后,即使在调试时,选中的组件也是正确的,我也会收到此错误。转换器似乎工作得很好,这就是为什么我在这里度过了一段非常艰难的时光。这是我到目前为止所尝试的:

  • 将@RequestScoped更改为@ManagedBean和@ViewScoped - 由于NullpointerException,每次都会导致SelectOneMenue beofore崩溃,@ RequestScoped从未发生这种情况,所以我不确定那里发生了什么......

  • 我仔细检查了这个SelectedOneMenue的转换器,它似乎正在工作,我在那里做了很多调试,转换为String的对象,至少对我来说是可见的,后来是从String转换回Object。

  • equals()方法:equals方法对我来说似乎没问题,它只是检查.id是否相同,在转换器上检查时,它始终是正确的。也许我宁愿在这里搜索错误,即使我无法弄清楚这里可能出现什么问题。

以下是我的代码部分,我想这对你很有意思,我已经做了很多研究,我找到了相当不错的东西虽然我不能让它工作但是这一定不是什么意思,因为我只是开始用JavaEE和JSF(+ Primefaces)编程。

组件等于()方法

 @Override
 public boolean equals(Object obj) {
    if(obj == null){
        //System.out.println("Component is NULL in equals() method");
    }
    if(this.id == ((Component) obj).id) {
        return true;
    }else {
        return false;
    }
}

组件转换器类

@ManagedBean(name = "componentConverterBean")
@FacesConverter (value = "componentConverter") 
public class ComponentConverter implements Converter{

@PersistenceContext(unitName="PU")
private EntityManager em;

@Override
public String getAsString(FacesContext context, UIComponent component, Object modelValue) {
    if (modelValue == null) {
        return "";
    }
    return modelValue.toString();
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
    if (submittedValue == null || submittedValue.isEmpty()) {
        System.out.println("ComponentConverter: submittedValue is null");
        return null;
    }

    try {
        System.out.println("ComponentConverter: Value to be found: " + submittedValue);
        return em.find(Component.class, Integer.parseInt(submittedValue));
    } catch (NumberFormatException e) {
        throw new ConverterException(new FacesMessage(submittedValue + " is not a valid Component ID", e.getMessage()));
    }
}

}

包含SelectOneMenues

的.xhtml文件的一部分
 <p:outputLabel for="facility" value="Facility: " />
 <p:selectOneMenu id="facility" value="#{visualization.facility}" converter="#{facilityConverterBean}" style="width:150px">
    <p:ajax process="@this" partialSubmit="true" listener="#{visualization.onFacilityChange()}" update="component" />
    <f:selectItem itemLabel="Select Facility" noSelectionOption="true" />
    <f:selectItems value="#{visualization.facilities}" var="facility" itemLabel="#{facility.name}" itemValue="#{facility}" />
 </p:selectOneMenu>
 <p:outputLabel for="component" value="Components: " />
 <p:selectOneMenu id="component" value="#{visualization.component}" converter="#{componentConverterBean}" style="width:150px">
    <f:selectItem itemLabel="Select Component" noSelectionOption="true" />
    <f:selectItems value="#{visualization.components}" var="comp" itemLabel="#{comp.name}" itemValue="#{comp}" />
 </p:selectOneMenu>

“组件:Überprüfungsfehler:Wertistungültig。” 这是确切的错误,转换为: “组件:验证错误:值无效。”

我非常感谢这里的任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

使用容器对象而不是实体来表示值=&#34;#{visualization.component}&#34;。 e.g。

class ComponentDto {
     private Component componentEntity;

     private Component getComponentEntity() {
         return this.componentEntity;
     }

     private void setComponentEntity(Component componentEntity) {
         this.componentEntity = componentEntity;
     }
}

另请参阅:https://github.com/primefaces/primefaces/issues/2756