运行Liquibase时触发ClassCastException的排查求助
我配置Liquibase对接Neo4j Aura实例时,首次运行liquibase:update一切正常,但后续每次执行都会抛出类型转换异常:
[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:4.24.0:update (default) on project liquibase:
[ERROR] Error setting up or running Liquibase:
[ERROR] java.lang.ClassCastException: class java.time.ZonedDateTime cannot be cast to class java.sql.Timestamp (java.time.ZonedDateTime is in module java.base of loader 'bootstrap'; java.sql.Timestamp is in module java.sql of loader 'platform')
当前使用的Liquibase及Neo4j扩展版本均为4.24.0,Maven插件配置如下:
<plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>${liquibase.version}</version> <configuration> <changeLogFile>liquibase/changelog.xml</changeLogFile> <url>jdbc:neo4j:neo4j+s://MYAURAURL:7687</url> <driver>org.neo4j.jdbc.boltrouting.BoltRoutingNeo4jDriver</driver> <username>neo4j</username> <password>MYAURAPASS</password> </configuration> <executions> <execution> <phase>process-resources</phase> <goals> <goal>update</goal> </goals> </execution> </executions> </plugin>
推测问题出在Liquibase自动生成的dateCreated和dateUpdated字段(格式示例:2023-10-11T10:32:17.024000000Z),程序尝试将ZonedDateTime类型强制转为java.sql.Timestamp时失败。试过降级Liquibase版本,要么报错相同,要么直接无法运行。
解决方案
替换JDBC驱动
放弃使用org.neo4j.jdbc.boltrouting.BoltRoutingNeo4jDriver,改用官方基础JDBC驱动org.neo4j.jdbc.Neo4jDriver,该驱动对Java 8+时间类型的兼容性更优。修改配置中的driver字段:<driver>org.neo4j.jdbc.Neo4jDriver</driver>添加Liquibase时间类型参数
在Maven插件的configuration节点下新增参数,强制Liquibase使用Java 8原生时间类型,避免强制转换为java.sql.Timestamp:<configuration> <!-- 保留原有配置内容 --> <parameters> <parameter> <name>liquibase.useJdbcTimestamp</name> <value>false</value> </parameter> </parameters> </configuration>升级到兼容版本
尝试将Liquibase核心及Neo4j扩展同步升级到最新稳定版(如4.25.x及以上),新版本通常会修复这类跨时间类型的转换兼容性问题。手动创建变更日志表
如果上述方法均无效,可手动在Neo4j中创建Liquibase的DATABASECHANGELOG和DATABASECHANGELOGLOCK表,将DATE_CREATED和DATE_UPDATED字段类型设置为Neo4j原生的datetime类型,绕过自动生成时的类型不匹配问题。
内容的提问来源于stack exchange,提问作者Sabi Franjo

