validator mvc example custom bindingresult bean java spring hibernate validation spring-mvc

java - example - spring mvc validation bindingresult



Manualmente llame a Spring Annotation Validation (4)

Estoy haciendo mucha validación con Hibernate y Spring Annotations, así:

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

Y luego en el controlador se llama en los argumentos:

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

Pero me gustaría decidir el grupo utilizado en función de cierta lógica en el método del controlador. ¿Hay alguna manera de llamar la validación manualmente? Algo como result = account.validate(Account.Step1.class) ?

Soy consciente de crear tu propia clase Validator, pero eso es algo que quiero evitar, preferiría simplemente usar las anotaciones en las variables de clase.


Aquí hay un ejemplo de código de la especificación JSR 303

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

Así que sí, puede obtener una instancia de validador de la fábrica del validador y ejecutar la validación usted mismo, luego verifique si hay violaciones o no. Puede ver en el javadoc for Validator que también aceptará una matriz de grupos para validar.

Obviamente, esto usa la validación JSR-303 directamente en lugar de pasar por la validación de Spring, pero creo que las anotaciones de validación de primavera usarán JSR-303 si se encuentra en el classpath


Si tiene todo configurado correctamente, puede hacer esto:

@Autowired Validator validator;

Entonces puedes usarlo para validar tu objeto.


Y también:

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


Yendo un paso más allá de Jaiwo99 en su respuesta:

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

Y el enlace obligatorio a SmartValidator JavaDoc si está interesado.