Основы валидации Java Bean

Основы валидации Java Bean

1. обзор

В этой быстрой статье мы рассмотримthe basics of validating a Java bean со стандартной структурой - JSR 380, также известной какBean Validation 2.0..

Проверка пользовательского ввода - это, конечно, супер распространенное требование в большинстве приложений, и платформа Java Bean Validation стала стандартом де-факто для обработки этого вида логики.

Дальнейшее чтение:

Проверка в весенней загрузке

Узнайте, как проверять доменные объекты в Spring Boot с помощью Hibernate Validator, эталонной реализации инфраструктуры Bean Validation.

Read more

Ограничения метода с проверкой бина 2.0

Введение в ограничения метода с использованием Bean Validation 2.0.

Read more

2. JSR 380

JSR 380 - это спецификация Java API для проверки bean-компонентов, часть JavaEE и JavaSE, которая обеспечивает соответствие свойств bean-компонента определенным критериям, используя такие аннотации, как@NotNull,@Min и@Maxс.

Эта версия требует Java 8 или выше и использует преимущества новых функций, добавленных в Java 8, таких как аннотации типов, и поддерживает новые типы, такие какOptional иLocalDate.

Чтобы получить полную информацию о технических характеристиках, прочтитеJSR 380.

3. зависимости

Мы собираемся использовать пример Maven, чтобы показать необходимые зависимости, но, конечно, эти jar-файлы можно добавлять разными способами.

3.1. API проверки

Согласно спецификации JSR 380, зависимостьvalidation-api содержит стандартные API проверки:


    javax.validation
    validation-api
    2.0.0.Final

3.2. Реализация справочника API валидации

Hibernate Validator - это эталонная реализация API проверки.

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


    org.hibernate.validator
    hibernate-validator
    6.0.2.Final


    org.hibernate.validator
    hibernate-validator-annotation-processor
    6.0.2.Final

Замечу, чтоhibernate-validator is entirely separate from the persistence aspects of Hibernate, и, добавляя его как зависимость, мы не добавляем эти аспекты персистентности в проект.

3.3. Зависимости языка выражений

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

Чтобы разобрать эти выражения, мы должны добавить зависимость как от API языка выражений, так и от реализации этого API. GlassFish предоставляет эталонную реализацию:


    javax.el
    javax.el-api
    3.0.0



    org.glassfish.web
    javax.el
    2.2.6

Если эти JAR-файлы не добавлены, вы получите сообщение об ошибке во время выполнения, как показано ниже:

HV000183: невозможно загрузить javax.el.ExpressionFactory. Убедитесь, что у вас есть зависимости EL от пути к классам, или используйте вместо этого ParameterMessageInterpolator

4. Использование аннотаций проверки

Мы будем использовать bean-компонентUser в качестве основного примера и поработаем над добавлением к нему простой проверки:

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;

public class User {

    @NotNull(message = "Name cannot be null")
    private String name;

    @AssertTrue
    private boolean working;

    @Size(min = 10, max = 200, message
      = "About Me must be between 10 and 200 characters")
    private String aboutMe;

    @Min(value = 18, message = "Age should not be less than 18")
    @Max(value = 150, message = "Age should not be greater than 150")
    private int age;

    @Email(message = "Email should be valid")
    private String email;

    // standard setters and getters
}

Все аннотации, используемые в примере, являются стандартными аннотациями JSR:

  • @NotNull - подтверждает, что значение аннотированного свойства неnull

  • @AssertTrue - подтверждает, что значение аннотированного свойстваtrue

  • @Size - подтверждает, что значение аннотированного свойства имеет размер между атрибутамиmin иmax; может применяться кString,Collection,Map и свойствам массива

  • @Min -v Подтверждает, что аннотированное свойство имеет значение не меньше атрибутаvalue

  • @Max - проверяет, что аннотированное свойство имеет значение не больше атрибутаvalue

  • @Email - проверяет, что аннотированное свойство является действительным адресом электронной почты

Некоторые аннотации принимают дополнительные атрибуты, но атрибутmessage является общим для всех из них. Это сообщение, которое обычно выводится, когда значение соответствующего свойства не проходит проверку.

Некоторые дополнительные аннотации, которые можно найти в JSR:

  • @NotEmpty - проверяет, что свойство не является пустым или пустым; может применяться к значениямString,Collection,Map илиArray

  • @NotBlank - может применяться только к текстовым значениям и подтверждать, что свойство не является нулем или пробелом

  • @Positive и@PositiveOrZero - применяются к числовым значениям и подтверждают, что они строго положительные или положительные, включая 0

  • @Negative и@NegativeOrZero - применяются к числовым значениям и подтверждают, что они строго отрицательные или отрицательные, включая 0

  • @Past и@PastOrPresent - подтверждают, что значение даты в прошлом или в прошлом, включая настоящее; может применяться к типам дат, включая добавленные в Java 8

  • *@Future* and *@FutureOrPresent* - подтверждает, что значение даты находится в будущем или в будущем, включая настоящее

The validation annotations can also be applied to elements of a collection:

List<@NotBlank String> preferences;

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

Спецификацияalso supports the new Optional type в Java 8:

private LocalDate dateOfBirth;

public Optional<@Past LocalDate> getDateOfBirth() {
    return Optional.of(dateOfBirth);
}

Здесь среда проверки автоматически развернет значениеLocalDate и проверит его.

5. Программная проверка

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

Давайте теперь перейдем к ручному маршруту и ​​настроим все программно:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Чтобы проверить bean-компонент, мы должны сначала иметь объектValidator, который создается с использованиемValidatorFactory.

5.1. Определение бобов

Теперь мы собираемся настроить этого недопустимого пользователя с нулевым значениемname:

User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);

5.2. Проверить бин

Теперь, когда у нас естьValidator, мы можем проверить наш bean-компонент, передав его методуvalidate. Любые нарушения ограничений, определенных в объектеUser, будут возвращены какSet.

Set> violations = validator.validate(user);

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

for (ConstraintViolation violation : violations) {
    log.error(violation.getMessage());
}

В нашем примере (ifNameIsNull_nameValidationFails) набор будет содержать единственныйConstraintViolation с сообщением «Name cannot be null».

6. Заключение

В этом руководстве основное внимание уделяется простому прохождению стандартного API проверки Java и показаны основы проверки компонентов с помощью аннотаций и APIjavax.validation.

Реализация этой концепции в этой статье можно найти в проекте GitHub. В следующих статьях мы расскажем о дополнительных функциях JSR 380 и Hibernate Validator.

Все фрагменты кода можно найтиover on GitHub.