[JAVA] [Spring Boot] Validation du déplacement (@Validated / @Valid) à tout moment [BeanValidation]

La vérification a été effectuée avec Spring Boot 2.0.9.

TL;DR Une validation simple peut être effectuée à tout moment en utilisant Validator obtenu par Validation.buildDefaultValidatorFactory (). GetValidator () ʻof javax.validation.Validation`.

Le contenu qui implique des annotations utilisant des validateurs «@ Autowired» peut être validé à tout moment en injectant «@ Autowire» avec «@ Autowire» pour l'obtenir et l'utiliser.

Manière conventionnelle de se déplacer

Si vous souhaitez que le contrôleur reçoive le formulaire que vous souhaitez valider, vous pouvez recevoir une erreur dans BindingResult en procédant comme suit:

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;

/*réduction*/

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody @Validated Form form,
        BindingResult errorResult
) {
    /*réduction*/
}

Problèmes avec les méthodes conventionnelles

Dans certains cas, vous souhaiterez peut-être effectuer une validation à tout moment, comme un test unitaire ou une vérification de corrélation avec des paramètres. Dans ce cas, vous ne pourrez pas valider et recevoir l'erreur sous la forme de l'exemple donné ci-dessus.

Comment obtenir Validator avec Validation.buildDefaultValidatorFactory (). GetValidator ()

S'il n'y a pas de raison telle que @ Autowire, vous pouvez valider à tout moment en utilisant Validator obtenu parValidation.buildDefaultValidatorFactory (). GetValidator ()of javax.validation.Validation. ..

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;

/*réduction*/

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody Form form
) {
    //Obtenez les résultats de la validation
    Set<ConstraintViolation<Form>> errorResult =
            Validation.buildDefaultValidatorFactory().getValidator().validate(form);

    /*réduction*/
}

Cette méthode peut couvrir une simple validation. D'un autre côté, puisque cette méthode exécute la validation sans passer par Spring, il y a un problème que l'injection ne fonctionne pas pour les annotations faites par vous-même que @ Autowired.

Comment obtenir Validator en l'injectant avec @ Autowire

Comme mentionné ci-dessus, la classe de validation obtenue par Validation.buildDefaultValidatorFactory (). GetValidator () ne fonctionne pas avec la classe de validation qui exécute @ Autowired.

@Exemple de classe de validateur à câblé automatiquement


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 /*Résultat du contrôle d'existence pour l'ID à l'aide de Dao*/;
    }
}

Dans ce cas, @ Autowired dans la classe du validateur fonctionne en injectant @ Autowire pour obtenir le Validator défini du côté Spring.

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;

/*réduction*/

//(À l'origine, il devrait être injecté avec le modèle de constructeur)
@Autowired
public Validator validator; //Javax défini au printemps.validation.Validator

@PostMapping("/api/test-post-api")
public void editRelayStructs(
        @RequestBody Form form
) {
    //Obtenez les résultats de la validation
    Set<ConstraintViolation<Form>> errorResult = validator.validate(form);

    /*réduction*/
}

Recommended Posts

[Spring Boot] Validation du déplacement (@Validated / @Valid) à tout moment [BeanValidation]
Comment modifier la valeur de paramètre de application.properties au moment du démarrage dans Spring Boot
Modifier le message de validation Spring Boot
Spring Boot pour la première fois
Obtenez des résultats de validation avec Spring Boot
[Spring Boot] Publiez des fichiers et d'autres données en même temps [Axios]
Traitement lors du démarrage d'une application avec Spring Boot
[Introduction à Spring Boot] Vérification de la validation du formulaire
DI SessionScope Bean dans le filtre Spring Boot 2
Test de validation de classe de formulaire avec Spring Boot
Modifier le délai d'expiration de la session dans Spring Boot