转换器=" entityConverter"之间的差异和转换器="#{entityConverter}"

时间:2014-12-08 09:30:45

标签: jsf converter el

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

虽然这不是<p:selectOneMenu>特有的,但如果提供任何提示,只需检查tag documentation即可。它说:

  

姓名:converter

     

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

     

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

所以,在

的情况下
converter="entityConverter"

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

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

<converter-id> <converter> faces-config.xml <converter> <converter-id>entityConverter</converter-id> <converter-class>com.example.EntityConverter</converter-class> </converter> 注册converter="#{entityConverter}"

Converter

并且,在

的情况下
@ManagedBean
@RequestScoped
public class EntityConverter implements Converter {}

它将被解析为EL上下文中的具体@Named @RequestScoped public class EntityConverter implements Converter {} 实例。将此类实例放入EL上下文的常规方法是将其声明为托管bean。例如。通过JSF

@EJB

或通过CDI

@FacesConverter

通常这样做是为了能够向其中注入@FacesValidator,以便可以执行任何必要的业务/数据库逻辑。在即将到来的JSF 2.3之前,{{1}}(和{{1}})即不支持依赖注入(但是你可以通过使用JSF实用程序库OmniFaces来解决)。

另见:

答案 1 :(得分:1)

converter =“civilityConverter”适用于FacesConverters
converter =#{civilityConverter}用于命名的托管bean。

答案 2 :(得分:0)

只需添加一些有用的信息,我就可以添加以下内容。

我使用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上。