@ResponseBody选择不同的响应格式

时间:2016-04-14 11:34:58

标签: java spring spring-mvc

我对Spring MVC很陌生。今天,当我学习@ResponseBody时,我对HttpMessageConverter s:

有一些疑问
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.FormHttpMessageConverter"/>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        </list>
    </property>
</bean>

如上所述,我们可以声明一个不同转换器的列表。所以这意味着我们可以选择其中一个作为响应体转换器。

但如何选择使用?例如,在functionA()中返回JSON,然后在functionB()中返回XML。

我的方式是强制Content-Type回复,这是正确的方法吗?或者是否存在更好的解决方案?

public @ResponseBody User getUser(HttpServletResponse response) {
    response.setContentType("application/xml");         
    // SOME CODES HERE
    return user;
}

2 个答案:

答案 0 :(得分:1)

  

但如何选择使用?例如,在functionA()中   返回JSON,然后在functionB()中返回XML

您可以使用RequestMapping的{​​{1}}属性:

produces

@RequestMapping(value = "/a", produces = "application/json")
public @ResponseBody Something functionA () { ... }

此外,您可以省略@RequestMapping(value = "/b", produces = "application/xml") public @ResponseBody Something functionB () { ... } 在客户接受的内容中更加自由。使用此方法,您可以让客户使用produces标头通过名为内容协商的流程在XMLJSON或其他任何内容中进行选择。事实上,如果客户端发出如下请求:

Accept

GET /a HTTP/1.1 Accept: application/json 将返回返回值的JSON表示,如果客户端发送此请求:

functionA

GET /a HTTP/1.1 Accept: application/xml 将返回返回值的XML表示形式。

答案 1 :(得分:0)

使用

@RequestMapping(value = "/url1", produces = "application/json")

用于json并使用

@RequestMapping(value = "/url2", produces = "application/xml")

用于xml输出