[JAVA] Einfache Eingabeprüfung mit Bean Validation!

1. Zuallererst

Dieses Mal möchte ich die Methode zur Eingabeprüfung mit "Bean Validation" erläutern.

2. Vorbereitung der Bibliothek

Fügen Sie den Abhängigkeiten die erforderlichen Bibliotheken hinzu. javax.el wird ebenfalls hinzugefügt, da es für die Nachrichtenauflösung von Hibernate-Validator benötigt wird. Die Bean-Validierungsbibliothek (groupId: javax.validation, artefaktId: validation-api) wird nicht beschrieben, aber automatisch zur Abhängigkeit hinzugefügt, da sie eine Abhängigkeit aufweist.

pom.xml


  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.9.Final</version>
  </dependency>
  <dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b09</version>
  </dependency>

3. Modelldefinition

Definieren Sie die zu prüfende Modellklasse. Zu diesem Zeitpunkt wird eine Anmerkung hinzugefügt, die jeder Prüfung entspricht. Die folgenden drei Arten von Anmerkungen können hinzugefügt werden.

Einige Überprüfungen erfordern ein Limit, z. B. "@ Max", das die maximale Anzahl begrenzt. Dies wird jedoch als Attribut der Anmerkung festgelegt. Die Attribute, die festgelegt werden können, unterscheiden sich für jede Anmerkung. Wenn Sie die Meldung ändern möchten, die angezeigt wird, wenn die Prüfung fehlschlägt, überschreiben Sie sie mit dem Attribut "Nachricht". Die im Attribut "Nachricht" festgelegte Nachricht hat die höchste Priorität.

Book.java


package com.example.beanvalidation.app;

import java.io.Serializable;
import java.util.Date;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

public class Book implements Serializable {

    private static final long serialVersionUID = 1L;

    @NotNull
    // @Pattern(regexp = "[0-9,-]+")
    @Pattern(regexp = "[0-9,-]+", message = "Wert eingegeben${validatedValue}Ist falsch. Bitte geben Sie im ISBM-Format ein.")
    private String isbn;

    @NotNull
    @Size(max = 200)
    private String title;

    @Max(9999)
    @Min(1)
    private int pageCount;

    @NotNull
    @Past
    private Date publishedDate;

    // constructor, setter, getter omitted
}

4. Ändern Sie die Fehlermeldung

Bean Validation ist eine Fehlermeldung für die Spezifikation, die von der Implementierungsbibliothek abhängt. In diesem Fall ist die von "Hibernate-Validator" definierte Nachricht die Standardeinstellung.

_ja.


# javax.validation.constraints.Past.message=* Eigenschaftsschlüssel: FQCN.message of annotation * Eigenschaftswert: Inhalt der Standardnachricht Dieses Mal möchte ich die Standardnachricht von "@ Past" ändern. ValidationMessagesproperties (für Japanisch) direkt unter dem Klassenpfad Eingetragenes Datum${validatedValue}Ist falsch. Bitte geben Sie ein vergangenes Datum ein.
javax.validation.constraints.Past.message=\u5165\u529B\u3055\u308C\u305F\u65E5\u4ED8 ${validatedValue} \u306F\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002\u904E\u53BB\u65E5\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002

(Hinweis)

5. Grundlegende Verwendung

Ich möchte verschiedene Werte für die oben definierte "Buch" -Klasse festlegen und tatsächlich eine Eingabeprüfung durchführen. Es ist üblich, "Validator" zu injizieren, wenn ein DI-Container verwendet wird. Diesmal verwenden wir jedoch eine normale Java-Anwendung mit einer "main" -Methode. Die Verwendung von "Validator" ist jedoch dieselbe.

ValidationDemo.java


package com.example.beanvalidation.app;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

public class ValidationDemo {

    public static void main(String[] args) {
        // 1. create validator
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        // 2. create target object
        Book book = createBook();

        // 3. validate
        Set<ConstraintViolation<Book>> constraintViolations = validator
                .validate(book);

        // 4. check result
        int errorCount = constraintViolations.size();
        System.out.println("validate error count : " + errorCount);
        if (errorCount > 0) {
            showErrorDetails(constraintViolations);
        }

        System.out.println("=== demo : validate error ===");
        
        // 2. create target object
        book = createNgBook();

        // 3. validate
        constraintViolations = validator.validate(book);

        // 4. check result
        errorCount = constraintViolations.size();
        System.out.println("validate error count : " + errorCount);
        if (errorCount > 0) {
            showErrorDetails(constraintViolations);
        }
    }

    private static <T> void showErrorDetails(
            Set<ConstraintViolation<T>> constraintViolations) {
        for (ConstraintViolation<T> violation : constraintViolations) {
            System.out.println("----------");
            System.out.println(
                    "MessageTemplate : " + violation.getMessageTemplate());
            System.out.println("Message : " + violation.getMessage());
            System.out.println("InvalidValue : " + violation.getInvalidValue());
            System.out.println("PropertyPath : " + violation.getPropertyPath());
            System.out.println("RootBeanClass : " + violation.getRootBeanClass());
            System.out.println("RootBean : " + violation.getRootBean());
        }
    }

    private static Book createBook() {
        Date publishedDate = Date.from(LocalDateTime.of(2017, 7, 21, 0, 0, 0)
                .toInstant(ZoneOffset.ofHours(9)));
        return new Book("978-4798142470",
                "Eine gründliche Einführung in die Entwicklung von Spring Java-Anwendungen mit dem Spring Framework", 744,
                publishedDate);
    }

    private static Book createNgBook() {
        Date publishedDate = Date.from(LocalDateTime.of(2999, 7, 21, 0, 0, 0)
                .toInstant(ZoneOffset.ofHours(9)));
        return new Book("ERROR-ISBN-9999", null, 0, publishedDate);
    }
}

6. Ausführungsergebnis (Bonus)

Als Referenz wird das Ergebnis der Ausführung des obigen Programms unten gezeigt.

Ausführungsergebnis


validate error count : 0
=== demo : validate error ===
validate error count : 4
----------
MessageTemplate : {javax.validation.constraints.Min.message}
Message : must be greater than or equal to 1
InvalidValue : 0
PropertyPath : pageCount
RootBeanClass : class com.example.beanvalidation.app.Book
RootBean : Book [isbn=ERROR-ISBN-9999, title=null, pageCount=0, publishedDate=Sun Jul 21 00:00:00 JST 2999]
----------
MessageTemplate : {javax.validation.constraints.Past.message}
Message :Eingetragen am Sonntag, 21. Juli 00:00:00 JST 2999 ist falsch. Bitte geben Sie ein vergangenes Datum ein.
InvalidValue : Sun Jul 21 00:00:00 JST 2999
PropertyPath : publishedDate
RootBeanClass : class com.example.beanvalidation.app.Book
RootBean : Book [isbn=ERROR-ISBN-9999, title=null, pageCount=0, publishedDate=Sun Jul 21 00:00:00 JST 2999]
----------
MessageTemplate : {javax.validation.constraints.NotNull.message}
Message : must not be null
InvalidValue : null
PropertyPath : title
RootBeanClass : class com.example.beanvalidation.app.Book
RootBean : Book [isbn=ERROR-ISBN-9999, title=null, pageCount=0, publishedDate=Sun Jul 21 00:00:00 JST 2999]
----------
MessageTemplate :Wert eingegeben${validatedValue}Ist falsch. Bitte geben Sie im ISBM-Format ein.
Message :Eingegebener Wert FEHLER-ISBN-9999 ist falsch. Bitte geben Sie im ISBM-Format ein.
InvalidValue : ERROR-ISBN-9999
PropertyPath : isbn
RootBeanClass : class com.example.beanvalidation.app.Book
RootBean : Book [isbn=ERROR-ISBN-9999, title=null, pageCount=0, publishedDate=Sun Jul 21 00:00:00 JST 2999]

7. Schließlich

Dieses Mal habe ich erklärt, wie man die Eingabe durch "Bean Validation" überprüft. Ich denke, es ist einfach und leicht zu verstehen, da Sie die Spezifikationen für die Eingabeprüfung definieren können, indem Sie einfach eine Prüfanmerkung hinzufügen.

Recommended Posts

Einfache Eingabeprüfung mit Bean Validation!
Bean Validation mit Micronaut (Java) hinzufügen
Erstellen Sie Ihren eigenen Validator mit Bean Validation
Überprüfung der Eingabe der Telefonnummer
[Java] Korrelationsprüfung, ohne selbst eine Anmerkung mit Bean Validation zu erstellen
Validierung von JSON mit JSON-Schema
Selbstgemachte Validierung mit Spring
(Java) Einfache BDD mit Spektrum?
Einfacher Mikroservice mit Spark Framework!
Bean-Mapping mit MapStruct Teil 1
Überprüfen Sie die Einhaltung objektorientierter Übungen
Überprüfen Sie den CSV-Wert mit RSpec
Prozessvalidierungsnachricht mit Decorator
Bean-Mapping mit MapStruct Teil 3
Bean-Mapping mit MapStruct Teil 2
Wie man ganze Zahlen mit Rubin überprüft
Einfaches Web-Scraping mit Jsoup
Einfache Bibliothekseinführung mit Maven!
Spannende Umweltprüfung mit mkmf