Micronaut升级至3.6.0后仓库类无法继承final类报错求助
Micronaut 3.6.0升级后@Repository类报错IncompatibleClassChangeError的原因与解决
核心原因
Micronaut 3.6.0调整了@Repository注解的代理生成逻辑。你的仓库类是Kotlin编写的,而Kotlin类默认是final修饰的。Micronaut需要为@Repository类生成继承自原类的代理子类(即报错里的BulkUserMailSettingRepository$Intercepted),用来实现事务拦截、切面增强等功能,但final类不允许被继承,直接触发了IncompatibleClassChangeError。
为什么加@Singleton能解决?
在Micronaut 3.6.0中,当类同时标注@Repository和@Singleton时,框架会切换代理策略:不再通过继承原类生成代理子类,而是改用基于接口的代理或者直接将类作为单例实例化,绕过了final类无法被继承的限制。
其他可选解决方案
除了添加@Singleton,还有两种更贴合仓库类设计的处理方式:
- 给Kotlin仓库类添加
open关键字,允许框架生成继承式代理:@Repository open class BulkUserMailSettingRepository(private val jdbcOperations: JdbcOperations) - 如果你的仓库类实现了自定义接口,可以在Micronaut配置中强制启用接口代理模式,避免对原类的继承要求。
内容的提问来源于stack exchange,提问作者BlackLotus
相关产品推荐
相关产品推荐

