Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java <;p:selectOneMenu侦听器方法在选择值时返回null_Java_Jsf_Jsf 2_Primefaces - Fatal编程技术网

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

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

我正在使用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="#{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() : "";
    }
}