Spring MVC中的条件@RequestBody

时间:2015-03-27 15:17:20

标签: java json spring spring-mvc servlets

我有一个简单的Spring MVC控制器,它返回一个Model和View。这非常有效。 但现在我们正在转向纯REST架构,其中服务器仅通过JSON进行通信。

我试图尽可能多地重新使用现有的控制器,而不是改造一切,而这就是我能做的事情

我可以通过添加 ContentNegotiatingViewResolver GET 请求重用到相同的控制器。所以现在同一个控制器可以返回一个jsp和一个基于接受头转换为json 的模型。

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

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

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

总结一下我的问题:

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

2 个答案:

答案 0 :(得分:1)

查看consumes属性的produces@RequestMapping属性。您可以使用不同consume s的相同方法的两个版本,其中一个可以采用@RequestBody而另一个则不采用。{/ p>

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

答案 1 :(得分:0)

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

显然,您要检查标题或其他方式是否使用默认绑定。

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