没有converter-id和forClass的@FacesConverter

时间:2015-07-06 07:28:52

标签: jsf-2 jsf-2.2

如果我在确定@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,为什么一切正常?

1 个答案:

答案 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) 类的默认转换器。