.metadata是什么项目文件_kotlin web系列(1) springboot初探和配置文件映射

本文所用springboot版本2.1.2.RELEASE
kotlin版本1.3.11

1) 使用idea新建springboot项目

新建Spring Initializr项目,在metadata页面中选择kotlin建立项目

cf718f43902bd1c321ee497bbccc6713.png

依赖勾选web

8f8a002740a18cd700446f450c63b50f.png

将kotlin文件夹设为项目资源文件夹,并等待项目依赖下载完毕

c7c30b2b0afa9761aa7e180a3d3c4637.png

新建测试控制器并设置/hello为默认映射路径

@Configuration

启动项目访问页面

1fc827ed2b18b4785b9306a0f4e1e2cb.png

2) 读取配置文件

新建配置文件test.yml,并随意添加几个值(如果需要yml配置文件的提示可以安装spring assistant插件,或者点项目配置将其加入配置列表)

55973bef7c8cf2449eb031ab72cbe248.png
插件
person:
  name: maple
  sex: man
  phone: 18111111111
  children: {name: merry,sex: woman}
  lists:
    - 1
    - 2

// 如果需要使用传统properties配置需要引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

修改控制器为属性注入值,注意由于kotlin字符串中的$本身有其含义,因此需要加反斜杠转义

@Value("${person.name}")
private lateinit var username:String

@GetMapping("/hello")
fun hello(): String {
    return "hello $username"
}

访问项目

facb06d7d467943262c2c1eea493979f.png

实体映射,由于默认的工厂对自定义yml解析有问题,新建映射工厂类解析yml,新建实体并修改控制器(如果需要使用kotlin中的data类型 需要手动注入bean)

//解析工厂
class YamlPropertySourceFactory : PropertySourceFactory {

    @Throws(IOException::class)
    override fun createPropertySource(name: String?, resource: EncodedResource): PropertySource<*> {
        return if (name != null)
            YamlPropertySourceLoader().load(name, resource.resource)[0]
        else
            YamlPropertySourceLoader().load(
                getNameForResource(resource.resource), resource.resource)[0]
    }

    private fun getNameForResource(resource: Resource): String {
        var name = resource.getDescription()
        if (!StringUtils.hasText(name)) {
            name = resource::class.java.getSimpleName() + "@" + System.identityHashCode(resource)
        }
        return name
    }
}
//映射类
@Configuration
@ConfigurationProperties(prefix = "person")
@PropertySource("classpath:/test.yml",factory = YamlPropertySourceFactory::class)
class UserProperties {
    lateinit var name: String
    lateinit var sex: String
    var phone = 0L
    lateinit var children: Map<String,String>
    lateinit var lists: List<String>

    override fun toString():String{
        return "name:$name,sex:$sex,phone:$phone,children:$children,lists:$lists"
    }
}
//修改 controller
@Autowired
private lateinit var userProperties:UserProperties
@GetMapping("/hello")
fun hello(): String {
    return userProperties.toString()
}

启动测试

5c50f2d5c5ea329919c24c08abd57eb3.png

另:使用kotlin data class类型注入(对于map类型的属性暂时没有找到特别好的办法解决)

//修改映射类
@Configuration
@PropertySource("classpath:/test.yml",factory = YamlPropertySourceFactory::class)
data class UserProperties(@Value("${person.name}")val name:String, @Value("${person.sex}")val sex:String, @Value("${person.phone}")val phone:Long)

//注,由于@value注解本身对于list map的支持并非很友好 因此并不推荐
//配置list
list: 1,2
//取值注入
@Value("#{'${person.lists}'.split(',')}")
private lateinit var lists:List<String>
//或者激活支持转换String为Collection类型的新配置服务
@Bean
fun conversionService(): ConversionService{
    return DefaultConversionService()
}
//这时list将不用再特殊处理 但配置仍旧只能保持字符串形式
@Value("${person.lists}")
private lateinit var lists:List<String>

以上为本篇全部内容 相关代码链接 本文markdown链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值