Я хотел бы знать, каков самый чистый и лучший способ выполнить проверку формы пользовательских данных. Я видел, как некоторые разработчики реализуют org.springframework.validation.Validator
. Вопрос об этом: я видел, что это подтверждает класс. Должен ли класс заполняться вручную значениями из пользовательского ввода, а затем передаваться в валидатор?
Меня смущает самый чистый и лучший способ проверки ввода пользователя. Я знаю о традиционном методе использования request.getParameter()
и последующей проверки вручную nulls
, но я не хочу делать всю проверку в моем Controller
. Некоторые полезные советы в этой области будут с благодарностью. Я не использую Hibernate в этом приложении.
java
spring-mvc
validation
user-input
devdar
источник
источник
Ответы:
В Spring MVC существует 3 различных способа проверки: с помощью аннотации, вручную или их сочетанием. Не существует единственного «самого чистого и лучшего» способа проверки, но, вероятно, есть такой, который лучше соответствует вашему проекту / проблеме / контексту.
Давайте иметь пользователя:
Способ 1. Если у вас есть Spring 3.x + и простая проверка, используйте
javax.validation.constraints
аннотации (также известные как аннотации JSR-303).Вам понадобится поставщик JSR-303 в ваших библиотеках, например Hibernate Validator, который является эталонной реализацией (эта библиотека не имеет ничего общего с базами данных и реляционным отображением, она просто выполняет проверку :-).
Тогда в вашем контроллере у вас будет что-то вроде:
Обратите внимание на @Valid: если пользователь имеет нулевое имя, result.hasErrors () будет true.
Метод 2: Если у вас сложная проверка (например, логика проверки крупного бизнеса, условная проверка в нескольких полях и т. Д.) Или по какой-то причине вы не можете использовать метод 1, используйте ручную проверку. Хорошей практикой является отделение кода контроллера от логики проверки. Не создавайте свой класс (ы) валидации с нуля, Spring предоставляет удобный
org.springframework.validation.Validator
интерфейс (начиная с Spring 2).Так скажем, у вас есть
и вы хотите выполнить некоторую «сложную» проверку, например: если возраст пользователя не достиг 18 лет, значение параметраiableUser не должно быть равным нулю, а возраст пункта ответственного пользователя должен быть более 21 года.
Вы будете делать что-то вроде этого
Тогда в вашем контроллере вы будете иметь:
Если есть ошибки проверки, result.hasErrors () будет true.
Примечание. Вы также можете установить валидатор в методе @InitBinder контроллера с помощью «binder.setValidator (...)» (в этом случае смешанное использование методов 1 и 2 будет невозможно, поскольку вы заменяете значение по умолчанию). валидатор). Или вы можете создать его в конструкторе контроллера по умолчанию. Или имейте @ Component / @ Service UserValidator, который вы вводите (@Autowired) в свой контроллер: очень полезно, потому что большинство валидаторов являются одиночными + пересмешивание модульного теста становится проще + ваш валидатор может вызывать другие компоненты Spring.
Метод 3: Почему бы не использовать комбинацию обоих методов? Проверяйте простые вещи, такие как атрибут «имя», с помощью аннотаций (это быстро, сжато и более читабельно). Сохраняйте тяжелые проверки для валидаторов (когда для написания пользовательских сложных аннотаций валидации потребуются часы или просто когда невозможно использовать аннотации). Я сделал это на предыдущем проекте, он работал как шарм, быстро и легко.
Внимание: вы не должны ошибка обработки проверки для обработки исключений . Прочтите этот пост, чтобы узнать, когда их использовать.
Ссылки :
источник
Существует два способа проверки ввода пользователя: аннотации и наследование класса Spring Validator. Для простых случаев аннотации хороши. Если вам нужны сложные проверки (например, проверка по нескольким полям, например, поле «проверить адрес электронной почты»), или если ваша модель проверена в нескольких местах в вашем приложении с другими правилами, или если у вас нет возможности изменить свой Чтобы смоделировать объект, разместив на нем аннотации, Validator, основанный на наследовании, является подходящим вариантом. Я покажу примеры обоих.
Фактическая часть проверки одинакова независимо от того, какой тип проверки вы используете:
Если вы используете аннотации, ваш
Foo
класс может выглядеть так:Аннотации выше являются
javax.validation.constraints
аннотациями. Вы также можете использовать Hibernateorg.hibernate.validator.constraints
, но не похоже, что вы используете Hibernate.В качестве альтернативы, если вы реализуете Spring Validator, вы бы создали класс следующим образом:
Если вы используете вышеупомянутый валидатор, вам также нужно привязать валидатор к контроллеру Spring (не обязательно, если используются аннотации):
Также см. Spring Docs .
Надеюсь, это поможет.
источник
Foo
параметром в методе обработчика. Вы можете уточнить?Я хотел бы расширить хороший ответ Джерома Дальберта. Я нашел очень легко написать свои собственные валидаторы аннотаций в JSR-303. Вы не ограничены проверкой "одного поля". Вы можете создать свою собственную аннотацию на уровне типа и пройти сложную проверку (см. Примеры ниже). Я предпочитаю этот способ, потому что мне не нужно смешивать разные типы валидации (Spring и JSR-303), как это делает Джером. Кроме того, эти валидаторы "Spring осведомлены", так что вы можете использовать @ Inject / @ Autowire из коробки.
Пример проверки пользовательского объекта:
Пример равенства общих полей:
источник
ElementType.METHOD
в@Target
.Если у вас одинаковая логика обработки ошибок для разных обработчиков методов, то вы получите множество обработчиков со следующим шаблоном кода:
Предположим, вы создаете сервисы RESTful и хотите вернуться
400 Bad Request
вместе с сообщениями об ошибках для каждого случая ошибки проверки. Тогда часть обработки ошибок будет одинаковой для каждой конечной точки REST, требующей проверки. Повторяя эту же самую логику в каждом обработчике не так DRY МОГ!Одним из способов решения этой проблемы является отбрасывание сразу
BindingResult
после каждого компонента, подлежащего проверке. Теперь ваш обработчик будет выглядеть так:Таким образом, если связанный бин не был действительным,
MethodArgumentNotValidException
Spring будет выброшен. Вы можете определить,ControllerAdvice
что обрабатывает это исключение с той же логикой обработки ошибок:Вы все еще можете исследовать лежащие в основе с
BindingResult
использованиемgetBindingResult
методаMethodArgumentNotValidException
.источник
Найти полный пример Spring Mvc Validation
источник
Поместите этот компонент в ваш класс конфигурации.
и тогда вы можете использовать
для проверки бина вручную. Тогда вы получите все результаты в BindingResult, и вы можете получить оттуда.
источник