Chiamare manualmente Convalida annotazione di spring

Sto facendo molte delle nostre convalide con Hibernate e Spring Annotations in questo modo:

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{} } 

E poi nel controller è chiamato negli argomenti:

 public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) { //some more code and stuff here return ""; } 

Ma vorrei decidere il gruppo utilizzato in base a qualche logica nel metodo del controller. C’è un modo per chiamare manualmente la validazione? Qualcosa come result = account.validate(Account.Step1.class) ?

Sono consapevole di creare la tua class Validator, ma è qualcosa che voglio evitare, preferirei semplicemente usare le annotazioni sulle variabili di class stesse.

Andando un passo oltre Jaiwo99 nella sua risposta:

 // 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 ""; } 

E il link obbligatorio a SmartValidator JavaDoc se sei interessato.

Ecco un esempio di codice dalla specifica JSR 303

 Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Driver driver = new Driver(); driver.setAge(16); Car porsche = new Car(); driver.setCar(porsche); Set> violations = validator.validate( driver ); 

Quindi sì, puoi semplicemente ottenere un’istanza di validazione dalla fabbrica del validatore ed eseguire personalmente la convalida, quindi controllare se ci sono violazioni o meno. Puoi vedere in javadoc per Validator che accetterà anche una serie di gruppi su cui convalidare.

Ovviamente questo usa direttamente la convalida JSR-303 invece di passare alla validazione di Spring, ma credo che le annotazioni di validazione a molla useranno JSR-303 se è presente nel classpath

Se hai configurato tutto correttamente, puoi farlo:

 @Autowired Validator validator; 

Quindi puoi usarlo per convalidare l’object.

E anche:

 @Autowired @Qualifier("mvcValidator") Validator validator; ... violations = validator.validate(account);