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

Kotlin中Vaadin视图配置里如何访问@Autowired注入字段

Vaadin 23 + Spring 3.0.2 视图中Service注入初始化时机问题解决方案

问题原因

Kotlin的init块在类实例构造阶段执行,而Spring的字段注入(@Autowired)是在实例构造完成后才完成的。这就导致init块执行时,someService还未完成初始化,调用时会抛出未初始化异常。

解决方案

方案1:使用构造函数注入

将依赖通过构造函数传入,Spring会在创建实例时自动注入依赖,此时init块中可以直接安全使用someService:

@Route(value = "dashboard", layout = MainView::class)
@PageTitle("Dashboard")
class DashboardView(
    private val someService: SomeService // 构造函数注入,Spring自动注入该Bean
) : VerticalLayout() {

    init {
        val grids = HorizontalLayout()
        grids.justifyContentMode = FlexComponent.JustifyContentMode.CENTER
        grids.alignItems = FlexComponent.Alignment.CENTER

        // 此处可直接调用someService获取数据
        val tableData = someService.getTableData()
        // 编写表格初始化逻辑

        grids.setSizeFull()

        add(grids)
        setSizeFull()
        justifyContentMode = FlexComponent.JustifyContentMode.CENTER
        alignItems = FlexComponent.Alignment.CENTER
    }

    companion object {
        const val VIEW_NAME = "Dashboard"
    }
}

方案2:使用@PostConstruct注解替代init块

保留字段注入,将初始化逻辑移到标注@PostConstruct的方法中。该注解标记的方法会在Spring完成所有依赖注入后执行,此时someService已初始化完成:

@Route(value = "dashboard", layout = MainView::class)
@PageTitle("Dashboard")
@SpringComponent // 明确让Spring管理该视图Bean
class DashboardView : VerticalLayout() {
    @Autowired
    private lateinit var someService: SomeService

    @PostConstruct
    fun initView() {
        val grids = HorizontalLayout()
        grids.justifyContentMode = FlexComponent.JustifyContentMode.CENTER
        grids.alignItems = FlexComponent.Alignment.CENTER

        // 此处可安全调用someService
        val tableData = someService.getTableData()
        // 编写表格初始化逻辑

        grids.setSizeFull()

        add(grids)
        setSizeFull()
        justifyContentMode = FlexComponent.JustifyContentMode.CENTER
        alignItems = FlexComponent.Alignment.CENTER
    }

    companion object {
        const val VIEW_NAME = "Dashboard"
    }
}

注意事项

  • 类名需符合规范,someService应改为SomeService(首字母大写),避免Spring扫描或语法问题。
  • 构造函数注入是Spring官方推荐的依赖注入方式,能保证依赖非空,同时提升代码可测试性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:37:24