java - @ResponseBody选择不同的响应格式

标签 java spring spring-mvc

我对 Spring MVC 还很陌生。今天学习@ResponseBody时,有一些关于HttpMessageConverter的疑问:

<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;
}

最佳答案

But how to choose the one to use? For example, in functionA() to return JSON and then in functionB() to return XML

您可以使用 RequestMappingproducts 属性来实现:

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

还有:

@RequestMapping(value = "/b", produces = "application/xml")
public @ResponseBody Something functionB () { ... }

此外,您可以省略产品,并且在从客户那里接受的内容上更加自由。通过这种方法,您可以让客户端使用 Accept 通过名为内容协商的过程在 XMLJSON 或其他内容之间进行选择 header 。事实上,如果客户端发出如下请求:

GET /a HTTP/1.1
Accept: application/json

functionA 将返回返回值的 JSON 表示形式,如果客户端发送此请求:

GET /a HTTP/1.1
Accept: application/xml

functionA 将返回返回值的 XML 表示形式。

关于java - @ResponseBody选择不同的响应格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36621860/

相关文章:

java - mockito:类 [X] 未准备好进行测试

java - Spring Transaction - 记录新事务的方法执行时间

java - Hibernate 调用存储过程返回无效函数或过程名称错误

java - 自定义 DefaultTableCellRenderer 不更改 jTable 上行的背景颜色

java - 将 UUID 和 User ID 设置到当前请求线程中

java - Grade-wrapper.properties与实际版本之间的Gradle版本不一致

java - 我应该更喜欢使用 JPA - 纯 SQL 还是 JPQL 以及如何使用 JPQL 和实体创建/删除表

java - 在 Controller 、spring 内部的 @postconstruct 方法中实例化 @autowired bean

java - 使用 Maven 的 SpringMVC 和 Hibernate

java - Spring mvc 映射 header 和参数