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谢谢你的帮助。
发布于 2015-02-18 16:34:35
虽然这不是特定于<p:selectOneMenu>的,但如果它给出任何提示,那么只检查它的tag documentation是值得的。它说了以下内容:
名称:
converter
类型:javax.el.ValueExpression (必须计算为java.faces.convert.Converter)
说明:为组件定义转换器的el表达式或文字文本。当它是一个EL表达式时,它被解析为一个转换器实例。如果它是一个静态文本,它必须引用一个转换器id。
因此,在以下情况下
converter="entityConverter"它将被解析为转换器ID,该ID是通过转换器类上的@FacesConverter注释声明的
@FacesConverter("entityConverter")
public class EntityConverter implements Converter {}或<converter>在faces-config.xml中注册的<converter-id>条目
<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,以便可以执行任何必要的业务/DB逻辑。在即将发布的JSF2.3之前,@FacesConverter (和@FacesValidator)并不支持依赖注入(不过,您可以通过使用JSF实用程序库OmniFaces来解决这个问题)。
另请参阅:
发布于 2015-02-18 14:58:37
converter="civilityConverter“适用于FacesConverters
converter=#{civilityConverter}用于命名的托管beans。
发布于 2018-07-20 14:22:43
只是为了添加一些有用的信息,我可以添加以下内容。
我使用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上。
https://stackoverflow.com/questions/27354994
复制相似问题