Spring Boot 2.5.7集成Javers做实体差异审计报类转换异常如何解决
Javers类转换异常解决方案
根因说明
你使用的javers-spring-boot-starter-sql 6.5.1版本自带的自动配置逻辑,会直接从Spring上下文中获取Hibernate SessionFactory并强制转换为SessionFactoryImplementor实现类,但Spring Boot 2.5+版本对JPA的SessionFactory做了JDK动态代理包装,无法直接转换为原生实现类,因此抛出类转换异常。
如果你的需求仅为对比两个实体的差异,完全不需要引入带数据库持久化能力的SQL版本starter,使用核心starter即可避免该问题。
解决步骤
方案1:替换为核心starter(推荐,仅需实体对比能力的场景)
- 修改pom.xml依赖,替换掉SQL版本的starter:
<dependency> <groupId>org.javers</groupId> <artifactId>javers-spring-boot-starter</artifactId> <version>6.5.1</version> </dependency>
- 删除application配置中
javers.dialect相关配置,保留javers.algorithm配置即可,你自定义的Javers Bean可以直接保留使用。 - 启动应用后即可直接调用Javers的对比方法获取实体差异:
// 示例:对比两个实体差异 Diff diff = javers.compare(oldUser, newUser); // 输出所有变更项 diff.getChanges().forEach(System.out::println);
方案2:保留SQL starter,修复配置(需要将审计日志持久化到数据库的场景)
- 在启动类上排除Javers SQL自动配置类,避免其加载有问题的自动配置逻辑:
@SpringBootApplication(exclude = org.javers.spring.boot.sql.JaversSqlAutoConfiguration.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 手动配置Javers相关Bean,避免自动配置读取Hibernate SessionFactory:
@Bean public DialectName javersSqlDialectName() { return DialectName.POSTGRES; } @Bean public Javers javers(DataSource dataSource) { return JaversBuilder.javers() .withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE) .registerJaversRepository(SqlRepositoryBuilder.sqlRepository() .withConnectionProvider(new JpaConnectionProvider()) .withDialect(javersSqlDialectName().getDialect()) .build()) .build(); }
- 保留原有
@JaversSpringDataAuditable注解即可正常使用审计能力。
内容的提问来源于stack exchange,提问作者Aliaksei
相关产品推荐
相关产品推荐

