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

使用@Autowired注入@Bean实例报lateinit属性未初始化如何解决

问题根源

代码存在3个核心错误共同导致注入失败:

  • Kotlin单例类object InvokerConfiguration标注的是@Component而非@Configuration注解,且Kotlin object类下的方法默认是非静态的,Spring无法正常解析该类下的@Bean声明
  • ConfigurationServiceInvoker已经加了@Component会自动被Spring扫描注册,又在配置类里手动用@Bean重复声明了同类型Bean,会引发冲突
  • 若在注入类的构造方法/初始化代码块里直接调用configurationServiceInvoker.getRules(),此时Spring还未完成属性注入,自然会报lateinit未初始化错误
修复方案

方案一:删除冗余Bean声明(最简方案)

已经给ConfigurationServiceInvoker加了@Component注解的前提下,只要该类在Spring组件扫描路径下,不需要额外配置@Bean,直接删除整个InvokerConfiguration类即可,注入逻辑无需修改。

如果调用逻辑是在类初始化阶段执行,改为使用@PostConstruct注解包裹调用逻辑,保证注入完成后再执行:

@Service
class YourBusinessService {
    @Autowired
    private lateinit var configurationServiceInvoker: ConfigurationServiceInvoker
    
    // 该方法会在Spring完成所有属性注入后自动执行
    @PostConstruct
    fun init() {
        val request = RulesRequest()
        val response = configurationServiceInvoker.getRules(request)
    }
}

方案二:保留@Bean配置的修正方式

如果确实需要手动声明Bean,按以下步骤修改:

  1. 先删除ConfigurationServiceInvoker类上的@Component注解,避免重复Bean冲突
  2. 把InvokerConfiguration的@Component改为@Configuration,去掉object修饰改为普通类:
@Configuration
class InvokerConfiguration {
    
    @Bean
    fun getConfigurationServiceInvoker(): ConfigurationServiceInvoker {
        return ConfigurationServiceInvoker()
    }
}
  1. 同样保证调用getRules的逻辑是在Spring容器初始化完成后执行,不要放在类构造阶段。
额外排查点

如果上述修改后仍有问题,检查ConfigurationServiceInvoker所在的包是否在SpringBoot启动类的扫描路径下,如果不在可以用@ComponentScan(basePackages = ["你的包名"])手动指定扫描路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:27:02