Je fais beaucoup de notre validation avec Hibernate et Spring Annotations comme ceci:
public class Account {
@NotEmpty(groups = {Step1.class, Step2.class})
private String name;
@NotNull(groups = {Step2.class})
private Long accountNumber;
public interface Step1{}
public interface Step2{}
}
Et puis dans le contrôleur, il est appelé dans les arguments:
public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
//some more code and stuff here
return "";
}
Mais je voudrais décider du groupe utilisé en fonction d'une logique de la méthode du contrôleur. Existe-t-il un moyen d'appeler la validation manuellement? Quelque chose comme result = account.validate(Account.Step1.class)
?
Je suis conscient de créer votre propre classe Validator, mais c'est quelque chose que je veux éviter, je préférerais simplement utiliser les annotations sur les variables de classe elles-mêmes.
Aller plus loin que Jaiwo99 dans sa réponse:
// org.springframework.validation.SmartValidator - implemented by
// LocalValidatorFactoryBean, which is funny as it is not a FactoryBean per se (just saying)
@Autowired
SmartValidator validator;
public String saveAccount(@ModelAttribute Account account, BindingResult result) {
// ... custom logic
validator.validate(account, result, Account.Step1.class);
if (result.hasErrors()) {
// ... on binding or validation errors
} else {
// ... on no errors
}
return "";
}
Et le lien obligatoire vers SmartValidator JavaDoc si vous êtes intéressé.
Voici un exemple de code de spécification JSR 3
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Driver driver = new Driver();
driver.setAge(16);
Car porsche = new Car();
driver.setCar(porsche);
Set<ConstraintViolation<Driver>> violations = validator.validate( driver );
Alors oui, vous pouvez simplement obtenir une instance de validateur de la fabrique de valideurs et exécuter la validation vous-même, puis vérifier s'il y a des violations ou non. Vous pouvez voir dans le javadoc pour Validator qu'il acceptera également un tableau de groupes pour valider.
Évidemment, cela utilise la validation JSR-303 directement au lieu de passer par la validation Spring, mais je crois que les annotations de validation Spring utiliseront JSR-303 s'il se trouve dans le chemin de classe
Si tout est correctement configuré, vous pouvez le faire:
@Autowired
Validator validator;
Ensuite, vous pouvez l'utiliser pour valider votre objet.
Et aussi:
@Autowired
@Qualifier("mvcValidator")
Validator validator;
...
violations = validator.validate(account);