使用@Valid进行弹簧验证

时间:2010-09-15 19:31:23

标签: spring spring-mvc validation

我正在验证传入的属性,但验证程序甚至会捕获未使用@Valid注释的其他页面

 @RequestMapping(value = "/showMatches.spr", method = RequestMethod.GET)
    public ModelAndView showMatchPage(@ModelAttribute IdCommand idCommand) 
//etc

当我访问页面/showMatches.spr时,我收到错误org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Invalid target for Validator [cz.domain.controller.Controllers$1@4c25d793]: cz.domain.controller.IdCommand@486c1af3,确认者不接受,但我不想让它验证!通过这个验证器:

 protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new Validator() {
  // etc.
}

1 个答案:

答案 0 :(得分:24)

Spring不会验证您的IdCommand,但WebDataBinder不允许您设置不接受绑定bean的验证程序。

如果您使用@InitBinder,则可以显式指定要由每个WebDataBinder绑定的模型属性的名称(否则您的initBinder()方法将应用于所有属性),如下所示:

@RequestMapping(...)
public ModelAndView showMatchPage(@ModelAttribute IdCommand idCommand) { ... }

@InitBinder("idCommand")
protected void initIdCommandBinder(WebDataBinder binder) {
    // no setValidator here, or no method at all if not needed
    ...
}

@RequestMapping(...)
public ModelAndView saveFoo(@ModelAttribute @Valid Foo foo) { ... }

@InitBinder("foo")
protected void initFooBinder(WebDataBinder binder) {
    binder.setValidator(...);
}