我有一个如下的转换器来删除所有的前后空白,并删除单词之间的额外空格。
@ManagedBean
@ApplicationScoped
@FacesConverter(forClass=String.class)
public final class StringTrimmer implements Converter
{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
return value != null ? value.trim().replaceAll("\s+", " ") : null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
return value!=null ? ((String) value).trim().replaceAll("\s+", " ") : null;
}
}
此转换器全局应用于关联的支持bean中的所有字符串类型属性。
对于某些属性,如"password",有时需要绕过此转换器,其中单词之间不应分别修剪空白或额外空格。
如何绕过这样的字符串类型属性,使此转换器不应用于它们?
几种方法
-
显式声明一个转换器,它对该值实际上不做任何操作。
。
<h:inputSecret ... converter="noConverter" />
@FacesConverter("noConverter") public class NoConverter implements Converter { @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { return value; } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { return (value != null) ? value.toString() : ""; // This is what EL would do "under the covers" when there's no converter. } }
-
传递一个额外的组件属性,并让转换器检查。
<h:inputSecret ...> <f:attribute name="skipConverter" value="true" /> </h:inputSecret>
@Override public Object getAsObject(FacesContext context, UIComponent component, String value) { if (Boolean.valueOf(String.valueOf(component.getAttributes().get("skipConverter")))) { return value; } // Original code here. } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (Boolean.valueOf(String.valueOf(component.getAttributes().get("skipConverter")))) { return (value != null) ? value.toString() : ""; } // Original code here. }
-
让转换器检查组件类型。
<h:inputSecret>
后面的UIComponent
是HtmlInputSecret
类的一个实例。@Override public Object getAsObject(FacesContext context, UIComponent component, String value) { if (component instanceof HtmlInputSecret) { return value; } // Original code here. } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if (component instanceof HtmlInputSecret) { return (value != null) ? value.toString() : ""; } // Original code here. }
使用哪一种方式取决于业务需求和转换器的可重用性程度。