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 构建
如何使用 Mockito 在 Spring 中模拟自动装配的 @Value 字段?