【问题标题】:Difference between converter="entityConverter" and converter="#{entityConverter}"converter="entityConverter" 和 converter="#{entityConverter}" 之间的区别
【发布时间】:2014-12-08 09:30:45
【问题描述】:

converter="entityConverter"converter="#{entityConverter}" 有什么区别吗?

最初,我的应用程序使用这样的代码作为一个魅力:

<p:selectOneMenu id="civilityId"
                 value="#{customerController.selected.civilityId}"
                 converter="civilityConverter"> ...

但是当我将converter="civilityConverter" 更改为converter="#{civilityConverter}" 时,

我收到此错误:

Grave:   Error Rendering View[/customer/index.xhtml]
javax.el.PropertyNotFoundException: /customer/Edit.xhtml @30,186
value="#{customerController.selected.civilityId}":
Target Unreachable, 'null' returned null

感谢您的帮助。

【问题讨论】:

    标签: jsf converter el


    【解决方案1】:

    虽然这不是特定于&lt;p:selectOneMenu&gt;,但如果它提供任何提示,检查它的tag documentation 是值得的。上面写着:

    姓名:converter

    输入:javax.el.ValueExpression (必须评估为java.faces.convert.Converter

    描述:定义组件转换器的 el 表达式或文字文本。当它是一个 EL 表达式时,它被解析为一个转换器实例。如果是静态文本,则必须引用转换器 ID。

    所以,如果是

    converter="entityConverter"
    

    它将被解析为转换器 ID,通过转换器类上的 @FacesConverter 注释声明

    @FacesConverter("entityConverter")
    public class EntityConverter implements Converter {}
    

    &lt;converter&gt;faces-config.xml注册的&lt;converter-id&gt;条目:

    <converter>
        <converter-id>entityConverter</converter-id>
        <converter-class>com.example.EntityConverter</converter-class>
    </converter>
    

    而且,如果

    converter="#{entityConverter}"
    

    它将在 EL 上下文中解析为具体的 Converter 实例。将此类实例置于 EL 上下文中的常规方法是将其声明为托管 bean。例如。通过 JSF

    @ManagedBean
    @RequestScoped
    public class EntityConverter implements Converter {}
    

    或通过 CDI

    @Named
    @RequestScoped
    public class EntityConverter implements Converter {}
    

    这样做通常是为了能够将@EJB 注入其中,以便执行任何必要的业务/数据库逻辑。在即将发布的 JSF 2.3 之前,@FacesConverter(和 @FacesValidator)不支持依赖注入(但是您可以使用 JSF 实用程序库 OmniFaces 解决此问题)。

    另见:

    【讨论】:

      【解决方案2】:

      converter="civilityConverter" 用于 FacesConverters
      converter=#{civilityConverter} 用于命名托管 bean。

      【讨论】:

        【解决方案3】:

        只是为了添加一些有用的信息,我可以添加以下内容。

        我使用FacesConverter 并测试了以下 JSF 元素

        <h:selectOneMenu value="#{controller.panelTpl.txtUser.value}">
            <f:converter converterId="userConverter"/>
            <f:selectItems 
                value="#{controller.panelTpl.txtOriginator.userList}"
                var="user" 
                itemLabel="#{user.humanName}"
                itemValue="#{user}"
                />
        </h:selectOneMenu>
        

        <h:selectOneMenu value="#{controller.panelTpl.txtOriginator.value}">
            <f:converter converterId="#{userConverter}"/>
            <f:selectItems 
                value="#{controller.panelTpl.txtOriginator.userList}"
                var="user" 
                itemLabel="#{user.humanName}"
                itemValue="#{user}"
                />
        </h:selectOneMenu>
        

        第一个工作正常。

        第二次返回跟随错误

        Severe:   JSF1006: Cannot instantiate converter of type 
        Severe:   Expression Error: Named Object: ' not found.
        javax.faces.FacesException: Expression Error: Named Object: ' not found.
            at com.sun.faces.application.ApplicationImpl.createConverter(ApplicationImpl.java:1339)
            at javax.faces.application.ApplicationWrapper.createConverter(ApplicationWrapper.java:393)
            at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.createConverter(ConverterTagHandlerDelegateImpl.java:158)
        

        正如 Balus 所说,这不仅与 Primefaces 相关。

        我使用 JSF 2.2 是因为我在 Glassfish 4.1 上部署了我的应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多