弹簧 3.1 或更高版本@RequestMapping消耗/生产

2022-09-01 20:48:55

我有一个关于消耗和生产部分的问题。我有一个端点,我想同时接受JSON和XML,并在JSON传入时返回JSON,并在传递XML时返回XML。我需要做些什么特别的事情才能使这项工作发挥作用吗?@RequestMapping

下面列出了示例代码。

@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

谢谢 迈克


答案 1

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

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

  2. 使用标头,使用值 or,并使用 指定提交的媒体类型。Acceptapplication/jsonapplication/xmlContent-Type


答案 2

简答:
用@ResponseBody注释方法,用@RequestBody方法参数注释方法,它就会起作用(不需要2种方法)。

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

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

三,与@ResponseBody结合使用将生成请求的媒体类型的对象(对于GET请求来说很好,当您需要将某些内容发送回客户端时),并与@RequestBody结合使用将使用具有所请求的媒体类型的对象(当您需要从客户端获取某些内容时,对于POST请求来说很好)。

第四,当@ResponseBody不使用时,不使用HttpMessageConverters。相反,ViewResolvers启动并生成一个视图(HTML,PDF...),并且返回类型应遵循ViewResolvers附带的规则(检查默认视图解析器和InneralResourceViewResolver以获取更多信息)。

希望它有帮助。

其他来源:
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