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

Kotlin整合Mongock与Spring Data遇IllegalAccessError问题求助

解决Mongock集成自定义Repository时的IllegalAccessError问题

问题根因

你碰到的java.lang.IllegalAccessError,本质是Mongock的代理机制和Kotlin默认访问权限冲突了。Spring Data生成的Repository代理类在调用toString()时,无法访问Kotlin类的非public方法——Kotlin默认类、方法都是internal权限,而代理类属于不同类加载器/包,导致权限校验失败。

具体修复方案

1. 修正Repository及实体的访问权限

  • 确保UnitRepository接口为public(Kotlin顶级接口默认就是public,但嵌套在类里时要显式声明public)
  • 实体类的toString()方法(不管是数据类默认生成还是自定义的)必须是public权限。Kotlin数据类默认toString()是public,但自定义时别写成internal或private。

2. 强制Mongock使用CGLIB代理

在application.properties中添加配置,替换默认的JDK动态代理:

mongock.mongo-db.mongo-client-proxy-mode=CGLIB

JDK动态代理仅支持接口代理,而Kotlin类默认不是open的,CGLIB可直接生成类的子类代理,绕开接口代理的权限限制。

3. 开放自定义Repository实现类(如有)

如果UnitRepository有自定义实现类(非Spring自动生成的代理),需给类加上open关键字,让CGLIB能生成代理子类:

open class UnitRepositoryImpl : UnitRepository {
    // 自定义实现逻辑
}

4. 规范ChangeUnit的注入与Repository定义

确保UnitRepository正确继承Spring Data的MongoRepository接口:

interface UnitRepository : MongoRepository<UnitEntity, String> {
    // 自定义查询方法
}

ChangeUnit类直接通过构造注入即可:

@ChangeUnit(id = "unit-init-change", order = "1")
class UnitInitChange(
    private val unitRepository: UnitRepository
) {
    @Execution
    fun applyChanges() {
        // 你的数据变更逻辑
    }
}

验证步骤

  1. 清理项目构建缓存(比如执行./gradlew clean)
  2. 启动应用,观察Mongock变更执行日志,确认异常消失
  3. 检查MongoDB的mongockChangeLog集合,确认变更记录已生成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:05:08