@Transactional+@Autowired出现的lateinit property xx has not been initialized错误
1 问题描述
用Kotlin
编写Spring Boot
,在业务层中使用@Transactional
+@Autowired
时出现如下错误:
lateinit property dao has not been initialized
出错代码如下:
2 解决办法
因为Kotlin
类默认是final
的,加上@Transactional
后编译器提示需要open
:
但是加上open
后没用,因此把@Transactional
去掉后发现不会报错:
因此怀疑是@Transactional
的问题,因为需要在类上加上open
,所以尝试性地在对应的方法上面也加上open
:
问题得到解决。
3 原因
因为@Transactional
实际上是通过反射获取Bean
的注解信息,利用AOP
实现的,而在Kotlin
中使用AOP
需要在类或方法上加上open
。