You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(推荐,仅需实体对比能力的场景)

  1. 修改pom.xml依赖,替换掉SQL版本的starter:
<dependency>
  <groupId>org.javers</groupId>
  <artifactId>javers-spring-boot-starter</artifactId>
  <version>6.5.1</version>
</dependency>
  1. 删除application配置中javers.dialect相关配置,保留javers.algorithm配置即可,你自定义的Javers Bean可以直接保留使用。
  2. 启动应用后即可直接调用Javers的对比方法获取实体差异:
// 示例:对比两个实体差异
Diff diff = javers.compare(oldUser, newUser);
// 输出所有变更项
diff.getChanges().forEach(System.out::println);

方案2:保留SQL starter,修复配置(需要将审计日志持久化到数据库的场景)

  1. 在启动类上排除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);
    }
}
  1. 手动配置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();
}
  1. 保留原有@JaversSpringDataAuditable注解即可正常使用审计能力。

内容的提问来源于stack exchange,提问作者Aliaksei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:06:06