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); }
这会以我期望的方式工作还是需要两个端点updateSomeObjectXML
和updateSomeObjectJson
来处理这两种情况?
谢谢,迈克
Spring博客中的文章 – 使用Spring MVC进行内容协商 – 提供了有关内容协商如何与Spring MVC协同工作的详细信息,简而言之,如果您希望相同的端点处理XML和JSON,您的映射是正确的,请从文章中总结:
-
使用路径扩展 – 你可以将一个json发送到
/something.json
和xml到/something.xml
并在返回的路上期待同样的事情 -
使用
Accept
标头,使用application/json
或application/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"
。