手动调用Spring Annotation Validation

我正在使用Hibernate和Spring Annotations进行大量validation,如下所示:

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

然后在控制器中调用它:

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

但我想根据控制器方法中的一些逻辑来决定使用的组。 有没有办法手动调用validation? 像result = account.validate(Account.Step1.class)

我知道创建自己的Validator类,但这是我想要避免的,我宁愿只使用类变量本身的注释。

在回答中比Jaiwo99更进一步:

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

如果您有兴趣,可以链接到SmartValidator JavaDoc 。

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

所以,是的,您可以从validation器工厂获取validation器实例并自行运行validation,然后检查是否存在违规。 您可以在javadoc中看到Validator它还将接受要validation的组数组。

显然,这直接使用JSR-303validation而不是通过Springvalidation,但我相信如果在类路径中找到弹簧validation注释将使用JSR-303

如果您已正确配置所有内容,则可以执行以下操作:

 @Autowired Validator validator; 

然后,您可以使用它来validation您的对象。

并且:

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