在定义自定义转换器时,哪一个在FacesConverter注释中的值和forClass之间取得更高的优先级?

时间:2015-04-23 08:35:16

标签: jsf-2 jsf-2.2

我有以下作为自定义转换器的注释

 @FacesConverter(value="capsConverter", forClass=String.class)
      public class CapsConverter implements Converter{
       @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return value.toUpperCase(); 
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,Object value) {
        if(value!=null && value instanceof String){
            String s = (String)value;
            s = WordUtils.capitalize(s.toLowerCase());
            return s;
        }
        return null;
    }

     }

问题是,转换器有时会被调用,即使我没有在我的页面中显式调用它,forClass是否与我的inputTexts的干扰有关,我应该仅使用值并删除forClass = String.class吗?

任何光明之光都受到高度赞赏。

1 个答案:

答案 0 :(得分:4)

它实际上是注册转换器的两种不同方式。两者都是相互排斥的。它们彼此没有影响,你可以省略其中一个。

forClass属性将在JSF应用程序中注册转换器,以便在处理和呈现指定类型的每个模型值时启动。换句话说,对于forClass=String.class,将为每个 String类型的输入和输出隐式调用转换器,除非关联的输入/输出组件已经声明了显式转换器。

通常,您只对自定义/复杂类型使用forClass,而不是{J}已经内置的StringLongBigDecimal等标准类型转换器。

所以你应该删除它并仅依赖转换器ID。

@FacesConverter("capsConverter")
<h:someComponent ... converter="capsConverter" />

forClass的正确设备示例将是Person实体与代表其ID的String之间的以下转换器

@FacesConverter(forClass=Person.class)

类似

<f:viewParam name="id" value="#{bean.person}" />

转换表示实体ID的传入请求参数,如下所示

/edit-person.xhtml?id=42

到bean中一个值得满足的实体属性(bean中不需要任何额外的逻辑)

private Person person;