<p:selectOneMenu侦听器方法在选择值时返回null

Jåc*_*cob 4 java jsf primefaces jsf-2

我正在使用JSF 2.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="#{mb.changeMethod}" />
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

问题是当我在selectOneMenu中选择一个值时,我在ManagedBean的changeMethod中得到null,为此 System.out.println("val "+employee.getEmployeeName());

这可能是什么原因?我该如何解决这个问题?任何肝脏都非常值得注意.

ManagedBean代码

@Named("mb")
@ViewAccessScoped
public class MyBean implements Serializable {

private Employee employee;
private List<Employee> employeeList;

@Inject
EmployeeService employeeService;

@PostConstruct
public void loadEmployees() {
employeeList = employeeService.getEmployees();
}


public void changeMethod() {
System.out.println("val  "+employee.getEmployeeName());
}


/* getters and setters for employee and employeeList */
.... methods
/* */
Run Code Online (Sandbox Code Playgroud)

map*_*aft 9

您没有在<p:ajax>组件上指定要处理的表单元素,因此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>
Run Code Online (Sandbox Code Playgroud)

您将在上面提交要应用于模型的当前组件请求值.

编辑:

实际上,它可能不是验证问题,因为在ajax事件上没有提交请求值.

根据Primefaces手册:

process null String要在部分请求中处理的组件.

update null String要使用ajax更新的组件.

第二列是默认值.在标准中<f:ajax>,execute属性默认为,@this但事实并非如此<p:ajax>.如果要提交当前组件,则必须在process属性中指定此组件.