Java <;p:selectOneMenu侦听器方法在选择值时返回null
我正在使用JSF2.0和Primefaces 3.4.2 在JSF页面中我有以下内容Java <;p:selectOneMenu侦听器方法在选择值时返回null,java,jsf,jsf-2,primefaces,Java,Jsf,Jsf 2,Primefaces,我正在使用JSF2.0和Primefaces 3.4.2 在JSF页面中我有以下内容 <p:selectOneMenu value="#{mb.employee}"> <f:selectItems value="#{mb.employeeList}" var="emp" itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/> <p:ajax listener="#{m
<p:selectOneMenu value="#{mb.employee}">
<f:selectItems value="#{mb.employeeList}" var="emp"
itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/>
<p:ajax listener="#{mb.changeMethod}" />
</p:selectOneMenu>
您没有在
组件上指定要处理的元素,因此ajax请求可能会提交多个值,这些值可能与其他字段验证冲突。请记住,如果提交了一个值,但验证失败,则不会将任何请求值设置为模型。当您到达应用程序(事件)阶段时,模型值将不会反映任何提交的请求值
试试这个:
<p:selectOneMenu value="#{mb.employee}">
<f:selectItems value="#{mb.employeeList}" var="emp"
itemLabel="#{emp.employeeName}" itemValue="#{emp.employeeCode}"/>
<p:ajax process="@this" partialSubmit="true" listener="#{mb.changeMethod}" />
</p:selectOneMenu>
在上面,您将仅提交要应用于模型的当前组件请求值
编辑:
实际上,这可能不是验证问题,因为ajax事件中没有提交请求值
根据Primefaces手册:
在部分请求中处理要处理的空字符串组件
更新空字符串组件以使用ajax进行更新
第二列是默认值。在标准
中,execute
属性默认为@this
,但
的情况并非如此。如果要提交当前组件,则必须在过程属性中指定它。您需要将转换器添加到p:selectOneMenu,让它知道您正在处理员工对象。创建converter类并将其与converter属性一起使用。这是示例转换器
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
@FacesConverter("employeeConverter")
@Configurable
public class EmployeeConverter implements Converter {
@Autowired
EmployeeService employeeService;
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
if (value == null || value.length() == 0) {
return null;
}
Long id = Long.parseLong(value);
return employeeService.findUser(id);
}
public String getAsString(FacesContext context, UIComponent component,
Object value) {
return value instanceof Employee ? ((Employee) value).getId().toString() : "";
}
}
我已经添加了@Polppan在属性setter或getter方法中必须出现空指针。这也可能发生在selectOneMenu
组件的转换器中。您正在转换employee
对象,不是吗?这是因为我没有converter类吗?是的employeeList和employee基本上都是employee类。@Polppan是的,您将需要为直接绑定到selectOneMenu
的对象实现一个转换器。我将添加一个转换器类并返回给您。Chris有什么原因不调用getAsObject
方法吗?仅调用getAsString
方法?保存数据时调用getAsObject。此时,selectOneMenu必须返回需要保存的对象。调用getAsString进行UI转换只是为了查看名称、代码或类似内容。保存之前,我们是否可以测试“getAsObject”是否返回正确的值?我认为只有在需要检索对象进行保存时才会调用getAsObject。我不确定它是否会在其他任何阶段被调用。可能是javax.faces.convert.Converter.getAsObject方法的默认行为在部分更新发生时也会被调用,类似于
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
@FacesConverter("employeeConverter")
@Configurable
public class EmployeeConverter implements Converter {
@Autowired
EmployeeService employeeService;
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
if (value == null || value.length() == 0) {
return null;
}
Long id = Long.parseLong(value);
return employeeService.findUser(id);
}
public String getAsString(FacesContext context, UIComponent component,
Object value) {
return value instanceof Employee ? ((Employee) value).getId().toString() : "";
}
}