容器启动报错AopConfigException:无法生成final类CGLIB子类
问题原因
错误的核心是:Kotlin的data类默认是final类,而@RefreshScope依赖CGLIB动态代理,需要生成子类,final类无法被继承。
具体来说:
- 你定义的
FeatureFlags是Kotlin data类,Kotlin会自动给它加上final修饰符,禁止被继承 @RefreshScope的实现原理是通过CGLIB创建Bean的子类,在配置变更时刷新Bean实例,final类无法被CGLIB生成子类,所以抛出Cannot subclass final class的异常
解决办法
方法1:给data类添加open关键字
直接修改FeatureFlags,允许它被继承:
open data class FeatureFlags(val name: String, val password: String)
方法2:优化配置类的注入方式(更推荐)
把原来的字段注入改成构造函数注入,同时保持字段不可变,代码更规范:
@Configuration class MyAppConfig( @Value("\${myapp.username}") private val username: String, @Value("\${myapp.password}") private val password: String ) { @RefreshScope @Bean fun myBean(): FeatureFlags { return FeatureFlags(username, password) } }
(注:此方法需要配合方法1使用,因为data类默认仍是final的,必须加open)
方法3:改用普通open类(如果不需要data类特性)
如果不需要data类自动生成的equals、hashCode、toString等方法,可以改成普通open类:
open class FeatureFlags(val name: String, val password: String)
内容的提问来源于stack exchange,提问作者JITHIN_PATHROSE
相关产品推荐
相关产品推荐

