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
感谢您的帮助。
答案 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上。