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);