1

选择系统后(第一个 selectonemenu),我看到部分的下拉列表已填充,但是当我选择部分时,我看不到设置器被调用。因此,尽管我提交了表单,但我得到了 Validation Error Value is not valid。

<h:outputText value="System" />  
<p:selectOneMenu value="#{moduleManagementController.selectedSystem}" converter="#{applicationSystemConverter}">  
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{applicationSystems}" var="appsystem" itemLabel="#{appsystem.name}" itemValue="#{appsystem}"/>
    <p:ajax event="change" update="section" listener="#{moduleManagementController.onApplicationSystemChanged}"/>  
</p:selectOneMenu> 

<h:outputText value="Section" />  
<p:selectOneMenu id="section" value="#{moduleManagementController.newModule.section}" converter="#{systemSectionConverter}">  
    <f:selectItem itemLabel="Select One" itemValue="" />  
    <f:selectItems value="#{moduleManagementController.assignableSysSections}" var="section" itemLabel="#{section.name}" itemValue="#{section}"/>  
    <p:ajax event="change" update="addModule"/>
</p:selectOneMenu> 

以下是我的 SystemSection 的 equals 方法

 public boolean equals(Object obj) {
    if(this == obj) {
        return true;
    } if(obj == null) {
        return false;
    } if(! this.getId().equals(((SystemSection)obj).getId())) {
        return false;
    }
    return true;
}

我的转换器类:

@Override
public Object getAsObject(FacesContext context, UIComponent component,
        String value) {
     if(value == null || "".equals(value)) {
         return null;
     }
     try {
         SystemSection section = systemSectionRepo.findById(Long.valueOf(value));
         return section;
     } catch (NumberFormatException e) {
         return null;
     }
}

/* (non-Javadoc)
 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
 */
@Override
public String getAsString(FacesContext context, UIComponent component,
        Object value) {  

     if (value instanceof SystemSection)
     {
         return ((SystemSection)value).getId().toString();
     }   
     return "";
}

我不确定出了什么问题。我理解的一件事是equals方法返回false,因此没有调用setter方法。有人可以帮我解决这个问题。

4

1 回答 1

0

我收到验证错误值无效。

equals()如果在处理表单提交期间没有返回true任何当前可用项目的选定项目测试,您将收到此错误。

因此,这可能有 2 个原因,如果涉及转换器,则可能有 3 个原因:

  1. equals()丢失或损坏。
  2. 与显示表单的请求相比,在处理表单提交的请求期间,当前可用项目的列表发生了不兼容的变化。
  3. 转换器未在 上返回正确的提交值getAsObject()

equals()方法和转换器似乎看起来不错。落后原因 2. 言归正传,后面的列表发生了#{moduleManagementController.assignableSysSections}不兼容的变化。显然,您的 bean 是请求范围的,或者您正在 getter 方法中执行业务逻辑。将 bean 放入视图范围并确保您没有在 getter 方法中执行业务逻辑应该修复它。

于 2013-01-25T02:44:10.370 回答