首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >converter="entityConverter“和converter="#{entityConverter}”的差异

converter="entityConverter“和converter="#{entityConverter}”的差异
EN

Stack Overflow用户
提问于 2014-12-08 17:30:45
回答 3查看 620关注 0票数 2

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

最初,我的应用程序使用以下代码作为魅力:

代码语言:javascript
复制
<p:selectOneMenu id="civilityId"
                 value="#{customerController.selected.civilityId}"
                 converter="civilityConverter"> ...

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

我得到了这个错误:

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

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

发布于 2015-02-18 16:34:35

虽然这不是特定于<p:selectOneMenu>的,但如果它给出任何提示,那么只检查它的tag documentation是值得的。它说了以下内容:

名称:converter

类型:javax.el.ValueExpression (必须计算为java.faces.convert.Converter)

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

因此,在以下情况下

代码语言:javascript
复制
converter="entityConverter"

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

代码语言:javascript
复制
@FacesConverter("entityConverter")
public class EntityConverter implements Converter {}

<converter>faces-config.xml中注册的<converter-id>条目

代码语言:javascript
复制
<converter>
    <converter-id>entityConverter</converter-id>
    <converter-class>com.example.EntityConverter</converter-class>
</converter>

而且,在以下情况下

代码语言:javascript
复制
converter="#{entityConverter}"

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

代码语言:javascript
复制
@ManagedBean
@RequestScoped
public class EntityConverter implements Converter {}

或通过CDI

代码语言:javascript
复制
@Named
@RequestScoped
public class EntityConverter implements Converter {}

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

另请参阅:

票数 2
EN

Stack Overflow用户

发布于 2015-02-18 14:58:37

converter="civilityConverter“适用于FacesConverters

converter=#{civilityConverter}用于命名的托管beans。

票数 1
EN

Stack Overflow用户

发布于 2018-07-20 14:22:43

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

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

代码语言:javascript
复制
<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>

代码语言:javascript
复制
<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>

第一个可以正常工作。

错误后的第二个返回

代码语言:javascript
复制
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上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27354994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档