You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

添加Orika Mapper后Spring Boot+Jersey应用启动失败问题

解决Spring Boot + Jersey + Orika启动时的IncompatibleClassChangeError问题

看来你遇到了Spring DevTools和Orika结合时的类加载冲突问题,这个IncompatibleClassChangeError本质是类加载器不一致或者Orika依赖版本冲突导致的,我帮你梳理下问题根源和解决办法:

问题根源

你的v-c包通过spring-devtools.properties配置了restart.include.orika=/orika-core.*\.jar,让Spring DevTools的RestartClassLoader加载Orika核心包。但v-c里的转换器类(比如AentityBdtoConverter)却是由DevTools的另一个BaseClassLoader加载的——这就导致转换器实现的Mapper接口,和你在Web应用配置类中使用的Mapper接口,虽然全限定名一样,但属于不同类加载器加载的类,JVM会判定为不兼容,抛出这个错误。


具体解决方案

1. 调整Spring DevTools的类加载配置

修改v-c包中src/main/resources/META-INF/spring-devtools.properties的配置,确保Orika和v-c包被同一个类加载器加载:

# 把v-c包也加入重启类加载器的包含列表
restart.include.vc=/v-c.*\.jar
# 保持Orika的包含配置,这样两者会被同一个类加载器加载
restart.include.orika=/orika-core.*\.jar

或者,如果你不需要Orika参与DevTools的热重启,可以改为排除Orika,让它由基础类加载器加载:

restart.exclude.orika=/orika-core.*\.jar

2. 强制统一Orika依赖版本

确保Web应用和v-c包使用的Orika版本完全一致。在Web应用的pom.xml中显式声明Orika依赖,避免依赖传递带来的版本不一致:

<dependency>
    <groupId>ma.glasnost.orika</groupId>
    <artifactId>orika-core</artifactId>
    <version>1.5.4</version>
    <scope>compile</scope>
</dependency>

可以执行mvn dependency:tree命令查看依赖树,确认没有其他版本的Orika被引入。

3. 简化Orika配置类的写法

你的转换器已经继承了CustomMapper,其实不需要再通过classMap().customize()来配置,直接注册转换器到MapperFactory即可,这样能避免不必要的配置错误:

@Configuration
public class OrikaConfiguration {
    @Bean
    public MapperFacade mapperOrika() {
        final MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        // 直接注册自定义转换器
        mapperFactory.registerMapper(new AentityBdtoConverter());
        // 其他转换器也用同样方式注册
        return mapperFactory.getMapperFacade();
    }
}

4. 临时禁用DevTools排查问题

如果以上方法都没效果,可以先移除Spring DevTools的依赖,重启应用看看是否正常。如果禁用后问题消失,那肯定是DevTools的类加载机制导致的,回到方案1调整配置即可。


验证步骤

  1. 执行mvn clean install -U清理Maven缓存并重新构建
  2. 重启Spring Boot应用,观察异常是否消失
  3. 若仍有问题,检查应用的类加载路径,确保Orika的jar只存在一个版本,且相关类由同一个类加载器加载

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

火山引擎 最新活动