如题,Spring Boot 引入 jackson-dataformat-xml 包后 @RestfulController 返回数据类型不是 JSON 而是变成了 XML

实际情况是,从公司拿到的搭建并配置好的 Spring Boot 框架,在其他同事电脑上运行正常,@RestfulController 注解的接口返回了 JSON 格式数据,但在自己的环境下运行,返回值变成了 text/xml。同事捣鼓一阵子无果后,再无下文。只能自己上手去找问题原因。

从 Spring 官网 Restful Web Service 了解到涉及到转化返回数据类型的类库是叫 Jackson

This application uses the Jackson JSON library to automatically marshal instances of type Greeting into JSON. Jackson is included by default by the web starter.

对比从 Spring 官网下载的 Restful Web Service 的 demo 和公司搭建的 demo,搜索发现公司搭建的 demo 中 Jackson 类相关的外部依赖库记录比官网 demo 多了几条:

fastxml.Jackson 相关的依赖库
fastxml.Jackson 相关的依赖库

对于 Spring 框架咱就是小白一枚,不太懂这其中的沟沟坎坎,就直接百度 jackson-dataformat-xml,找到了这篇:SpringBoot问题 - 引入jackson-dataformat-xml之后,本返回json的接口返回xml

作者解释的原因:

requestedMediaTypes 在Request的accept中没有值。而producibleMediaTypes中返回类型排序是 application/xml 排第一位, 在 application/json 之前。因此最终匹配的时候,返回了 application/xml

但这说不通,同事之前一直用的这个搭建好的框架写接口,返回数据类型也一直是 JSON。这不重要,他提到的解决方法确实解决了问题。当前项目重复引用了 jackson.dataformat-xml,去掉一个也恢复了。

当前外部依赖库 jackson.dataformat-xml2.9.52.10.2 两个版本,去除 2.9.5 即可。

去除依赖库:右击 jackson.dataformat-xml:2.9.5 -> Open Library Setting ,在库设置里点击减号,删除(移除)即可。

当然也可以通过 pom.xml 设置项目依赖的具体版本,这样也可以修复这样的问题。

设置项目依赖具体版本(推荐):pom.xml 查找 jackson-dataformat-xml 依赖项,添加 <version>2.10.2</version>,然后重新运行项目即可。