How do I use @Valid with Spring MVC's @RequestBody parameters?
Solution 1
Are you using Spring 3.1? It is a newly added feature in Spring version 3.1. Please see Validation For @RequestBody Method Arguments
Solution 2
This is an issue in spring 3.0 and it is fixed in 3.1 M2.
https://jira.springsource.org/browse/SPR-6709
If you are using spring 3.0, based on some threads and extensive reading, here is the best approach for this problem. An aspect oriented approach so that we can back out when you upgrade it to the version of spring which fixes this issue.
An aspect which intercepts calls to method which uses @RequestMapping annotation and for each parameter which has @Valid annotation on it, call the corresponding validator in the aspect.
Hank Gay
I like to spend time with my lovely wife, our two beautiful daughters, and our dog. I'm also a fan of geek humor, and I've been known to flip out and write code… elegant code, if I'm really lucky.
Updated on July 10, 2020Comments
-
Hank Gay almost 4 years
I'm having an issue with using
@Valid
on a parameter to a handler method on my@Controller
. My code looks like this:@RequestMapping(value=BIBBLE_BOBBLE_URI_PATTERN + "/widgets", method=RequestMethod.POST) @ResponseBody @ResponseStatus(HttpStatus.CREATED) public Widget saveNewWidget( @PathVariable final String username, @PathVariable final String bibbleBobbleName, @Valid @RequestBody final Widget widget, final BindingResult results, final HttpServletRequest request, final HttpServletResponse response)
where
Widget
is the class for one of my domain objects. I'm using the@RequestBody
annotation to indicate that the payload of the request maps towidget
(in my tests, the requests are JSON, though Jackson is on my classpath so I could also use XML).As you can see, the
BindingResult
parameter follows directly after theWidget
parameter, but I get the following error:java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
How do I apply the
@Valid
annotation to a@RequestBody
parameter and then get the results?P.S. I'm using
annotation-driven
to handle wiring up the controllers, do content-negotiation, etc. -
Hank Gay almost 13 yearsThis is welcome news indeed, but I'm stuck on 3.0.5 at least until 3.1 goes final. Thanks for the pointer, though.
-
finneycanhelp over 12 years3.1 is final / released/ out in the wild now. :)
-
NimChimpsky about 12 yearsThe link just says annotate with "@valid" and "@requestbody", but I get the same error and am using 3.1 :-(
-
Ritesh about 12 yearsplease see blog.42.nl/articles/…