Spring 3.1或更高版本的@RequestMapping Consumes/Produces

24

关于@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个回答

21

这篇来自Spring博客的文章 - 使用Spring MVC进行内容协商 - 详细介绍了Spring MVC如何实现内容协商。简单来说,如果您希望同一个终结点处理XML和JSON,您的映射是正确的。总结一下该文章:

  1. 使用路径扩展名 - 您可以将json发送到/something.json,将xml发送到/something.xml,并期望在返回时得到相同的内容。

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


12

简短回答:
使用@ResponseBody对方法进行注解,使用@RequestBody对方法参数进行注解,这样就可以工作了(不需要2种方法)。

解释:
首先,使用produces和consumes属性来缩小映射类型。默认情况下,将使用找到的第一个匹配所请求的媒体类型的HttpMessageConverter。

其次,客户端通过以下方式请求媒体类型
- 接受请求头
- URL后缀(http: //....//some .xml =>请求“application/xml”媒体类型)
- URL格式参数(.../some?format=xls)

第三,与@ResponseBody组合使用时,将以请求的媒体类型生成对象(对于需要向客户端发送返回内容的GET请求很好),而@RequestBodyconsumes结合使用时,则会使用所需的媒体类型消耗该对象(对于需要从客户端获取内容的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

1

好的,

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


是的。我的问题是,您如何知道它在任何给定时间将生成哪个“产物”。这是可配置的还是自动的?它如何自动选择?如果我将其列为 JSON、XML 和纯文本的消费者,但是作为 JSON 和 XML 的生产者,当纯文本进入时它会返回什么类型? - Mike Baglio Jr.
它可能会检查请求中设置的“接受”标头,然后从类路径中使用JSON/XML序列化程序。 - hi_my_name_is

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接