Nozioni di base sulla convalida di Java Bean

1. Panoramica

In questo rapido tutorial, trattiamo le basi della convalida di un bean Java con il framework standard - JSR 380, noto anche come Bean Validation 2.0 .

La convalida dell'input dell'utente è un requisito estremamente comune nella maggior parte delle applicazioni. E il framework Java Bean Validation è diventato lo standard de facto per la gestione di questo tipo di logica.

2. JSR 380

JSR 380 è una specifica dell'API Java per la convalida dei bean, parte di Jakarta EE e JavaSE. Ciò garantisce che le proprietà di un bean soddisfino criteri specifici, utilizzando annotazioni come @NotNull , @Min e @Max .

Questa versione richiede Java 8 o versioni successive e sfrutta le nuove funzionalità aggiunte in Java 8, come le annotazioni di tipo e il supporto per nuovi tipi come Optional e LocalDate .

Per informazioni complete sulle specifiche, vai avanti e leggi il JSR 380.

3. Dipendenze

Useremo un esempio Maven per mostrare le dipendenze richieste. Ma ovviamente questi barattoli possono essere aggiunti in vari modi.

3.1. API di convalida

Secondo la specifica JSR 380, la dipendenza validation-api contiene le API di convalida standard:

 javax.validation validation-api 2.0.1.Final 

3.2. Validation API Reference Implementation

Hibernate Validator è l'implementazione di riferimento dell'API di convalida.

Per usarlo, dobbiamo aggiungere la seguente dipendenza:

 org.hibernate.validator hibernate-validator 6.0.13.Final  

Una breve nota: hibernate-validator è completamente separato dagli aspetti di persistenza di Hibernate. Quindi, aggiungendolo come dipendenza, non stiamo aggiungendo questi aspetti di persistenza nel progetto.

3.3. Dipendenze del linguaggio di espressione

JSR 380 supporta l'interpolazione delle variabili, consentendo espressioni all'interno dei messaggi di violazione.

Per analizzare queste espressioni, aggiungeremo la dipendenza javax.el da GlassFish, che contiene un'implementazione della specifica Expression Language:

 org.glassfish javax.el 3.0.0 

4. Utilizzo delle annotazioni di convalida

Qui, prenderemo un bean utente e lavoreremo per aggiungervi qualche semplice convalida:

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 } 

Tutte le annotazioni utilizzate nell'esempio sono annotazioni JSR standard:

  • @NotNull convalida che il valore della proprietà annotata non è nullo .
  • @AssertTrue convalida che il valore della proprietà annotata sia vero.
  • @Size convalida che il valore della proprietà annotato abbia una dimensione compresa tra gli attributi min e max ; può essere applicato alle proprietà String , Collection , Map e array.
  • @Min convalida che la proprietà annotata abbia un valore non inferioreall'attributo value .
  • @Max convalida che la proprietà annotata abbia un valore non maggioredell'attributo value .
  • @Email convalida che la proprietà annotata sia un indirizzo di posta elettronica valido.

Alcune annotazioni accettano attributi aggiuntivi, ma l' attributo message è comune a tutti loro. Questo è il messaggio che di solito verrà visualizzato quando il valore della rispettiva proprietà fallisce la convalida.

E alcune annotazioni aggiuntive che possono essere trovate nella JSR:

  • @NotEmpty verifica che la proprietà non sia nulla o vuota; può essere applicato avalori String , Collection , Map o Array .
  • @NotBlank può essere applicato solo a valori di testo e convalida che la proprietà non sia null o spazi.
  • @Positive e @PositiveOrZero si applicano a valori numerici e convalidano che siano strettamente positivi o positivi includendo 0.
  • @Negative e @NegativeOrZero si applicano a valori numerici e convalidano che siano strettamente negativi o negativi incluso 0.
  • @Past e @PastOrPresent convalidano che il valore di una data è nel passato o nel passato, compreso il presente; può essere applicato ai tipi di data, inclusi quelli aggiunti in Java 8.
  • @Future e @FutureOrPresent confermano che il valore di una data è nel futuro o nel futuro compreso il presente.

Le annotazioni di convalida possono essere applicate anche agli elementi di una raccolta :

List preferences;

In questo caso, qualsiasi valore aggiunto all'elenco delle preferenze verrà convalidato.

Inoltre, la specifica supporta il nuovo tipo Opzionale in Java 8:

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

Qui, il framework di convalida scarterà automaticamente il valore LocalDate e lo convaliderà.

5. Convalida programmatica

Alcuni framework, come Spring, hanno modi semplici per attivare il processo di convalida utilizzando semplicemente le annotazioni. Questo principalmente per evitare di interagire con l'API di convalida programmatica.

Ora seguiamo il percorso manuale e impostiamo le cose in modo programmatico:

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

Per convalidare un bean, abbiamo prima bisogno di un oggetto Validator , che viene creato utilizzando ValidatorFactory .

5.1. Definizione del fagiolo

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

Questo articolo si concentrava su un semplice passaggio attraverso l'API di convalida Java standard. Abbiamo mostrato le basi della convalida dei bean utilizzando le annotazioni e le API javax.validation .

Come al solito, un'implementazione dei concetti in questo articolo e tutti i frammenti di codice possono essere trovati su GitHub.