我正在使用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>
问题是当我在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
/* */
答案 0 :(得分: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>
上面您将仅提交要应用于模型的当前组件请求值。
修改强>
实际上它可能不是验证问题,因为在ajax事件上没有提交请求值。
根据Primefaces手册:
process null String要在部分请求中处理的组件。
update null String要使用ajax更新的组件。
第二列是默认值。在标准<f:ajax>
中,execute
属性默认为@this
,但<p:ajax>
不是这种情况。如果要提交当前组件,则必须在process
属性中指定。
答案 1 :(得分:2)
您需要将转换器添加到 p:selectOneMenu ,以便让它知道您正在处理员工对象。创建转换器类并将其与转换器属性一起使用。这是样本转换器。
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() : "";
}
}