绕过JSF中某些属性的面转换器



我有一个如下的转换器来删除所有的前后空白,并删除单词之间的额外空格。

@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",有时需要绕过此转换器,其中单词之间不应分别修剪空白或额外空格。

如何绕过这样的字符串类型属性,使此转换器不应用于它们?

几种方法

  1. 显式声明一个转换器,它对该值实际上不做任何操作。

    <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.
        }
    }
    

  2. 传递一个额外的组件属性,并让转换器检查。

    <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.
    }
    

  3. 让转换器检查组件类型。<h:inputSecret>后面的UIComponentHtmlInputSecret类的一个实例。

    @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.
    }
    

使用哪一种方式取决于业务需求和转换器的可重用性程度。

相关内容

  • 没有找到相关文章

最新更新