将 JSR-303 验证错误转换为 Spring 的绑定结果

我在Spring控制器中有以下代码:

@Autowired
private javax.validation.Validator validator;

@RequestMapping(value = "/submit", method = RequestMethod.POST)
public String submitForm(CustomForm form) {
    Set<ConstraintViolation<CustomForm>> errors = validator.validate(form);
    ...
}

是否可以映射到Spring的对象,而无需手动检查所有错误并将它们添加到?像这样:errorsBindingResultBindingResult

// NOTE: this is imaginary code
BindingResult bindingResult = BindingResult.fromConstraintViolations(errors);

我知道可以用参数注释参数,并让Spring注入作为另一个方法的参数,但在我的情况下,这不是一个选项。CustomForm@ValidBindingResult

// I know this is possible, but doesn't work for me
public String submitForm(@Valid CustomForm form, BindingResult bindingResult) {
    ...
}

答案 1

一种更简单的方法可能是使用Spring的抽象来代替,您可以通过在上下文中包含此bean来获得验证器:org.springframework.validation.Validator

<bean id="jsr303Validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

@Autowired @Qualifier("jsr303Validator") Validator validator;

完成此抽象后,您可以通过这种方式使用验证程序,传入绑定Result:

validator.validate(obj, bindingResult);

答案 2

Spring使用SpringValidatorAdapter将javax.validation.ConstraintViolation对象转换为ObjectError或FieldError对象,如绑定结果所示。然后,BindStatus使用消息源(如Web应用程序上下文本身)来转换错误。简而言之,您可以执行以下操作:

SpringValidatorAdapter springValidator = new SpringValidatorAdapter(validator);
BindingResult bindingResult= new BeanPropertyBindingResult(myBeanToValidate, "myBeanName");
springValidator.validate(myBeanToValidate, bindingResult);

这在编写单元测试时更容易,因为您甚至不需要创建Spring上下文。


推荐