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.
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*/
}
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.
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.
Validator en l'injectant avec @ AutowireComme 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