如果我在确定@FacesConverter注释时没有指定converter-id和(或)forClass,那么应该正常工作? 例如:
@FacesConverter
public class SplitConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
//...
}
@Override
public String getAsString(FacesContext context, UIComponent component,
Object value) {
//...
}
在faces-config.xml中注册并在.xhtml页面上使用它:
<h:inputText id="badges" value="#{article.badges}"
required="true">
<f:converter converterId="com.katcgr.SplitConverter" />
</h:inputText>
一切都很有效。文档说明
如果converter-id是空字符串,则调用Application.addConverter(java.lang.Class,java.lang.String),将converter-for-class作为第一个参数传递,并将派生的converter-class作为第二个论点。
但即使我没有指定forClass,为什么一切正常?
答案 0 :(得分:2)
在faces-config.xml
中注册后
@FacesConverter
中的<converter>
和faces-config.xml
注册是互斥的,因此XML注册会覆盖任何注释注册。因此,当您通过XML中注册的转换器ID引用转换器时,转换器实例的行为基本上就像没有注释一样。如果删除XML注册,那么您应该在指定的converterId
上检索以下异常:
javax.faces.FacesException: Expression Error: Named Object: com.katcgr.SplitConverter 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)
...
如果您有
,这基本上只会起作用@FacesConverter("com.katcgr.SplitConverter")
但是,如果删除XML配置和<f:converter>
,那么它将“正常工作”,因为对于每个bean属性,将自动调用没有显式@FacesConverter
的{{1}} forClass
(基本上是所有内容)的实例,它没有已经注册的更具体的转换器。换句话说,您的转换器将表现如下:
java.lang.Object
希望不需要详细解释这是一个非常糟糕的主意。它也会混淆PrimeFaces,因为它会在内部初始化并将其用作@FacesConverter(forClass=Object.class)
类的默认转换器。