59 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Проверка данных — Java & Spring Validation

Валидация бинов в Spring

Spring позволяет проверять формат данных в бинах в декларативном стиле при помощи специальных аннотаций из пакета javax.validation.

Предположим, у нас есть rest-контроллер, в который мы хотим добавить метод, создающий пользователя. Очевидно, что это будет POST-запрос:

На вход метод принимает бин CreateUserRequest, который мы будем передавать в формате json. Этот параметр метода снабжён аннотациями @RequestBody (говорит, что параметр будет именно в теле запроса) и @Valid (аннотация, которая активирует механизм валидации для данного бина). Обратите внимание, что если не указать аннотацию @Valid, то валидация работать не будет.

В случае успеха в ответ на наш запрос мы увидим строку «Success».

Сам бин, представляющий тело запроса, выглядит так:

public class CreateUserRequest <

@NotNull
private String name;

@Past
@NotNull
private LocalDate birthDate;

@Positive
private Integer friendsCount;

@NotNull
@Size (min = 1 , max = 10 )
private List documents;

Здесь представлены основные аннотации, используемые для валидации входных данных.

  • Аннотация @NotNull указывает на обязательность параметра. Если мы такую аннотацию вешаем на числовые типы, то следует использовать именно ссылочные типы, а не примитивные, иначе смысл аннотации теряется. Например, тип int всегда имеет значение по умолчанию, а потому проверка не сработает даже если в теле запроса этот параметр не будет указан. Чтобы отловить эту ситуацию, используйте ссылочный Integer.
  • Аннотация @Past применительно к датам проверяет, что указана уже прошедшая дата. Очевидно, что дата рождения пользователя всегда меньше текущей даты.
  • Аннотация @Positive указывает, что число должно быть положительным. В нашем случае это поле friendsCount, ведь количественные характеристики не могут быть отрицательными. При этом обратите внимание, что у данного поля нет аннотации @NotNull, т.е. оно является необязательным.
  • Аннотация @Size применительно к спискам позволяет задать минимальное и максимальное количество элементов. Очевидно, что у любого человека есть как минимум один документ – паспорт.

Json, который будет передан в теле запроса и который будет удовлетворять всем этим проверкам, может выглядеть так:

Если же мы нарушим хотя бы одно условие, то в ответ получим json с детальным описанием ошибки. Статус ответа будет не 200, а 400 (Bad Request).

Мы рассмотрели основные аннотации, используемые для проверки входных данных. Но все названия этих аннотаций довольно точно описывают их назначение.

Проверка данных формы с помощью аннотаций (@Size, @Email и др) в Spring MVC

Эта статья является продолжением статьи о формах в Spring и о проверке введенных пользователем данных. Будут рассмотрены аннотации, заменяющие валидатор.

Чтобы указать параметры проверки имя пользователя будем использовать следующие аннотации:

Аннотация @Email используется для проверки правильности введенного email’а:

Увы, нет стандартной аннотации, которая проверяет совпадение значений двух полей (в нашем случае – password и confirmPassword). Такую аннотацию мы создадим в следующей статье.

Читать еще:  7 приложений, которые защитят информацию на Android-смартфоне

То есть, окончательный вариант класса SignupForm будет выглядеть следующим образом:

В классе SignupValidator уже нет никакой необходимости, поэтому он исключен из проекта.

Необходимо внести еще одну правку в контроллер SignupController. Так как мы используем аннотации, которые будут проверять значение полей класса, необходимо описать аннотацией @Valid параметр метода SignupForm. Ниже приведен полный листинг класса SignupController:

Остальные файлы проекта остаются без изменений.

В классе SignupForm использовались аннотации из двух пакетов: javax.validation.constraints и org.hibernate.validator.constraints. Рассмотрим остальные аннотации из этих пакетов.

  • AssertFalse – значение аннотированного элемента должно быть false;
  • AssertTrue – значение аннотированного элемента должно быть true;
  • DecimalMax – значением аннотированного элемента должно быть число, которое должно быть меньше или равно указанному максимальному числу;
  • DecimalMin – значением аннотированного элемента должно быть число, которое должно быть меньше или равно указанному минимальному числу;
  • Digits – аннотированный элемент должен быть числом в пределах допустимого диапазона. Поддерживаемые типы: BigDecimal, BigInteger, String, byte, short, int, long и их типы-обертки. null считаются валидным значением;
  • Future – аннотированный элемент должен быть датой в будущем;
  • Max – значением аннотированного элемента должно быть число, которое должно быть меньше или равно указанному максимальному числу;
  • Min – значением аннотированного элемента должно быть число, которое должно быть меньше или равно указанному минимальному числу;
  • NotNull – аннотированный элемент не должен быть null;
  • Null – аннотированный элемент должен быть null;
  • Past – аннотированный элемент должен быть датой в прошлом;
  • Pattern – аннотированный элемент (типа String) должен соответствовать регулярному выражению;
  • Size – аннотированный размер элемента должно быть между заданными границами (границы включены в диапазон).
  • CreditCardNumber – аннотированный элемент должен представлять действительный номер кредитной карты;
  • Email – строка должна быть правильно сформированным адресом электронной почты;
  • Length – длина аннотированной строка должна быть между минимальным и максимальным значением (включительно);
  • NotBlank – аннотированная строка не равна null и не является пустой;
  • NotEmpty – аннотированный элемент типа String, Collection, Map или массив не равен null и не является пустым;
  • Range – аннотированный элемент должен быть в соответствующем диапазоне;
  • URL – аннотированная строка является правильным URL-адресом.

Проверка введенных данных

Этот урок освещает процесс создания web-приложения с поддержкой валидации.

Что вы создадите

Вы создадите простое Spring MVC приложение, которое принимает введенные пользователем данные и проверяет их, используя стандартные аннотации для валидации. Вы также увидите, как отобразить сообщения об ошибке, чтобы пользователь повторно ввел правильные данные.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Gradle 1.11+ или Maven 3.0+
  • Вы также можете импортировать код этого урока, а также просматривать web-страницы прямо из Spring Tool Suite (STS), собственно как и работать дальше из него.

Как проходить этот урок

Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.

Читать еще:  Victoria privileged instruction что делать?

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

  • Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-validating-form-input.git
  • Перейдите в каталог gs-validating-form-input/initial
  • Забегая вперед, создайте объект Person

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-validating-form-input/complete .

Настройка проекта

Для начала вам необходимо настроить базовый скрипт сборки. Вы можете использовать любую систему сборки, которая вам нравится для сборки проетов Spring, но в этом уроке рассмотрим код для работы с Gradle и Maven. Если вы не знакомы ни с одним из них, ознакомьтесь с соответсвующими уроками Сборка Java-проекта с использованием Gradle или Сборка Java-проекта с использованием Maven.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:

Создание файла сборки Gradle

Ниже представлен начальный файл сборки Gradle. Файл pom.xml находится здесь. Если вы используете Spring Tool Suite (STS), то можете импортировать урок прямо из него.

Spring Boot gradle plugin предоставляет множество удобных возможностей:

  • Он собирает все jar’ы в classpath и собирает единое, исполняемое “über-jar”, что делает более удобным выполнение и доставку вашего сервиса
  • Он ищет public static void main() метод, как признак исполняемого класса
  • Он предоставляет встроенное разрешение зависимостей, с определенными номерами версий для соответсвующих Spring Boot зависимостей. Вы можете переопределить на любые версии, какие захотите, но он будет по умолчанию для Boot выбранным набором версий

Создание объекта Person

Приложение включает проверку пользовательских имени и возраста, т. о. ва необходимо создать класс, представляющего человека.

Класс Person имеет два атрибута: name и age . Они помечены несколькими стандартными аннотациями валидации.

  • @Size(min=2, max=30) – длина имени от 2 до 30 символов
  • @NotNull – недопустимость null значения, которое Spring MVC генерирует, если запись пуста
  • @Min(18) – значение должно быть не меньше 18

Создание web контроллера

Теперь, когда вы описали сущность, пришло время создать простой web-контроллер.

Этот контроллер имеет GET и POST методы, оба относятся к / .

Метод showForm возвращает шаблон form . Он включает Person в своей сигнатуре, что позволяет соответствующие атрибуты с Person .

Метод checkPersonInfo принимает два аргумента:

  • person объект помечен как @Valid для получения заполненных атрибутов из формы
  • bindingResult объектом вы можете проверить на ошибки и вернуть их

Вы можете вернуть все атрибуты из формы, связанной с объектом Person . В коде вы проверяете на существование ошибок и, если они есть, то отправляете обратно шаблон form . В данной ситуации все ошибки атрибутов отображены.

Читать еще:  Восстановление файлов

Если все атрибуты верны, то браузер перенаправляет на шаблон results .

Создание HTML формы

Теперь вы создадите “главную” страницу.

Страница содержит простую форму, где каждое поле расположена на отдельной строке таблицы. Форма предназначена на отправку к / . Она представляет person объект, который вы видели в GETметоде в web-контроллере. Форма представляет собой известную bean-backed форму. В ней два поля Person бина, th_field=”*” и th_field=”*” . Следующие за ними поля использованы для отображения любых ошибок валидации.

В итоге, вы нажимаете кнопку “Submit”. Если введенные пользователем имя и возраст противоречат ограничениям @Valid , то ему вернется та же страница, но с отображенными ошибками. Если введенные имя и возраст правильны, то пользователь будет перенаправлен на следующую web-страницу:

Создание Application класса

В этом приложении вы используете язык шаблонов Thymeleaf. Этому приложению необходимо больше, чем просто HTML.

Для активации Spring MVC вы обычно добавляете @EnableWebMvc к Application классу. Но Spring Boot @EnableAutoConfiguration уже добавляет эту аннотацию, когда обнаруживает spring-webmvc в вашем classpath. Это приложение также содержит @ComponentScan , которая находит аннотированные @Controller классы и их методы.

Thymeleaf конфигурация также обнаруживается через @EnableAutoConfiguration : по умолчанию шаблоны расположены в templates/ и определяются как представления без учета суффикса .html в имени файла. Настройки Thymeleaf могут быть изменены и переопределены различными способами в зависимости от вашей задачи, но мы не будет рассматривать это в данном уроке.

Сборка исполняемого JAR

Вы можете собрать единый исполняемый JAR-файл, который содержит все необходимые зависимости, классы и ресурсы. Это делает его легким в загрузке, версионировании и развертывании сервиса как приложения на протяжении всего периода разработки, на различных средах и так далее.

Затем вы можете запустить JAR-файл:

Если вы используете Maven, вы можете запустить приложение, используя mvn spring-boot:run , либо вы можете собрать приложение с mvn clean package и запустить JAR примерно так:

Запуск сервиса

Если вы используете Gradle, вы можете запустить ваш сервис из командной строки:

Как вариант, вы можете запустить ваш сервис напрямую из Gradle примерно так:

Приложение должно быть поднято и запущено через несколько секунд.

Если вы зайдете на http://localhost:8080/, то должны увидеть следующее:

Что будет, если вы введете A для имени и 15 для возраста и нажмете Submit?

Вы увидете это потому, что введенные значения нарушают ограничения в классе Person . Если вы нажмете Submit c пустым значением поля ввода возраста, то получите другую ошибку.

Ели вы введете правильные имя и возраст, то отобразится results страница!

Поздравляем! Вы только что разработали простое web-приложение со встроенной проверкой в объекте. Этим способом вы можете наделить данные соответствующими критериями для корректного ввода пользователем.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: