Почему <h: inputText required = "true" > разрешает пробелы?

Когда я устанавливаю required="true" в <h:inputText>, он по-прежнему допускает пробелы. Я пытаюсь изменить jsf-api.jar, но я не мог понять, как создать новый JAR, поэтому я попытался изменить метод isEmpty() из класса UIInput и скомпилировать его, откройте jsf-api.jar и замените его на новый, но это не сработало.

Мне нужно сделать trim(), когда пользователь записывает в <h:inputText>, чтобы не пустить пробелы. Как я могу достичь этого?

Если вы хотите загрузить ресурс jsf-api.jar, вы можете сделать это, просто прочитайте, как на: http://javaserverfaces.java.net/checkout.html.

Ответы

Ответ 1

Это нормальное и естественное поведение, а не JSF. Пустое пространство может быть вполне допустимым. required="true" срабатывает только на пустые входы, а не на заполненные входы. В JSF вы можете просто создать класс Converter для String, чтобы автоматически обрезать пробелы.

@FacesConverter(forClass=String.class)
public class StringTrimmer implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return value != null ? value.trim() : null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return (String) value;
    }

}

Поместите этот класс в проект. Он будет автоматически зарегистрирован благодаря @FacesConverter и автоматически активируется для каждой записи String благодаря forClass=String.class.

Не нужно взломать JSF API/impl. Это не имеет смысла.

Ответ 2

Если вы хотите отключить поведение, которое BalusC отмечает как один из ответов в качестве стандартного поведения JSF, вы можете изменить web.xml и включить следующее.

<context-param>
   <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
   <param-value>true</param-value>
<context-param>

Это приведет к тому, что структура JSF рассмотрит значения null, которые могут быть предпочтительными, или альтернативу ответу от BalusC.