我有以下作为自定义转换器的注释
@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吗?
任何光明之光都受到高度赞赏。
答案 0 :(得分:4)
它实际上是注册转换器的两种不同方式。两者都是相互排斥的。它们彼此没有影响,你可以省略其中一个。
forClass
属性将在JSF应用程序中注册转换器,以便在处理和呈现指定类型的每个模型值时启动。换句话说,对于forClass=String.class
,将为每个 String
类型的输入和输出隐式调用转换器,除非关联的输入/输出组件已经声明了显式转换器。
通常,您只对自定义/复杂类型使用forClass
,而不是{J}已经内置的String
,Long
,BigDecimal
等标准类型转换器。
所以你应该删除它并仅依赖转换器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;