Java Spring3.1或更高版本@RequestMapping使用/产生

Java Spring3.1或更高版本@RequestMapping使用/产生,java,spring,rest,spring-mvc,media-type,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},

我有一个关于
@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
来处理这两种情况

谢谢, 迈克


consumes/products将
String[]
作为一个参数(参见Spring的文档),因此我相信它会起作用。您也可以尝试
headers=“content type=application/json,application/xml”

Spring博客中的文章--提供了有关内容协商如何与Spring MVC协同工作的详细信息,简而言之,如果您希望同一个端点处理xml和json,您的映射是正确的,总结如下:

  • 使用路径扩展-您可以将json发送到
    /something.json
    ,将xml发送到
    /something.xml
    ,并在返回的过程中期望得到相同的结果

  • 使用
    Accept
    标题,使用
    application/json
    application/xml
    值,并使用
    Content Type
    指定提交的媒体类型

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

    解释
    首先,使用products和consumes属性来定义。默认情况下,将使用找到的第一个与请求的媒体类型匹配的HttpMessageConverter

    第二,客户端通过在中提供媒体类型来请求媒体类型:
    -接受请求头
    -URL sufix(http://..//some.xml=>“应用程序/xml”请求的媒体类型)
    -URL格式参数(…/some?format=xls)

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

    四、当未使用@ResponseBody时,不使用HttpMessageConverters。相反,ViewResolver启动并生成一个视图(HTML、PDF…),返回类型应遵循ViewResolver附带的规则(有关更多信息,请查看默认视图解析器和InternalResourceViewResolver)

    希望能有帮助

    其他来源:

    Ya。我的问题是,你们如何知道在任何给定的时间,它将生产哪些“产品”。这是可配置的还是自动的。它是如何自动选择的?如果我将它列为JSON、XML和纯文本的使用者,但作为JSON和XML的生产者,当纯文本进入时,它将返回什么类型?它可能会检查设置为请求的“accepts”头,然后从类路径使用JSON/XML序列化器。