Spring中@ResponseBody结合produces返回XML的技术疑问
关于Spring MVC中@ResponseBody、produces属性及XML返回的问题解答
一、澄清produces属性的作用
你对produces的理解是准确的:它不是用来声明处理器将生成的媒体类型,而是用来缩小请求映射的匹配范围——只有当请求的Accept头包含produces指定的媒体类型时,这个处理器方法才会被选中执行。
举个例子:如果方法上标注produces = "application/json",那么只有请求头里携带Accept: application/json的请求才会匹配到该方法;如果同时存在另一个标注produces = "application/xml"的方法,Spring MVC会根据请求的Accept头自动路由到对应方法。
二、默认JSON序列化下,返回XML内容的两种方式
Spring MVC默认用Jackson处理JSON序列化,要返回XML可以用以下两种常见方案:
1. 基于Jackson XML序列化模块实现对象转XML
首先确保项目引入Jackson的XML依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
然后在控制器方法中配置:
- 用
produces = "application/xml"匹配Accept头为XML的请求 - 配合
@ResponseBody,Spring会自动用Jackson XML模块将返回对象序列化为XML
示例代码:
@GetMapping(value = "/user", produces = "application/xml") @ResponseBody public User getUserInfo() { User user = new User(); user.setId(1); user.setName("Hayley"); return user; }
如果想强制返回XML(忽略请求的Accept头),可以手动设置响应头:
@GetMapping("/user") @ResponseBody public User getUserInfo(HttpServletResponse response) { response.setContentType("application/xml"); User user = new User(); user.setId(1); user.setName("Hayley"); return user; }
2. 直接读取resources目录下的XML文件返回
如果是要直接返回resources下的XML文件内容(而非序列化对象),可以用Resource加载文件后返回字符串:
@GetMapping(value = "/static-xml", produces = "application/xml") @ResponseBody public String getStaticXml() throws IOException { Resource xmlResource = new ClassPathResource("data.xml"); return FileCopyUtils.copyToString(new InputStreamReader(xmlResource.getInputStream())); }
三、理清视图展示与HTTP响应体的区别
- 视图展示:对应Spring MVC的视图解析器(如JSP、Thymeleaf),控制器方法返回的是视图名称,视图解析器会渲染成HTML页面,最终这个HTML作为响应体返回给客户端。这种场景不需要@ResponseBody,因为返回的是视图标识,而非直接序列化的对象。
- HTTP响应体:添加
@ResponseBody后,控制器方法返回的对象会被直接序列化为指定格式(JSON/XML等),作为HTTP响应的Body部分返回,不会经过视图解析器。此时返回的是数据,不是页面。
简言之:加@ResponseBody返回的是数据(直接写入响应体);不加则返回视图名称(经解析后生成页面写入响应体)。
内容的提问来源于stack exchange,提问作者hayley
相关产品推荐
相关产品推荐

