Java Bean Validierungsgrundlagen

Grundlagen der Java Bean-Validierung

1. Überblick

In diesem kurzen Artikel werden wirthe basics of validating a Java bean mit dem Standard-Framework - JSR 380, auch alsBean Validation 2.0. bezeichnet - behandeln

Das Validieren von Benutzereingaben ist natürlich 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.

Weitere Lektüre:

Validierung im Spring Boot

Erfahren Sie, wie Sie Domänenobjekte in Spring Boot mit Hibernate Validator, der Referenzimplementierung des Bean Validation-Frameworks, überprüfen.

Read more

Methodenbeschränkungen mit Bean Validation 2.0

Eine Einführung in Methodeneinschränkungen mit Bean Validation 2.0.

Read more

2. JSR 380

JSR 380 ist eine Spezifikation der Java-API für die Bean-Validierung, Teil von JavaEE und JavaSE, die sicherstellt, dass die Eigenschaften einer Bean bestimmte Kriterien erfüllen, indem Anmerkungen wie@NotNull,@Min und@Max.

Diese Version erfordert Java 8 oder höher und nutzt die in Java 8 hinzugefügten neuen Funktionen wie Typanmerkungen und unterstützt neue Typen wieOptional undLocalDate.

Um vollständige Informationen zu den Spezifikationen zu erhalten, lesen Sie dieJSR 380 durch.

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 Abhängigkeit vonvalidation-apidie Standardvalidierungs-APIs:


    javax.validation
    validation-api
    2.0.0.Final

3.2. Implementierung der Validierungs-API-Referenz

Hibernate Validator ist die Referenzimplementierung der Validierungs-API.

Um es zu verwenden, müssen wir die folgenden Abhängigkeiten hinzufügen:


    org.hibernate.validator
    hibernate-validator
    6.0.2.Final


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

Ein kurzer Hinweis hier ist, dasshibernate-validator is entirely separate from the persistence aspects of Hibernate und durch Hinzufügen als Abhängigkeit diese Persistenzaspekte nicht in das Projekt aufgenommen werden.

3.3. Ausdruckssprachenabhängigkeiten

JSR 380 unterstützt die variable Interpolation und ermöglicht Ausdrücke in den Verletzungsnachrichten.

Um diese Ausdrücke zu analysieren, müssen wir eine Abhängigkeit sowohl von der Ausdruckssprachen-API als auch von einer Implementierung dieser API hinzufügen. GlassFish bietet die Referenzimplementierung:


    javax.el
    javax.el-api
    3.0.0



    org.glassfish.web
    javax.el
    2.2.6

Wenn diese JARs nicht hinzugefügt werden, wird zur Laufzeit eine Fehlermeldung angezeigt (siehe unten):

HV000183: 'javax.el.ExpressionFactory' kann nicht geladen werden. Überprüfen Sie, ob Sie die EL-Abhängigkeiten im Klassenpfad haben, oder verwenden Sie stattdessen ParameterMessageInterpolator

4. Verwenden von Validierungsanmerkungen

Wir werden hier eineUser-Bean als Hauptbeispiel verwenden und daran arbeiten, 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 nichtnull ist

  • @AssertTrue - Überprüft, ob der mit Anmerkungen versehene Eigenschaftswerttrue ist

  • @Size - Überprüft, ob der mit Anmerkungen versehene Eigenschaftswert eine Größe zwischen den Attributenmin undmax hat. kann aufString,Collection,Map und Array-Eigenschaften angewendet werden

  • @Min -vValidiert, dass die mit Anmerkungen versehene Eigenschaft einen Wert hat, der nicht kleiner als das Attributvalue ist

  • @Max - Überprüft, ob die mit Anmerkungen versehene Eigenschaft einen Wert hat, der nicht größer als das Attributvalue ist

  • @Email - Überprüft, ob die mit Anmerkungen versehene Eigenschaft eine gültige E-Mail-Adresse ist

Einige Anmerkungen akzeptieren zusätzliche Attribute, aber das Attributmessageist allen gemeinsam. Dies ist die Nachricht, die normalerweise ausgegeben wird, wenn der Wert der jeweiligen Eigenschaft die Validierung nicht besteht.

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

  • @NotEmpty - überprüft, ob die Eigenschaft nicht null oder leer ist; kann aufString,Collection,Map oderArray Werte angewendet werden

  • @NotBlank - kann nur auf Textwerte angewendet und überprüft werden, dass die Eigenschaft nicht null oder Leerzeichen ist

  • @Positive und@PositiveOrZero - gelten für numerische Werte und bestätigen, dass sie streng positiv oder positiv sind, einschließlich 0

  • @Negative und@NegativeOrZero - gelten für numerische Werte und bestätigen, dass sie streng negativ oder negativ sind, einschließlich 0

  • @Past und@PastOrPresent - bestätigen, dass ein Datumswert in der Vergangenheit oder in der Vergangenheit einschließlich der Gegenwart liegt; kann auf Datumstypen angewendet werden, einschließlich der in Java 8 hinzugefügten

  • *@Future* and *@FutureOrPresent* - bestätigt, dass ein Datumswert in der Zukunft oder in der Zukunft einschließlich der Gegenwart liegt

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

List<@NotBlank String> preferences;

In diesem Fall wird jeder Wert, der der Präferenzliste hinzugefügt wurde, validiert.

Die Spezifikationalso supports the new Optional type in Java 8:

private LocalDate dateOfBirth;

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

Hier wird das Validierungsframework den Wert vonLocalDateautomatisch auspacken und validieren.

5. Programmatische Validierung

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

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

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

Um eine Bean zu validieren, müssen wir zuerst einValidator-Objekt haben, das mit einemValidatorFactory erstellt wird.

5.1. Die Bohne definieren

Wir werden jetzt diesen ungültigen Benutzer einrichten - mit einem Wert von nullname:

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

5.2. Validiere die Bohne

Nachdem wir nun einValidator haben, können wir unsere Bean validieren, indem wir sie an dievalidate-Methode übergeben. Verstöße gegen die im ObjektUser definierten Einschränkungen werden alsSet zurückgegeben.

Set> violations = validator.validate(user);

Durch Durchlaufen der Verstöße können wir alle Verstoßmeldungen mithilfe der MethodegetMessageabrufen.

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

In unserem Beispiel (ifNameIsNull_nameValidationFails) würde die Menge ein einzelnesConstraintViolation mit der Meldung "Name cannot be null" enthalten.

6. Fazit

Dieses Tutorial konzentrierte sich auf einen einfachen Durchlauf durch die Standard-Java-Validierungs-API und veranschaulichte die Grundlagen der Bean-Validierung mithilfe der Annotationen und APIs vonjavax.validation.

Eine Implementierung dieser Konzepte in diesem Artikel finden Sie im GitHub-Projekt. Weitere Funktionen von JSR 380 und Hibernate Validator werden in den kommenden Artikeln vorgestellt.

Alle Codefragmente können inover on GitHub. gefunden werden