Основи за проверка на Java Bean

1. Общ преглед

В този бърз урок ние обхващаме основите на валидирането на Java боб със стандартната рамка - JSR 380, известна също като Bean Validation 2.0 .

Проверката на въведеното от потребителя е супер често срещано изискване в повечето приложения. И рамката за проверка на Java Bean се превърна в де факто стандарт за работа с този вид логика.

2. JSR 380

JSR 380 е спецификация на Java API за валидиране на боб, част от Jakarta EE и JavaSE. Това гарантира, че свойствата на боб отговарят на специфични критерии, като се използват анотации като @NotNull , @Min и @Max .

Тази версия изисква Java 8 или по-нова версия и се възползва от новите функции, добавени в Java 8, като анотации на типове и поддръжка за нови типове като Optional и LocalDate .

За пълна информация относно спецификациите продължете и прочетете JSR 380.

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

Ще използваме пример на Maven, за да покажем необходимите зависимости. Но разбира се, тези буркани могат да се добавят по различни начини.

3.1. API за проверка

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

 javax.validation validation-api 2.0.1.Final 

3.2. Прилагане на справка за API за проверка

Hibernate Validator е референтната реализация на API за валидиране.

За да го използваме, трябва да добавим следната зависимост:

 org.hibernate.validator hibernate-validator 6.0.13.Final  

Бърза бележка: валидаторът на хибернация е напълно отделен от аспектите на устойчивост на хибернацията. Така че, добавяйки го като зависимост, ние не добавяме тези аспекти на устойчивост в проекта.

3.3. Изразяване на езикови зависимости

JSR 380 поддържа променлива интерполация, позволяваща изрази в съобщенията за нарушение.

За да анализираме тези изрази, ще добавим зависимостта javax.el от GlassFish, която съдържа изпълнение на спецификацията на езика на израза:

 org.glassfish javax.el 3.0.0 

4. Използване на валидационни анотации

Тук ще вземем потребителски боб и ще работим върху добавянето на няколко прости проверки към него:

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 потвърждава, че коментираната стойност на свойството не е нула .
  • @AssertTrue потвърждава, че коментираната стойност на свойството е вярна.
  • @Size проверява, че коментираната стойност на свойството има размер между атрибутите min и max ; може да се приложи къмсвойства String , Collection , Map и array.
  • @Min проверява, че коментираното свойство има стойност не по-малка отатрибута стойност .
  • @Max проверява, че коментираното свойство има стойност не по-голяма отатрибута стойност .
  • @Email потвърждава, че анотираното свойство е валиден имейл адрес.

Някои пояснения приемат допълнителни атрибути, но атрибутът на съобщението е общ за всички тях. Това е съобщението, което обикновено се извежда, когато стойността на съответното свойство не успее да бъде проверена.

И някои допълнителни пояснения, които могат да бъдат намерени в JSR:

  • @NotEmpty проверява, че свойството не е пусто или празно; може да се приложи към стойности String , Collection , Map или Array .
  • @NotBlank може да се приложи само към текстови стойности и потвърждава, че свойството не е null или празно пространство.
  • @Positive and @PositiveOrZero apply to numeric values and validate that they are strictly positive, or positive including 0.
  • @Negative and @NegativeOrZero apply to numeric values and validate that they are strictly negative, or negative including 0.
  • @Past and @PastOrPresent validate that a date value is in the past or the past including the present; can be applied to date types including those added in Java 8.
  • @Future and @FutureOrPresent validate that a date value is in the future, or in the future including the present.

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

List preferences;

In this case, any value added to the preferences list will be validated.

Also, the specification supports the new Optional type in Java 8:

private LocalDate dateOfBirth; public Optional getDateOfBirth() { return Optional.of(dateOfBirth); }

Here, the validation framework will automatically unwrap the LocalDate value and validate it.

5. Programmatic Validation

Some frameworks — such as Spring — have simple ways to trigger the validation process by just using annotations. This is mainly so that we don't have to interact with the programmatic validation API.

Now let's go the manual route and set things up programmatically:

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

To validate a bean, we first need a Validator object, which is built using a ValidatorFactory.

5.1. Defining the Bean

We're now going to set up this invalid user — with a null name value:

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

5.2. Validate the Bean

Now that we have a Validator, we can validate our bean by passing it to the validate method.

Any violations of the constraints defined in the User object will be returned as a Set:

Set
    
      violations = validator.validate(user); 
    

By iterating over the violations, we can get all the violation messages using the getMessage method:

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

In our example (ifNameIsNull_nameValidationFails), the set would contain a single ConstraintViolation with the message “Name cannot be null”.

6. Conclusion

Тази статия се фокусира върху просто преминаване през стандартния API за проверка на Java. Показахме основите на валидирането на компоненти, използвайки анотации и API на javax.validation .

Както обикновено, изпълнение на концепциите в тази статия и всички кодови фрагменти могат да бъдат намерени в GitHub.