【问题标题】:Conditional @RequestBody in Spring MVCSpring MVC 中的条件 @RequestBody
【发布时间】:2015-05-31 23:38:47
【问题描述】:

我有一个普通的 Spring MVC 控制器,它返回一个模型和视图。这很好用。 但现在我们正在转向纯 REST 架构,服务器仅通过 JSON 进行通信。

我没有改造所有东西,而是尽可能多地重复使用现有的控制器,这就是我能做的

我可以通过包含 ContentNegotiatingViewResolver 来重用对相同控制器的 GET 请求。所以现在同一个控制器可以返回一个jsp和一个模型转换成json基于accept header

现在另一部分是 POST 请求,我需要一些帮助。

要绑定 json 请求,我必须在现有控制器上使用 @RequestBody,但我想以与 GET 请求相同的方式有条件地执行此操作。 因此,如果接受标头是 json,它应该使用该消息转换器来绑定模型,否则使用通常的 html 表单绑定。

完成后,如何为我的场景处理 BindingResult 对象?

总结一下我的问题:

  1. 我们能否根据 Accept 标头有条件地使用 @RequestBody
  2. 是否有任何配置可以自动将您的表单绑定错误对象(在 Spring MVC 控制器内)转换为基于 Accept 标头的 json 响应。

【问题讨论】:

  • 旁注:与 JSON 通信不会使架构成为 RESTful。
  • 您是否正在寻找像 javacodegeeks.com/2013/07/… 这样的自定义转换器?
  • 假设您对 JSON 和 url-form-encoded 数据使用相同的 POJO,Spring 足够聪明,可以在给定请求的适当内容类型的情况下使用 @RequestBody 转换 JSON 和表单数据.检查注册的HttpMessageConverter 实例。

标签: java json spring spring-mvc servlets


【解决方案1】:

查看@RequestMapping 属性的consumesproduces 属性。您可以使用不同的consumes 来使用相同方法的两个版本,其中一个可以采用@RequestBody,而另一个则不能。

对于问题的第二部分无法真正帮助您,抱歉。

【讨论】:

    【解决方案2】:

    要处理 POST 请求,您需要自定义 AbstractHttpMessageConverterModelAttributeMethodProcessor。 如果控制器使用请求参数 (@RequestParam),您需要 MessageConverter 来处理使用请求正文 (@RequestBody) 的控制器和 ModelAttributeMethodProcessor 来处理验证。

    显然你会想要检查一个标题或其他东西做默认绑定。

    我回答了different question about validating immutable objects,但同样的方法也适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2014-04-01
      • 2020-06-02
      • 2021-04-25
      • 1970-01-01
      相关资源
      最近更新 更多