Spring Boot简化了一大堆Spring中繁琐的xml配置文件,因此使用spring boot来搭建服务器项目的基础是最好不过的了,再加上最近kotlin大热,所以笔者就试着用Kotlin + Spring Boot来开发一个服务器,但是按照原来注解的用法,在kotlin项目却无法成功读取配置文件中的参数,这里就总结一下遇到的坑和解决的办法
首先我在java项目中需要声明了一个项目配置类ServerConfig:
@Component
@ConfigurationProperties("server")
public class ServerConfig{
@Value("${server.host}")
private String host;
}
然后需要用的时候
public class Test{
@Autowired
private ServerConfig ServerConfig;
...其他操作...
}
这样spring boot会自动帮我们将配置参数写入ServerConfig类
但是在kotlin项目就会出现问题:
1.@Value注解
平时在java中,使用@Value注解一般都是如下使用的:
@Value("${server.host"}")
private String host;
但是这样在kotlin中就会出现问题:
1.$符号是用于字符串模板化的,想要使用@Value注解就必须使用转义字符将$转义
2.在kotlin所有变量都是必须初始化的,要想延迟初始化,要么lazy by {...},要么在变量声明前加上lateinit关键字
所以最后在kotlin中的@Value注解正确姿势是:
@Value("\${server.host}")
lateinit var host: String
2.@Autowired注解
在java中,一般我们这样用@Autowired注解:
@Autowired
private ServerConfig serverConfig;
但由于我在kotlin项目中使用@Autowired初始化bean的时候一直失败,上网也找不到原因,网上的全是黏贴复制别人的,真的一点研究的精神都没有...所以我自己就想了一下,发现反正项目配置就是一个全局的变量,声明成静态类的话功能呢也一样的嘛,然后试了一下,发现成功了!!!
即最终的代码应改为:
//object 声明的是静态类,该类所有成员都是静态成员,只能ServerConfig.xxx()来调用
@Component
@ConfigurationProperties("server")
object ServerConfig {
@Value("\${server.host}")
lateinit var host: String
@Value("\${server.port}")
lateinit var port: String
}
@Autowired注解就不用了(233)
虽然最后控制台中会输出警告但是配置文件中的参数还是能正常获取的.