【问题标题】:Conversion Error setting value 'dbaccess.persistence.Employee[id=66666666]' for 'null Converter''null Converter' 的转换错误设置值'dbaccess.persistence.Employee[id=66666666]'
【发布时间】:2014-10-13 01:14:09
【问题描述】:

这是我要提交的表单的 sn-p:

<h:outputText value="Employees"></h:outputText>
<h:selectManyListbox id="employees" 
                     value="#{lookupControl.memberEmployees}" 
                     converter="#{employeeConverter}">
    <f:selectItems value="#{lookupControl.employees}" 
                   var="emp" 
                   itemLabel="#{emp.EMPLOYEE_NUMBER}" 
                   itemValue="#{emp}"/>
</h:selectManyListbox>
<h:message id="employeesMsg" 
           for="employees" 
           errorStyle="color:red; display:block" 
           styleClass="errorMessage"/>

<h:outputText value="Project Lead"></h:outputText>
<h:selectOneListbox id="projectLead" 
                    value="#{lookupControl.chosenLead}" 
                    converter="#{employeeConverter}">
    <f:selectItems value="#{lookupControl.employees}" 
                   var="emp" 
                   itemLabel="#{emp.EMPLOYEE_NUMBER}" 
                   itemValue="#{emp}"/>
</h:selectOneListbox>
<h:message id="projectLeadMsg" 
           for="projectLead" 
           errorStyle="color:red; display:block" 
           styleClass="errorMessage"/>

这是转换器employeeConverter

@FacesConverter(value = "employeeConverter")
public class EmployeeConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        // hack to get an em
        HelperBean helper = FacesContext.getCurrentInstance().getApplication().evaluateExpressionGet(context, "#{helperBean}", HelperBean.class);
        EntityManager em = helper.getEm();

        System.out.println(value);

        Employee tmp = DBHelper.findEmployee(em, value);
        return tmp;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        Employee tmp = (Employee) value;
        return tmp.getEMPLOYEE_NUMBER();
    }
}

这个想法是“项目”(提交此表单时创建的对象)具有成员列表 (List&lt;Employee&gt;) 和团队负责人 (Employee)。当我尝试提交表单时,我收到一条消息:

Conversion Error setting value 'dbaccess.persistence.Employee[id=66666666]' for 'null Converter'.

这是说它不能从 String 转换为 Employee,但它适用于它上面的字段。我有点困惑。

【问题讨论】:

    标签: jsf converter


    【解决方案1】:

    “空转换器”是找不到转换器实例的异常。由于您通过 converter="#{employeeConverter} 将转换器引用为托管 bean,因此只有使用 @javax.faces.bean.ManagedBean 进行注释时才能找到它

    将@ManagedBean(name = "employeeConverterBean") 添加到EmployeeConverter 类中

    @ManagedBean(name = "employeeConverterBean")
    @FacesConverter(value = "employeeConverter")
    public class EmployeeConverter implements Converter {
    

    并使用converter="#{employeeConverterBean}" 而不是converter="#{employeeConverter}"

    【讨论】:

      【解决方案2】:

      您在 converter= 属性中引用了范围变量,但 @FacesConverter 不会创建范围变量。相反,它使用您指定的转换器 ID 注册您的转换器类。

      来自documentation for FacesConverter.value

      这个注解属性的值被取为converter-id ...

      从您的 h:selectManyListbox 中完全删除 converter= 属性,而是添加一个嵌套的 f:converter 元素:

      <h:selectManyListbox id="employees" 
                           value="#{lookupControl.memberEmployees}">
          <f:converter converterId="employeeConverter"/>
          <f:selectItems value="#{lookupControl.employees}" 
                         var="emp" 
                         itemLabel="#{emp.EMPLOYEE_NUMBER}" 
                         itemValue="#{emp}"/>
      </h:selectManyListbox>
      

      更新:我总是从字面上理解tag documentation,它表示属性的值“必须评估为 javax.faces.convert.Converter”。 BalusC 指出不需要嵌套的 f:converter;在 converter= 属性中传递文字转换器 ID 将起作用:

      <h:selectManyListbox id="employees" 
                           value="#{lookupControl.memberEmployees}"
                           converter="employeeConverter">
          <f:selectItems value="#{lookupControl.employees}" 
                         var="emp" 
                         itemLabel="#{emp.EMPLOYEE_NUMBER}" 
                         itemValue="#{emp}"/>
      </h:selectManyListbox>
      

      在没有书面保证它有效的情况下,我过去从未觉得这样做很舒服。我刚刚浏览了 JSF 规范,并在其“标准 HTML RenderKit 标记库”部分下找到了这个:

      必须采取以下措施来处理converter 属性的值。如果converter 属性上的isLiteralText() 返回true,则获取该属性的值并将其视为converterId,方法是将其作为参数传递给此webapp 的Application 实例的createConverter() 方法,然后将创建的Converter 传递给该标签的组件的setConverter() 方法。

      是的,完全支持在 converter= 属性中传递转换器 ID。

      【讨论】:

      • 不需要删除。 OP 应该只用过converter="employeeConverter"
      猜你喜欢
      • 2013-03-17
      • 2012-10-31
      • 1970-01-01
      • 2012-10-22
      • 2021-05-12
      • 2011-09-23
      • 2012-06-06
      • 2011-10-31
      • 2017-09-01
      相关资源
      最近更新 更多