使用Kotlin写SpringBoot的坑

背景

听说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}")

总结:目前只发现了以上几个问题,其他跟java一样使用springboot;另外就是kotlin自己的语法糖了。

Gitalking ...