一、背景
最近项目组在版本迭代时,组件也要进行升级,此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。
然鹅在上线之后就出现了一部分兼容性问题,造成了一次“事故”:调用接口出现“系统错误”。查看日志:java.time.LocalDateTime cannot be cast to java.util.Date,也就是出现时间转换异常。
二、问题排查
根据异常堆栈,找到异常抛出的位置:
由此得知,使用mybatis进行SQL的查询时,使用的是Map来接收数据,key是字段名,value则是具体的数据,且为Object,即可接收任何类型的对象数据。异常指出其Object具体为LocalDateTime,而不是Date类型。
根据git log知道,老代码基本上没改过,可能的原因就是本次MySQL驱动包的升级,造成的。那么到底是为什么呢?
本地环境进行debug跟踪,调整不同的MySQL驱动包mysql-connector-java,发现了最终的原因所在。
MySQL 5.1.X版本: