Статьи

Валидация Java Bean: validateProperty () и validateValue () за три минуты

Хотя это не очень широко известно, Java Bean Validation поставляется с методами validateProperty()validateValue()до их назначения.

Я предполагаю, что у вас уже есть хотя бы базовые знания о том, как использовать стандарт для проверки объектов, но если вы хотите получить более глубокое понимание того, как это работает, смело проверяйте мою предыдущую статью , в которой я взял подробное описание основных функций Bean Validation.

Выборочная проверка ограничений на уровне поля

В типичном случае использования класс домена с ограничениями, подобный следующему, будет проверен за один шаг с реализацией Bean Validation, такой как Hibernate Validator .

 public class User {

    @NotEmpty(message = "Name may not be empty")
    @Size(min = 2, max = 32,
            message = "Name must be between 2 and 32 characters long")
    private String name;

    @NotEmpty(message = "Email may not be empty")
    @Email(message = "Email must be a well-formed email address")
    private String email;

    public User(){}

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // setters and getters for name / email

}

Но с помощью validateProperty()validateValue()

Метод validateProperty()

Рассмотрим ситуацию, когда вы просто хотите проверить определенное поле более раннего класса User В таком случае вы можете использовать метод validateProperty()

 User user = new User("", "[email protected]");
validator
        .validateProperty(user, "name")
        .stream()
        .forEach(violation -> System.out.println(violation.getMessage()))

Здесь будет нарушено ограничение, поскольку в качестве значения для поля name

В той же строке поле email

 User user = new User("", "[email protected]");
validator
        .validateProperty(user, "email")
        .stream()
        .forEach(violation -> System.out.println(violation.getMessage()))

Это не приведет к нарушению, потому что "[email protected]" Тот факт, что имя все еще пусто, не имеет значения, потому что вызов validateProperty(user, "email")email

Метод validateValue()

Как мы только что увидели, метод validateProperty() Потенциальным недостатком этого метода является то, что должен быть создан экземпляр целевого класса и присвоено значение полю, что делает весь код проверки немного раздутым.

Чтобы избежать этого, то же самое можно сделать без необходимости создания такого экземпляра с помощью метода validateValue() Он вызывается с ограниченным классом (сам Classне его экземпляр), именем свойства компонента и рассматриваемым значением:

 validator
         .validateValue(User.class, "name", "")
         .stream()
         .forEach(violation -> System.out.println(violation.getMessage()));

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

Практически то же самое можно сделать с каждым ограниченным полем класса. В двух словах это показывает, что Bean Validation можно использовать для проверки полей целевого класса, следуя более избирательной стратегии.

Используйте validateProperty () и validateValue () для мгновенной проверки бина Java

Резюме

Как мы только что узнали, вызов validateProperty() Вызов его аналога validateValue()экземпляр не требуется ), именем поля и значением будет проверять, является ли значение допустимым для этого поля.

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

Конечно, выборочная проверка поля класса является лишь верхушкой айсберга, когда дело доходит до использования API Bean Validation, поскольку в стандартную комплектацию входит множество других полезных функций, которые стоит посмотреть. Имейте в виду, что Java Bean Validation развивается довольно быстрыми темпами, поэтому обязательно проверяйте официальные документы и будьте в курсе последних новостей .