我对消费有疑问并产生@RequestMapping
的一部分。我有一个端点,我想接受JSON和XML,并在传入JSON时返回JSON,并在传入XML时返回XML。我需要做些什么特别的工作才能使其工作?
示例代码如下所示。
@RequestMapping(value = "/something", method = PUT,
consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE},
produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
public SomeObject updateSomeObject(SomeObject acct) {
return doStuff(acct);
}
这会以我期望的方式工作吗?或者我需要两个端点updateSomeObjectXML
和updateSomeObjectJson
来处理这两种情况?
谢谢, 麦克
答案 0 :(得分:20)
Spring博客中的文章 - Content Negotiation using Spring MVC - 提供了有关内容协商如何与Spring MVC协同工作的详细信息,简而言之,如果您希望相同的端点处理XML和JSON,您的映射是正确的,可以从文章:
使用路径扩展 - 您可以将json发送到/something.json
并将xml发送到/something.xml
并在返回途中期待同样的事情
使用Accept
标头,使用值application/json
或application/xml
并使用Content-Type
指定提交的媒体类型。
答案 1 :(得分:11)
简短回答:
使用@ResponseBody注释方法,使用@RequestBody注释方法参数,它将起作用(不需要2种方法)。
<强>解释强>:
首先,生成和使用属性用于narrow the mapping types 。默认情况下,将使用匹配所请求的媒体类型的第一个HttpMessageConverter。
其次,客户端通过提供媒体类型来请求媒体类型:
- 接受请求标题
- URL sufix (http://.... //某些 .xml =&gt;&#34; application / xml&#34;要求的媒体类型)
- 网址格式参数(... / some?format = xls)
第三,生成与 @ResponseBody 组合将生成所请求媒体类型的对象(当您需要向客户端发送内容时,GET请求很好),消费与 @RequestBody 结合使用将使用具有所请求媒体类型的对象(当您需要从客户端获取内容时,对POST请求很有用)。
四,当@ResponseBody未使用时,不使用HttpMessageConverters 。而 ViewResolvers启用并生成视图(HTML,PDF ...),返回类型应遵循ViewResolvers附带的规则(请查看默认视图解析器和InternalResourceViewResolver以获取更多信息)。
希望它有所帮助。
其他来源:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#consumes--
http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc
答案 2 :(得分:1)
那么,
使用/产生String[]
作为参数(请参阅Spring的文档中的RequestMapping),所以我相信它会起作用。您也可以尝试headers = "content-type=application/json,application/xml"
。