【问题标题】:How do I use @Valid with Spring MVC's @RequestBody parameters?如何将 @Valid 与 Spring MVC 的 @RequestBody 参数一起使用?
【发布时间】:2011-09-02 00:36:01
【问题描述】:

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

@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 参数,然后得到结果?

附:我正在使用annotation-driven 来处理控制器的接线、进行内容协商等。

【问题讨论】:

  • 我还在学习这一切,但是,尝试将属性命名为@ModelAttribute("xyz") Widget widget
  • @DecaniBass 将解决它不绑定我在@craftsman 答案的评论中提到的任何数据的问题吗?
  • 我知道它是一个旧的 POST,但它对你有用吗?我正在使用 Spring 3.2。绑定有效,但不是@Valid。此处发布的问题 [stackoverflow.com/q/16174990/668650]
  • 从控制器方法中移除参数final BindingResult results,
  • 如果您在 Spring Boot 中使用 Kotlin,那么您必须在各个字段上使用 @field:Email@field:NotNull 等,以确保 @Valid 有效。有关信息,请按照以下方式:stackoverflow.com/questions/36515094/…

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


【解决方案1】:

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

【讨论】:

  • 这确实是个好消息,但至少在 3.1 最终版本之前,我仍然坚持使用 3.0.5。不过,感谢您的指点。
  • 3.1 是最终版 / 已发布 / 现已正式发布。 :)
  • 链接只是说用“@valid”和“@requestbody”注释,但我得到同样的错误,我正在使用 3.1 :-(
【解决方案2】:

这是 spring 3.0 中的一个问题,在 3.1 M2 中已修复。

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

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

一个切面拦截对使用@RequestMapping注解的方法的调用,并且对于每个带有@Valid注解的参数,调用切面中的相应验证器。

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 2018-06-16
    • 2021-04-25
    • 2022-01-17
    • 2011-05-26
    • 1970-01-01
    • 2013-08-20
    • 2021-12-09
    相关资源
    最近更新 更多