定义自定义转换器时,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
,而不是标准类型,如 String
、Long
、BigDecimal
等 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;
我将以下内容作为自定义转换器的注释
@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
,而不是标准类型,如 String
、Long
、BigDecimal
等 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;