[JAVA] [Spring Boot] Verschieben Sie die Validierung (@Validated / @Valid) jederzeit [BeanValidation]

Die Überprüfung wurde mit Spring Boot 2.0.9 durchgeführt.

TL;DR Eine einfache Validierung kann jederzeit mit dem von "Validation.buildDefaultValidatorFactory (). GetValidator ()" von "javax.validation.Validation" erhaltenen "Validator" durchgeführt werden.

Inhalte, die Anmerkungen enthalten, die "@ Autowired" -Validatoren verwenden, können jederzeit validiert werden, indem "@ Autowire" mit "@ Autowire" injiziert wird, um sie abzurufen und zu verwenden.

Konventionelle Art sich zu bewegen

Wenn Sie möchten, dass der Controller das Formular erhält, das Sie validieren möchten, können Sie einen Fehler in BindingResult erhalten, indem Sie folgende Schritte ausführen:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/*Kürzung*/

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody @Validated Form form,
        BindingResult errorResult
) {
    /*Kürzung*/
}

Probleme mit herkömmlichen Methoden

In einigen Fällen möchten Sie möglicherweise jederzeit eine Validierung durchführen, z. B. einen Komponententest oder eine Korrelationsprüfung mit Parametern. In diesem Fall können Sie den Fehler in der oben angegebenen Form nicht validieren und empfangen.

So erhalten Sie "Validator" mit "Validation.buildDefaultValidatorFactory (). GetValidator ()"

Wenn es keinen Grund wie "@ Autowire" gibt, können Sie jederzeit mit "Validator" validieren, das von "Validation.buildDefaultValidatorFactory (). GetValidator ()" von "javax.validation.Validation" erhalten wurde. ..

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

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

/*Kürzung*/

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody Form form
) {
    //Validierungsergebnisse abrufen
    Set<ConstraintViolation<Form>> errorResult =
            Validation.buildDefaultValidatorFactory().getValidator().validate(form);

    /*Kürzung*/
}

Diese Methode kann eine einfache Validierung abdecken. Da diese Methode die Validierung ausführt, ohne Spring zu durchlaufen, gibt es andererseits das Problem, dass die Injektion für selbst erstellte Anmerkungen, die "@ Autowired" sind, nicht funktioniert.

So erhalten Sie "Validator", indem Sie "@ Autowire" injizieren

Wie oben erwähnt, funktioniert die von "Validation.buildDefaultValidatorFactory (). GetValidator ()" erhaltene Validator-Klasse nicht mit der Validator-Klasse, die "@ Autowired" ausführt.

@Beispiel für eine automatisch verdrahtete Validator-Klasse


import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class ExistingIdValidator implements ConstraintValidator<ExistingId,Integer> {
    @Autowired
    public Dao dao;

    @Override
    public boolean isValid(Integer id, ConstraintValidatorContext context) {
        if (id == null) {
            return true;
        }
        return /*Ergebnis der Existenzprüfung für ID mit Dao*/;
    }
}

In diesem Fall funktioniert "@ Autowired" in der Validator-Klasse durch Injizieren von "@ Autowire", um den "Validator" auf der Federseite zu definieren.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.ConstraintViolation;
import javax.validation.Validator;

/*Kürzung*/

//(Ursprünglich sollte das Konstruktormuster injiziert werden.)
@Autowired
public Validator validator; //Javax im Frühjahr definiert.validation.Validator

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody Form form
) {
    //Validierungsergebnisse abrufen
    Set<ConstraintViolation<Form>> errorResult = validator.validate(form);

    /*Kürzung*/
}

Recommended Posts

[Spring Boot] Verschieben Sie die Validierung (@Validated / @Valid) jederzeit [BeanValidation]
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Ändern Sie die Spring Boot-Validierungsnachricht
Spring Boot zum ersten Mal
Erhalten Sie Validierungsergebnisse mit Spring Boot
[Spring Boot] Poste Dateien und andere Daten gleichzeitig [Axios]
Verarbeitung beim Starten einer Anwendung mit Spring Boot
[Einführung in Spring Boot] Überprüfung der Formularvalidierung
DI SessionScope Bean im Spring Boot 2-Filter
Formularklassenvalidierungstest mit Spring Boot
Ändern Sie das Sitzungszeitlimit in Spring Boot