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

我有一个关于消费的问题,并产生@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来处理这两种情况?

谢谢,迈克

Spring博客中的文章 – 使用Spring MVC进行内容协商 – 提供了有关内容协商如何与Spring MVC协同工作的详细信息,简而言之,如果您希望相同的端点处理XML和JSON,您的映射是正确的,请从文章中总结:

  1. 使用路径扩展 – 你可以将一个json发送到/something.json和xml到/something.xml并在返回的路上期待同样的事情

  2. 使用Accept标头,使用application/jsonapplication/xml的值,并使用Content-Type指定提交的媒体类型。

简短回答:
使用@ResponseBody注释方法,使用@RequestBody注释方法参数,它将起作用(不需要2个方法)。

说明
首先, 生成和使用属性用于缩小映射类型 。 默认情况下,将使用匹配所请求的媒体类型的第一个HttpMessageConverter。

其次, 客户端通过提供媒体类型请求媒体类型:
接受请求标头
URL sufix(http://…. //某些.xml =>“application / xml”请求的媒体类型)
URL格式参数 (… / some?format = xls)

第三,与@ResponseBody组合生成将生成所请求的媒体类型中的对象(当您需要将某些内容发送回客户端时,对于GET请求很好),并且与@RequestBody组合使用将消耗具有所请求媒体的对象type(当你需要从客户端获取东西时,很适合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 /内容协商,使用弹簧-MVC

好,

consumes / produce将String[]作为参数(参见Spring的文档中的RequestMapping ),所以我相信它会起作用。 您还可以尝试headers = "content-type=application/json,application/xml"