Валидатор пропускается при удалении ввода в клиенте - это согласно спецификации JSF?
У меня есть страница с компонентом ввода текста, помеченным как required="true"
и имея обычай Validator
на стороне сервера.
Теперь, как клиент, я отправляю страницу без HTML-элемента, отображаемого этим компонентом (это можно легко сделать, удалив элемент из дерева DOM с помощью встроенного в браузер инспектора элементов DOM). Форма успешно отправлена без проверки на сервере этого обязательного компонента.
Это согласно спецификации JSF? Есть ли способ указать, что валидаторы на странице должны выполняться, даже если опубликованная страница не содержит их?
1 ответ
Это согласно спецификации. Вот выдержка из UIInput#validate()
Javadoc:
Получить представленное значение с
getSubmittedValue()
, Если это вернетсяnull
, выход без дальнейшей обработки. (Это указывает на то, что для этого компонента не было представлено никакого значения.)
Пустой ввод отправит пустую строку, а не null
, Полное отсутствие ввода отправит null
, не пустая строка.
Вредно это или нет, зависит от бизнес-логики. Прилично разработанная модель (бизнес-логика и / или модель данных), которая не учитывает null
как и ожидалось, исключение пустого указателя в другом месте или нарушение ограничения SQL (NOT NULL
), который обычно заканчивается сообщением об ошибке HTTP 500. Но если модель действительно учитывает null
как ожидаемый случай, то это, вероятно, ошибка в модели. Представление (страница JSF), предназначенное просто для представления модели, может затем мало что сделать против нее.
Если бизнес-логика или модель данных действительно не могут быть изменены, чтобы рассмотреть null
как исключительный случай (т.е. никогда не принимайте / не принимайте данное значение как null
), и вы используете JPA, тогда вам лучше всего добавить @NotNull
на имущество. Хотя JSF будет обходить проверку, JPA будет проверять ее, вызывая исключение и ошибку HTTP 500. В этом случае я бы только удивился, почему столбец БД не имеет NOT NULL
ограничение на первом месте. В качестве альтернативы, сделайте проверку на уровне класса.
Следует отметить, что MyFaces регистрирует предупреждение, как показано ниже:
16 марта 2016 г. 8:55:52 org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
ВНИМАНИЕ: всегда должно быть переданное значение для ввода, если оно отображается, его форма отправляется, и он не был изначально отключен или доступен только для чтения. Вы не можете отправить форму после отключения элемента ввода через JavaScript. Вместо этого рассмотрите возможность установки значения "только для чтения" на true или сброса отключенного значения обратно на false до отправки формы.
Компонент: {Component-Path: [Класс: javax.faces.component.UIViewRoot,ViewId: /test.xhtml][Class: javax.faces.component.html.HtmlBody,Id: j_id_5][Класс: javax.faces.component.html.HtmlForm,Id: j_id_6][Класс: javax.faces.component.html.HtmlInputText,Id: j_id_7] Расположение: /test.xhtml в строке 22 и столбце 33}