背景
继续接上一篇的文章,项目中同时加入了 JSON 和 XML 解析器后,一个请求没有设置 produces
属性时,得到的数据是什么类型呢?本文来探讨这个问题。
引用 XML 解析包
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.0</version>
</dependency>
定义测试类
定义一个测试 Controller ,添加一个方法:
@RestController
public class TestJson {@RequestMapping(value="/hello/json")@ResponseBodypublic MyData hello(){return new MyData("wang",System.currentTimeMillis());}@Dataclass MyData {private String name;private Long time;public MyData(String name,Long time) {this.name = name;this.time = time;}}
}
未指定 proceduces 的请求响应值问题
一个请求未指定 produces
的时候,它返回的数据是什么类型呢?
这里用浏览器请求的时候,返回了 XML 类型:
因为 accept 头域的 application/xml
先于 */*
被解析了。
用 postman 发送,则得到的是却是 JSON 数据:
启示录
如果项目中同时包含 XML 和 JSON 消息解析器,那么需要检查所有的方法,为其指定 produces
属性,因为不同客户端请求时的 accept 头域可能有差异,最终会导致后端使用的解析器不一样。