Kotlin 在春季自动装配

Posted

技术标签:

【中文标题】Kotlin 在春季自动装配【英文标题】:Kotlin autowired in spring 【发布时间】:2019-08-02 15:35:08 【问题描述】:

我对 kotlin 还很陌生,但之前做过一些广泛的 java...

我尝试在同一个项目中使用 kotlin 和 java,但它看起来很丑,我不喜欢我的类被分成两个地方。所以现在我的项目是 100% kotlin 有问题...

我不断收到此错误消息:

lateinit property serviceX has not been initialized

我明白这意味着服务还没有初始化,但是我该如何初始化呢?

使用 java 和 spring,我在构造函数中做了 @Autowired 或注入服务并完成了。

我需要让我的 REST 能够使用 serviceX

@Component
@Path("/super")
open class SuperRest : BaseRest() 

@PUT
@Path("/test")
fun putTest(
        @Context securityContext: SecurityContext,
        @NotNull selected: String
) 
    val user = serviceX(securityContext)
   


在 BaseRest 中,我尝试自动装配 serviceX 首先是:

    @Autowired
    protected lateinit var serviceX: ServiceX

然后就是

    @Autowired
    lateint var serviceX: ServiceX

然后我尝试了在 SO 中找到的其他解决方案

open class BaseRest @Autowired constructor(
    private val serviceX: ServiceX
)  ... 

这是为什么? 我仍然可以在休息时使用其他@autowired 服务。 就在我尝试从 BaseRest 扩展中使用它们时,我会得到 ​​p>

lateinit property serviceX has not been initialized

即使没有任何 lateinit 属性,我仍然会以某种方式收到此错误..

private var serviceX: ServiceX = ServiceX()

它仍然不知何故没有初始化,请帮助

【问题讨论】:

能说明serviceX的使用地点吗?您可能在注入之前访问它。谢谢 可能是因为您没有使用 Spring 而是使用 Jersey 来管理您的 rest 端点并且没有正确设置 Jersey/Spring 集成。 【参考方案1】:

不太清楚

当我尝试从 BaseRest 扩展中使用它们时,我会得到 ​​p>

部分,但这是我遇到的代码,它按预期工作。

open class BaseRest 
  @Autowired
  protected lateinit var serviceX: ServiceX

  fun baseFun() 
      serviceX.serviceFun(SecurityContextImpl())
  


@Component
open class SuperRest : BaseRest() 

  fun putTest(
    securityContext: SecurityContext,
    @NotNull selected: String
  ) 
    baseFun()
    val user = serviceX.serviceFun(securityContext)
  

额外问题:为什么使用@PUT and @Path("/test") 注释而不是@PutMapping("/test")

【讨论】:

对不起,不能让它工作,即使有这个..仍然没有初始化 好的,所以您需要提供更多上下文。例如,您的 pom.xml Spring 依赖项,以及更多关于“当我尝试从 BaseRest 扩展中使用它们时”的信息。另外,正如@m-deinum 提到的那样,您真的使用 Spring 来管理您的 REST 端点还是其他什么?那些@PUT and @Path 似乎很可疑。

以上是关于Kotlin 在春季自动装配的主要内容,如果未能解决你的问题,请参考以下文章

春季自动装配错误

MapStruct 不使用 Kotlin 和 Spring Boot 自动装配,使用 Gradle 构建

为啥自动装配的 bean 为空?

如何使用 Mockito 在 Spring 中模拟自动装配的 @Value 字段?

创建名为“homeController”的 bean 时出错:自动装配依赖项的注入失败

Spring之Bean的自动装配