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 @ 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