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.