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() { // 你的数据变更逻辑 } }
验证步骤
- 清理项目构建缓存(比如执行
./gradlew clean) - 启动应用,观察Mongock变更执行日志,确认异常消失
- 检查MongoDB的
mongockChangeLog集合,确认变更记录已生成
内容的提问来源于stack exchange,提问作者observer
相关产品推荐
相关产品推荐

