У меня есть что-то подобное в форме создания / редактирования:
<h:selectOneMenu value="#{bean.value}" required="true" ... >
<f:selectItem itemLabel="-- Select --" itemValue=""/>
<f:selectItems .../>
</h:selectOneMenu>
В случае создания нового объекта проверка required
работает, как и ожидалось.
В объекте редактированияВ случае, если я изменяю действительное значение на заполнитель "- Выбрать -", я получаю ошибку проверки с ожидаемым обязательным сообщением, потому что itemValue пусто (""); однако , HTML <select>
возвращается к любой опции, уже выбранной из компонента, вместо сохранения недопустимого пользовательского ввода при отправке формы.
Чтобы повторить, required=true
наh:selectOneMenu
сам по себе работает нормально, генерируя ожидаемое сообщение - единственное, что неправильно, это значение, возвращающееся к значению компонента, вместо сохранения пустого переданного значения.(Я подтвердил с помощью панели инструментов разработчика Chrome, что пустая строка действительно отправляется для <select>
.)
Почему это происходит?Точнее, почему h:selectOneMenu
не ведет себя как h:inputText
, где UIInput отображает неверный пользовательский ввод из формы и не обновляет его значение из компонента?Оба эти элемента управления расширяют один и тот же базовый класс UIInput и реализуют EditableValueHolder, поэтому я ожидаю, что их жизненный цикл будет вести себя одинаково.
Кроме того, чтобы уточнить, у меня нет параметра контекста INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
где-либо в файле web.xml.,
Это приложение JSF для Mojarra 2.1.3 / Glassfish 3.1.1.