背景
听说kotlin跟Java生态无缝集成,尝试一下用kotlin写springBoot应用。
启动springboot:
@SpringBootApplication
@EnableScheduling
open class NotifyApplication
fun main(args: Array<String>) {
val app = SpringApplication.run(NotifyApplication::class.java, *args)
}
遇到的坑
1. spring无法托管kotlin bean
原因:spring托管bean使用的是aop代理,在默认情况下,使用jdk动态代理与字节码代理组合的模式;而kotlin的class默认是final class
解决:在kotlin类上加open关键字,在kotlin fun前加open关键字。或者添加kotlin maven依赖,将其标注为allopen。 maven依赖:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
2.lombok @Slf4j 注解在kotlin类上失效
原因:lombok.extern.slf4j.Slf4j 注解在kotlin的class上无法使用
解决:在class中声明 private val logger = LoggerFactory.getLogger(javaClass) 替换原有的@Slf4j方式
3. spring @Value(${xxx}) 失效
原因:在kotlin中,${}会被编译器特殊解析
解决:加上转义标识 @Value("${some.property}")
Gitalking ...