Spring Boot添加Repository后抛Could not generate CGLIB subclass错误怎么办
问题根因
- 核心根因是Spring Boot 2.6.0内置的Spring Core 5.3.13版本与JDK 17及以上版本存在CGLIB代理生成兼容性Bug:该版本依赖的CGLIB在为带数组类型参数的方法生成代理类时,会出现类名拼接错误,直接抛出你遇到的
Illegal class name "java/lang/Class[]"异常,和你排查的一致,不是你的类用了final修饰或者可见性不足导致的。 - 代码存在笔误:你在调度类中注入的Repository变量名为
namedParameterMyObjectRepository,但调用save方法时使用的变量名是namedParameterDolarPriceRepository,命名不一致会在代理问题解决后触发变量找不到的错误,需要同步修正。
解决方案
- 最优方案:将Spring Boot版本升级到2.6.1及以上,该版本已经官方修复了CGLIB与高版本JDK的兼容性问题,无需修改其他业务代码即可解决代理生成异常。
- 临时兼容方案(若暂时无法升级Spring Boot版本):在项目配置文件
application.properties中添加以下配置,关闭CGLIB代理,强制使用JDK动态代理:
该方案要求自定义Repository必须实现对应接口,你的代码已经实现了spring.aop.proxy-target-class=falseMyObjectRepository接口,满足使用条件。 - 修正代码笔误:将
PriceFetcherScheduledTask类中fetchMyObject方法内的namedParameterDolarPriceRepository.save修改为namedParameterMyObjectRepository.save,保证变量名统一。
内容的提问来源于stack exchange,提问作者Igor Leal
相关产品推荐
相关产品推荐

