Question
I'm doing a lot of our validation with Hibernate and Spring Annotations like so:
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{}
}
And then in the controller it's called in the arguments:
public String saveAccount(@ModelAttribute @Validated({Account.Step1.class}) Account account, BindingResult result) {
//some more code and stuff here
return "";
}
But I would like to decide the group used based on some logic in the
controller method. Is there a way to call validation manually? Something like
result = account.validate(Account.Step1.class)
?
I am aware of creating your own Validator class, but that's something I want to avoid, I would prefer to just use the annotations on the class variables themselves.
Answer
Spring provides [LocalValidatorFactoryBean](https://docs.spring.io/spring-
framework/docs/current/javadoc-
api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html),
which implements the Spring
[SmartValidator
](https://docs.spring.io/spring/docs/current/javadoc-
api/org/springframework/validation/SmartValidator.html) interface as well as
the Java Bean Validation
Validator
interface.
// org.springframework.validation.SmartValidator - implemented by LocalValidatorFactoryBean
@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 "";
}