kotlin web系列(1) springboot初探和配置文件映射

kotlin web系列(1) springboot初探和配置文件映射


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


  • 新建springboot项目

    • 选择Spring Initializr
    • 在metadata页面中选择kotlin作为语言
      metadata页面
    • 依赖勾选web
      依赖
    • 将kotlin文件夹设为项目资源文件夹,并等待项目依赖下载完毕
      image
    • 新建测试控制器并设置/hello为默认映射路径
      @Configuration
      class SpringConfig : WebMvcConfigurer {
      
          override fun addViewControllers(registry: ViewControllerRegistry) {
              registry.addViewController("/").setViewName("forward:/hello")
              registry.setOrder(Ordered.HIGHEST_PRECEDENCE)
          }
      }
      
      @RestController
      class HelloController {
      
          @GetMapping("/hello")
          fun hello(): String {
              return "hello"
          }
      }
      
    • 启动项目访问页面
      在这里插入图片描述
  • 读取配置文件

    • 新建配置文件test.yml,并添加几个值(如果需要yml配置文件的提示可以安装spring assistant插件,或者点项目配置将其加入配置列表)
      在这里插入图片描述
      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"
      }
      
    • 访问项目
      在这里插入图片描述
    • 实体映射,由于默认的工厂对自定义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()
      }
      
    • 启动测试
      img
    • 另:使用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>
      
  • 以上为本篇全部内容 相关代码链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值