Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spring validation with @Valid

I'm validating incoming attribute, but the validator catches even the other pages not annotated with @Valid

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

When I access page /showMatches.spr I get the error 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,
The validator doesn't accept it, but I don`t want it to validate! By this validator:

 protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new Validator() {
  // etc.
}
like image 765
ryskajakub Avatar asked Sep 15 '10 19:09

ryskajakub


1 Answers

Spring isn't going to validate your IdCommand, but WebDataBinder doesn't allow you to set a validator that doesn't accept the bean being bound.

If you use @InitBinder, you can explicitly specify the name of the model attribute to be bound by each WebDataBinder (otherwise your initBinder() method is applied to all attributes), as follows:

@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(...);
}
like image 150
axtavt Avatar answered Sep 27 '22 23:09

axtavt