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

容器启动报错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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:37:04