Spring 3.1或更高版本@RequestMapping使用/生产

时间:2014-10-20 17:14:36

标签: java spring rest spring-mvc media-type

我对消费有疑问并产生@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);
}

这会以我期望的方式工作吗?或者我需要两个端点updateSomeObjectXMLupdateSomeObjectJson来处理这两种情况?

谢谢, 麦克

3 个答案:

答案 0 :(得分:20)

Spring博客中的文章 - Content Negotiation using Spring MVC - 提供了有关内容协商如何与Spring MVC协同工作的详细信息,简而言之,如果您希望相同的端点处理XML和JSON,您的映射是正确的,可以从文章:

  1. 使用路径扩展 - 您可以将json发送到/something.json并将xml发送到/something.xml并在返回途中期待同样的事情

  2. 使用Accept标头,使用值application/jsonapplication/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"