2013-02-15 81 views
7

我在春天控制器下面的代码:转换JSR-303验证错误Spring的BindingResult

@Autowired 
private javax.validation.Validator validator; 

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

是否有可能errors映射到Spring的BindingResult对象没有通过所有的错误,手动去,并将它们添加到BindingResult?事情是这样的:

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

我现在就可以注释CustomForm参数与@Valid并让Spring注入BindingResult作为另一种方法的参数,但它不是我的情况选择。

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

回答

8

更简单的方法可以是使用Spring的抽象org.springframework.validation.Validator相反,您可以通过上下文有这个bean得到验证的保持:

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

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

有了这个抽象的地方,你可以使用验证这种方式,传递你的bindingResult:

validator.validate(obj, bindingResult); 
+0

谢谢!这绝对更简洁。 – 2013-02-15 11:35:06

+3

我看不到接受BindingResult的方法验证 – gstackoverflow 2015-04-13 23:04:43

+1

如果您没有看到接受绑定结果的validate方法,则表示您的Validator验证程序是javax.validation.Validator。将其更改为org.springframework.validation.Validator,你会没事的。无需更改bean定义。 – Icegras 2016-12-08 15:52:56

0

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上下文这种情况很容易。