web-dev-qa-db-fra.com

Appelez manuellement Spring Annotation Validation

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.

32
Ross Hettel

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é.

39
Pavel Horal

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

22
digitaljoel

Si tout est correctement configuré, vous pouvez le faire:

@Autowired
Validator validator;

Ensuite, vous pouvez l'utiliser pour valider votre objet.

7
Jaiwo99

Et aussi:

@Autowired
@Qualifier("mvcValidator")
Validator validator;

...
violations = validator.validate(account);
1
supercobra