Handling JSON and form data request with Spring MVC
我正在开发简单的SpringMVC应用程序,我喜欢新的SpringRest功能。我想使用相同的方法来处理常规表单和JSON数据。不过,这似乎有点棘手。例如,方法
1
| public @ResponseBody String process(@RequestBody Bean bean); |
将适用于JSON请求(内容类型:application/json),以及
1
| public @ResponseBody String process(Bean bean); |
号
将请求与内容类型匹配:application/x-www-form-urlencoded。
这些方法显然会有几乎相同的内容,所以我宁愿避免这种重复。对于Jersey,使用@Consumes注释是可能的,但我不知道如何使用Spring。
- 这些方法的返回类型是什么?我认为您需要在@responseBody注释后指定一个"type",或者至少是void?
- 哦,对不起,错过了回程类型。事实上,它们是无关的。似乎,Spring通过参数来匹配请求。
首先,上面的声明不会编译,因为您有重复的签名。
顺便说一句,我认为@Consumes没有帮助,因为它只指定了该方法可以处理的内容类型。
在Spring中,可以使用
1
| @RequestMapping(headers="Content-Type=application/json") |
- @消费是为了泽西,对不起误会。感谢您对编译的评论,但这些签名只是为了演示。我真正需要的是不要有不同的JSON和表单数据处理方法,这在SpringMVS中似乎是不可能的。
- @在泽西岛有什么可能?我已经展示了消费的等价物——它是"头"。但在泽西岛怎么办呢?您可以指定该方法处理这两种内容类型(您在Spring中也可以这样做),然后呢?
- 然后适当的messagebodyreader实现将解码请求。所以这只是提供者的问题(在泽西岛)。你的意思是用一种方法处理几个内容类型是不可能的?
- @我在问你怎么做。我对JAX-R做得很少。
- 啊,我明白了。我用@consumes("application/json"、"application/xml"、"application/form")来注释方法,这意味着这个方法可以处理所有三种类型的请求。
- @rsvato好吧,用headers={..}你也可以做同样的事情。但问题在于以下几点:@RequestBody。
- 当我将@requestmapping(headers="content type=application/*")添加到spring controller方法中时,当我对其中一个方法参数使用@requestbody时,实际上可以处理JSON和XML,但是对于表单发布,我会得到错误的org.springframework.web.httpmediatypenotsupportedexception:content type'application/x-www-for m-urlencoded'not支持
- 是的,正是我说的。但没有@requestbody,我就无法在春季解码JSON数据。
只需为控制器类添加@restcontroller注释。