将自定义验证错误放入BindingResult

时间:2019-03-25 16:40:06

标签: java spring validation spring-mvc model-view-controller

我正试图从我的Spring Controllers中删除重复的代码,特别是-从许多函数的开始就不再需要执行validateator.validate(form,bindingResult)。

我有一些类具有实现Spring的验证器接口的相应验证器类。我四处搜寻以寻找答案,但找不到与之真正匹配的答案。

具有注释属性的人员表单类的片段

public class Person {

   @Size(min=1, message="Name missing")
   private String name;
   @Size(min=1, message="Age missing")
   private String age;

   .... getters and setters etc.

人员验证器类

@Component
public class PersonValidator implements Validator {

@Override
public boolean supports(Class<?> clazz) {
    return Person.class.isAssignableFrom(clazz);
} 

@Override
public void validate(Object target, Errors errors) {
        errors.reject("No sir!");
    }
}

理想情况下,我希望能够使BindingResult中包含所有错误,包括来自Validator类的错误。因此,当我使用@Validated批注时,我的BindingResult会完全填充来自简单批注和自定义验证程序的所有错误。

期望的结果

@RequestMapping(value="/save", method=RequestMethod.POST)

public @ResponseBody String save(@Validated @RequestBody Person personForm, BindingResult bindingResult, HttpServletRequest request) 
{

    bindingResult.getAllErrors(); <-- fully pop with annotation and custom validator errors

代替:

@RequestMapping(value="/save", method=RequestMethod.POST)

public @ResponseBody String save(@Validated @RequestBody Person personForm, BindingResult bindingResult, HttpServletRequest request) 
{

    personValidator.validate(person, bindingResult) <-- Populate bindingResult with customer validator errors, if any

    bindingResult.getAllErrors(); 

有人能分享任何精巧的例子来解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要将验证器添加到数据绑定器,多个验证器才能工作。在您的代码中添加@InitBinder方法并将PersonValidator添加到WebDataBinder

@InitBinder("personForm")
public void initBinder(WebDataBinder wdb) {
  wdb.addValidators(personValidator);
}

将验证器绑定到personForm模型对象。

这将配置一个全局规则,该验证器将应用于所有绑定/转换。如果要将其限制为特定模型,则可以在@InitBinder中指定模型的名称。

@InitBinder
public void initBinder(WebDataBinder wdb) {
  wdb.addValidators(personValidator);
}

答案 1 :(得分:0)

作为可能的解决方案,您可以定义自己的自定义注释和 CustomConstraintValidator ,以实现接口ConstraintValidator<A extends Annotation, T>. 最后,BindingResult将包含默认验证程序和您的自定义验证程序错误。
Here是一个很好的例子。如果我当然正确地理解了您的问题。