项目引入 jackson-dataformat-xml 后 RestTemplate 序列化的 JSON 异常问题分析

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目引入 jackson-dataformat-xml 后 RestTemplate 序列化的 JSON 异常问题分析相关的知识,希望对你有一定的参考价值。

背景

项目打包时,为了减少部署包的大小,抽取公共依赖 jar 到一个公共目录。有一个模块使用了 RestTemplate 调用其他模块的服务,使用外部依赖包后,postForObject 返回的 JOSN 格数据不正常主要表现为:

  1. 布尔类型的的字段被解析成字符串了。
  2. 数组格式的数据,解析结果又潜套了一层:

    这是怎么回事儿呢?

问题分析

原因出在使用外部公共依赖包上面,用自身应用的依赖包没问题,用到整个项目公共目录包就错了。

分析问题出在 RestTemplate 的 JSON 转换上面,对比 jackson 依赖包,发现公共目录多了一个 jackson-dataformat-xml,把它挪出去后,这个项目的 RestTemplate 调用就正常了。

诡异的是,其他还有几个模块都通过外部依赖的方式引入了它,但是没有出现问题,因为服务调用使用的是 Feign 。

依赖包整理及计算过程

多模块部署,区分计算公共依赖和特定依赖,脚本化过程中,使用的重要的命令如下。

第一步,收集各自依赖 jar 的文件名称,写入到特定文件中:

#变量定义,等号两边不能包含空格
file1="$baseDir/lib1.log"
file2="$baseDir/lib2.log"

#打印各模块的依赖jar名称到指定文件,但是不包含第一行的 total
cd $lib1
ls -l | grep -v 'total'|grep -v '总用量' | awk 'print $9' > $file1

cd $lib2
ls -l | grep -v 'total'|grep -v '总用量' | awk 'print $9' > $file2

第二步,计算两个 lib 目录中重复出现的公共文件名称,和另一个目录特定的文件

# 公共的包 uniq -d 显示重复出现的行
cat $file1 $file2 | sort | uniq -d > $jarfile1

# 特有的包计算:-u 显示单行
cat $jarfile1 $file2 | sort | uniq -u > $jarfile2

第三步,再用 mv 命令挪动:

cat $jarfile1| xargs -n 1 -t -I  mv  $baseDir/commonlib
cat $jarfile2| xargs -n 1 -t -I  mv  $baseDir/speciallib

启示录

微服务应用实践过程中,依赖包过多、过大是个问题,想要精简依赖,抽取公共部分,不好抽取。最偷懒的办法是,将项目中所有模块的依赖包都放到一个目录中。但是容易带来其他问题:

  1. 依赖包版本不统一,需要通过父级工程统一版本。
  2. 有些配置包引入后,模块缺配置的,需要单独放一个目录,比如:spring-security-config;还有本文碰到的 spring-security-config 。

以上是关于项目引入 jackson-dataformat-xml 后 RestTemplate 序列化的 JSON 异常问题分析的主要内容,如果未能解决你的问题,请参考以下文章

求教java maven项目打包引入的问题,求大神解答

被引入的maven项目的class找不到

如何在Maven项目中引入自己的jar包

react 项目搭建后 打包 引入图片的问题

Vue项目中引入第三方已做好的H5游戏

idea创建javaproject项目,引入jar包并打包