定义自定义转换器时,FacesConverter 注解中的 value 和 forClass 哪个优先级高?

Which one takes higher precendence between value and forClass in FacesConverter annotation when defining custom converter?

我将以下内容作为自定义转换器的注释

 @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 ?

非常感谢任何光线。

这实际上是两种不同的注册转换器的方式。两者是相互排斥的。它们相互之间没有影响,您可以省略一个或另一个。

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

通常你只对 custom/complex 类型使用 forClass,而不是标准类型,如 StringLongBigDecimal 等 JSF已经内置了隐式转换器。

所以您确实应该删除它并仅依赖转换器 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;