选择系统(第一个选择菜单)后,我看到部分的下拉列表已填充,但是当我选择该部分时,我没有看到正在调用的setter。 因此,尽管我提交了表格,但我得到的验证错误值无效。
<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>
以下是我的系统部分的等于方法
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 方法。有人可以帮我解决问题吗?
我得到的验证错误值无效。
在处理表单提交期间equals()
所选项目的测试未返回任何当前可用项目的true
时,您将收到此错误。
因此,这可能有 2 个原因,如果涉及转换器,则可能有 3 个原因:
equals()
丢失或损坏。- 与显示表单的请求相比,在处理表单提交请求期间,当前可用项目的列表发生了不兼容的变化。
- 转换器未在
getAsObject()
上返回正确提交的值。
equals()
方法和转换器似乎看起来不错。留下原因 2。至此,#{moduleManagementController.assignableSysSections}
背后的列表发生了不兼容的变化。显然,您的 Bean 是请求范围的,或者您正在 getter 方法中执行业务逻辑。将 Bean 放在视图范围内并确保你没有在 getter 方法中执行业务逻辑应该可以修复它。