我正试图从我的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();
有人能分享任何精巧的例子来解决这个问题吗?
谢谢!
答案 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是一个很好的例子。如果我当然正确地理解了您的问题。