将JSR-303验证错误转换为Spring的BindingResult

Ant*_*eev 10 java validation spring spring-mvc bean-validation

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

@Autowired
private javax.validation.Validator validator;

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

是否可以映射errors到Spring的BindingResult对象而无需手动完成所有错误并将其添加到BindingResult?像这样的东西:

// NOTE: this is imaginary code
BindingResult bindingResult = BindingResult.fromConstraintViolations(errors);
Run Code Online (Sandbox Code Playgroud)

我现在可以用CustomForm参数注释@Valid并让Spring注入BindingResult另一个方法的参数,但在我的情况下它不是一个选项.

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

Bij*_*men 9

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

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

@Autowired @Qualifier("jsr303Validator") Validator validator;
Run Code Online (Sandbox Code Playgroud)

有了这个抽象,你可以这样使用验证器,传入bindingResult:

validator.validate(obj, bindingResult);
Run Code Online (Sandbox Code Playgroud)

  • 我没有看到接受BindingResult的方法验证 (3认同)
  • 如果您没有看到接受绑定结果的validate方法,则表示您的Validator验证程序是javax.validation.Validator.将它更改为org.springframework.validation.Validator,你会没事的.无需更改bean定义. (2认同)

Kri*_*aan 5

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

SpringValidatorAdapter springValidator = new SpringValidatorAdapter(validator);
BindingResult bindingResult= new BeanPropertyBindingResult(myBeanToValidate, "myBeanName");
springValidator.validate(myBeanToValidate, bindingResult);
Run Code Online (Sandbox Code Playgroud)

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