我的应用程序使用spring和kotlin有问题。一开始我有一个控制器和一个这样的服务:
这是服务:
@Service
class StuffService {
@Inject
lateinit var environment : Environment
fun doStuff() = [HERE FUNCTION CODE USING environment VARIABLE]
}
这是控制器:
@RestController
class StuffController {
@Inject
lateinit var stuffService : StuffService
@RequestMapping("/doStuff")
fun doStuff() = stuffService.doStuff()
}
不幸的是,当我启动springboot时,这给了我这个错误:
kotlin.UninitializedPropertyAccessException: lateinit property environment has not been initialized
所以我尝试通过构造函数注入:
@Service
class StuffService(val environment : Environment) {...}
@RestController
class StuffController(val stuffService: StuffService) {...}
使用tha代码可以正常工作!我没有错误。
我想知道有什么区别。我不明白发生了什么。谁能帮助我理解?
答案 0 :(得分:0)
我用以下版本对此进行了测试:
kotlinVersion = '1.2.20'
springBootVersion = '2.0.1.RELEASE'
lateinit var
注射似乎在我的情况下正常工作。
以下是一个示例项目供您参考:https://github.com/jivimberg/lateinit
答案 1 :(得分:0)
我怀疑您在初始化environment
变量之前就已经引用它,这就是例外的原因。
更改后它起作用了。这是因为environment
变量是在主构造函数中初始化的。您可能想知道它没有注释如何工作。根据此doc
从Spring Framework 4.3开始,具有单个构造函数的类的参数会自动自动装配,这就是为什么在上面显示的示例中不需要显式@Autowired构造函数的原因。