"converter='entityConverter'和converter='# {entityConverter}'之间的区别",这是一个关于IT技术的问题。

3
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个回答

3
尽管这并非特定于<p:selectOneMenu>,但检查其标签文档是否提供任何提示是值得的。它说:

名称:converter

类型:javax.el.ValueExpression(必须求值为java.faces.convert.Converter

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

因此,在这种情况下,

converter="entityConverter"

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

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

或者在faces-config.xml文件中标记的属性处进行注册:
<converter>
    <converter-id>entityConverter</converter-id>
    <converter-class>com.example.EntityConverter</converter-class>
</converter>

并且,在这种情况下
converter="#{entityConverter}"

在EL上下文中,它将被解析为具体的转换器实例。将这样的实例放入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来解决此问题)。

另请参阅:


1

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


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上部署我的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接