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

时间:2014-06-06 18:13:32

标签: jsf converter jsf-2.2

我有一个转换器如下修剪所有前导和尾随空格并删除单词之间的其他空格。

@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中的所有字符串类型属性。

有时需要绕过此转换器以获取某些属性,例如"密码"其中不应分别修剪或镶边单词之间的空格或空格。

如何绕过这种字符串类型属性,以便不应用此转换器?

1 个答案:

答案 0 :(得分:2)

有几种方式。

  1. 明确声明一个转换器,该值与该值无效。

    E.g。

    <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. 让转换器检查组件类型。 UIComponent后面的<h:inputSecret>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.
    }
    
  4. 使用哪种方式取决于业务需求和转换器的可重用程度。