Обход конвертера лиц для определенных свойств в 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;
    }
}

Этот преобразователь применяется глобально ко всем свойствам строкового типа в связанных компонентах поддержки.

Иногда необходимо обойти этот преобразователь для определенных свойств, таких как «пароль», в которых не должны быть обрезаны или чередованы пробелы или дополнительные пробелы между словами соответственно.

Как можно обойти такие свойства строкового типа, чтобы к ним не применялся этот преобразователь?


person Tiny    schedule 06.06.2014    source источник


Ответы (1)


Несколько путей.

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

Какой способ использовать, зависит от бизнес-требований и степени возможности повторного использования преобразователя.

person BalusC    schedule 06.06.2014