如何在Spring MVC的@RequestBody参数中使用@Valid?

时间:2011-05-25 18:46:25

标签: spring validation data-binding spring-mvc bean-validation

我在@Valid上的处理程序方法的参数上使用@Controller时遇到问题。我的代码如下所示:

@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)

其中Widget是我的一个域对象的类。我正在使用@RequestBody注释来指示请求的有效负载映射到widget(在我的测试中,请求是JSON,尽管Jackson在我的类路径上,所以我也可以使用XML)。

如您所见,BindingResult参数紧跟在Widget参数之后,但我收到以下错误:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

如何将@Valid注释应用于@RequestBody参数,然后获得结果?

P.S。我正在使用annotation-driven来处理控制器的连线,进行内容协商等。

2 个答案:

答案 0 :(得分:9)

您使用的是Spring 3.1吗?它是Spring 3.1版中新增的功能。请参阅Validation For @RequestBody Method Arguments

答案 1 :(得分:2)

这是春季3.0中的问题,它在3.1 M2中修复。

https://jira.springsource.org/browse/SPR-6709

如果您使用的是Spring 3.0,基于一些线程和大量阅读,这是解决此问题的最佳方法。面向方面的方法,以便我们可以在将其升级到修复此问题的spring版本时退出。

拦截对使用@RequestMapping注释的方法的调用以及对其具有@Valid注释的每个参数的方面,调用方面中的相应验证器。