一、背景
公司近期整体架构升级,沉登负责所在项目的具体升级,过程中出现了一些意料之外的big,在这里记录下来,给自己提个醒,也作后来者的前车之鉴。升级工程目前已上线,后续有其他问题出现,会持续更新的。
1.1 升级目标
- SpringBoot 2.0.6 升级至 2.1.8
- SpringCloud Finchley.SR2 升级至 Greenwich.SR3
1.2 其他环境
- Java 10
- maven 3.6.3
二、正文
2.1 MySQL时区问题
2.1.1 现象描述
使用升级后SpringBoot和SpringCloud测试时,发现数据入库时间与现实时间有8小时时差(比现在早8小时),但除了生产版本外,没做任何改动,包括数据库配置及服务器配置。虽然想到时区问题,需要额外指定时区,但没升级前也是没有指定时区,却没有出现时差问题。令人十分苦恼。
2.1.2 原因分析
通过查阅依赖版本(强烈建议安装maven helper插件),发现SpringBoot 2.0.6 使用的MySQL版本是 5.1.47,而SpringBoot 2.1.8 使用的MySQL版本是 8.0.17。二者的差别在于,在MySQL 5.x版本中是没有时区配置的,但MySQL 8.x中新增了这个时区配置,并且默认时区是UTC时区,比北京时间晚8个小时。所以我们用的时候就被出现了时区问题。
2.1.3 解决方案
修改数据库配置,增加时间(serverTimezone=Asia/Shanghai)的配置。
spring.datasource.url=jdbc:mysql://*?serverTimezone=Asia/Shanghai
2.2 jackson 序列化问题
2.2.1 现象描述
沉登测试时发现,原本通过jackson提供的Json转POJO的方法,出现异常:
Caused by: java.lang.IllegalStateException: Conflicting/ambiguous property name definitions (implicit name 'lengthOfEmployed'): found multiple explicit names: [workyear, lengthOfEmployed], but also implicit accessor: [method com.vcredit.routeplatform.common.domain.dto.preapproval.ExtensionMappingDTO$CreditInfo#getLengthOfEmployed(0 params)][visible=true,ignore=false,explicitName=false]
实际在lengthOfEmployed
字段上,加了@JsonProperty
注解。
@JsonProperty("workyear")
private String lengthOfEmployed;
2.2.2 原因分析
还是查询依赖版本,发现SpringBoot 2.0.6 使用的 lombok 版本是 1.16.22,而 SpringBoot 2.1.8 使用的lombok 版本是 1.18.8。具体原因不明。
2.2.3 解决方案
升级SpringBoot版本后,将 lombok 降级为 1.16.22。
三、总结
版本升级到处是坑,虽然已经万分小心,但仍然被上述两个问题困扰许久,谨以此记,下不为例。