likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 12

背景

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

  1. 布尔类型的的字段被解析成字符串了。
  2. 数组格式的数据,解析结果又潜套了一层: 项目引入 jackson-dataformat-xml 后 RestTemplate 序列化的 JSON 异常问题分析 这是怎么回事儿呢?

问题分析

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

分析问题出在 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 。
转载自:https://juejin.cn/post/7136324077978910757
评论
请登录