Grundlagen der Java Bean-Validierung

1. Übersicht

In diesem kurzen Tutorial werden die Grundlagen der Validierung einer Java-Bean mit dem Standard-Framework JSR 380, auch als Bean Validation 2.0 bezeichnet, behandelt .

Die Überprüfung von Benutzereingaben ist in den meisten Anwendungen eine sehr häufige Anforderung. Und das Java Bean Validation Framework ist zum De-facto-Standard für den Umgang mit dieser Art von Logik geworden.

2. JSR 380

JSR 380 ist eine Spezifikation der Java-API für die Bean-Validierung, Teil von Jakarta EE und JavaSE. Dadurch wird sichergestellt, dass die Eigenschaften einer Bean mithilfe von Anmerkungen wie @NotNull , @Min und @Max bestimmten Kriterien entsprechen .

Diese Version erfordert Java 8 oder höher und nutzt die in Java 8 hinzugefügten neuen Funktionen wie Typanmerkungen und Unterstützung für neue Typen wie Optional und LocalDate .

Ausführliche Informationen zu den Spezifikationen finden Sie im JSR 380.

3. Abhängigkeiten

Wir werden ein Maven-Beispiel verwenden, um die erforderlichen Abhängigkeiten zu zeigen. Aber natürlich können diese Gläser auf verschiedene Arten hinzugefügt werden.

3.1. Validierungs-API

Gemäß der JSR 380-Spezifikation enthält die Validierungs-API- Abhängigkeit die Standard-Validierungs-APIs:

 javax.validation validation-api 2.0.1.Final 

3.2. Implementierung der Validierungs-API-Referenz

Hibernate Validator ist die Referenzimplementierung der Validierungs-API.

Um es zu verwenden, müssen wir die folgende Abhängigkeit hinzufügen:

 org.hibernate.validator hibernate-validator 6.0.13.Final  

Ein kurzer Hinweis: Der Hibernate-Validator ist völlig unabhängig von den Persistenzaspekten von Hibernate. Indem wir es als Abhängigkeit hinzufügen, fügen wir diese Persistenzaspekte nicht in das Projekt ein.

3.3. Ausdruckssprachenabhängigkeiten

JSR 380 unterstützt die Interpolation von Variablen und erlaubt Ausdrücke innerhalb der Verstoßnachrichten.

Um diese Ausdrücke zu analysieren, fügen wir die Abhängigkeit javax.el von GlassFish hinzu, die eine Implementierung der Ausdruckssprachenspezifikation enthält:

 org.glassfish javax.el 3.0.0 

4. Verwenden von Validierungsanmerkungen

Hier nehmen wir eine User- Bean und arbeiten daran, ihr eine einfache Validierung hinzuzufügen:

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 } 

Alle im Beispiel verwendeten Anmerkungen sind Standard-JSR-Anmerkungen:

  • @NotNull überprüft , ob der mit Anmerkungen versehene Eigenschaftswert nicht null ist .
  • @AssertTrue überprüft , ob der mit Anmerkungen versehene Eigenschaftswert wahr ist.
  • @Size überprüft , ob der mit Anmerkungen versehene Eigenschaftswert eine Größe zwischen den Attributen min und max hat . kann auf dieEigenschaften String , Collection , Map und Arrayangewendetwerden.
  • @Min bestätigtdass die kommentierte Eigenschaft einen Wert nicht kleiner als der hat Wert Attribut.
  • @Max bestätigtdass die kommentierte Eigenschaft einen Wert nicht größer als der hat Wert Attribut.
  • @Email überprüft , ob die mit Anmerkungen versehene Eigenschaft eine gültige E-Mail-Adresse ist.

Einige Anmerkungen akzeptieren zusätzliche Attribute, aber das Nachrichtenattribut ist allen gemeinsam. Dies ist die Nachricht, die normalerweise gerendert wird, wenn der Wert der jeweiligen Eigenschaft nicht überprüft werden kann.

Und einige zusätzliche Anmerkungen, die im JSR zu finden sind:

  • @NotEmpty überprüft , ob die Eigenschaft nicht null oder leer ist. kann auf String- , Collection- , Map- oder Array- Werteangewendetwerden.
  • @NotBlank kann nur auf Textwerte angewendet werden und überprüft, ob die Eigenschaft nicht null oder Leerzeichen ist.
  • @Positive und @PositiveOrZero gelten für numerische Werteund überprüfen , ob sie streng positiv oder positiv sind, einschließlich 0.
  • @Negative und @NegativeOrZero gelten für numerische Werteund überprüfen , ob sie streng negativ oder negativ sind, einschließlich 0.
  • @Past und @PastOrPresent bestätigen, dass ein Datumswert in der Vergangenheit oder in der Vergangenheit liegt, einschließlich der Gegenwart. kann auf Datumstypen angewendet werden, einschließlich der in Java 8 hinzugefügten.
  • @Future und @FutureOrPresent bestätigen, dass ein Datumswert in der Zukunft oder in der Zukunft einschließlich der Gegenwart liegt.

Die Validierungsanmerkungen können auch auf Elemente einer Sammlung angewendet werden :

List preferences;

In diesem Fall wird jeder Wert, der der Voreinstellungsliste hinzugefügt wird, überprüft.

Die Spezifikation unterstützt auch den neuen optionalen Typ in Java 8:

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

Hier entpackt das Validierungsframework den LocalDate- Wert automatisch und validiert ihn.

5. Programmatische Validierung

Einige Frameworks - wie z. B. Spring - bieten einfache Möglichkeiten, den Validierungsprozess nur mithilfe von Anmerkungen auszulösen. Dies dient hauptsächlich dazu, dass wir nicht mit der programmatischen Validierungs-API interagieren müssen.

Gehen wir nun den manuellen Weg und richten die Dinge programmgesteuert ein:

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

Um eine Bean zu validieren, benötigen wir zunächst ein Validator- Objekt, das mit einer ValidatorFactory erstellt wird .

5.1. Die Bohne definieren

Wir werden jetzt diese ungültigen Benutzer einzurichten - mit einem Null - Name - Wert:

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

5.2. Validiere die Bohne

Nachdem wir einen Validator haben , können wir unsere Bean validieren, indem wir sie an die validate- Methode übergeben.

Verstöße gegen die im Benutzerobjekt definierten Einschränkungen werden als Set zurückgegeben :

Set
    
      violations = validator.validate(user); 
    

Durch Durchlaufen der Verstöße können wir alle Verstoßmeldungen mit der Methode getMessage abrufen :

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

In unserem Beispiel ( ifNameIsNull_nameValidationFails ) würde die Menge eine einzelne ConstraintViolation mit der Meldung "Name darf nicht null sein" enthalten.

6. Fazit

Dieser Artikel konzentrierte sich auf einen einfachen Durchlauf durch die Standard-Java-Validierungs-API. Wir haben die Grundlagen der Bean-Validierung mithilfe von Annotationen und APIs von javax.validation gezeigt .

Wie üblich finden Sie eine Implementierung der Konzepte in diesem Artikel und aller Codefragmente auf GitHub.