美文网首页
记一则对SpringBoot@PropertySource不能解

记一则对SpringBoot@PropertySource不能解

作者: LoWang | 来源:发表于2019-03-22 09:52 被阅读0次

scio

https://github.com/rench/scio

起因

在项目中,有一个文件core.yml,里面存储了core模块的一些基础配置,该文件里面的写法有properties的写法也有yaml的写法。例如:

···
scio.core.api.secrets: test,123456
scio.core.sms.appKey=1d5123123165db5
···

在eclipse编辑器中,经常会提示错误,也就是说yml文件中的语法有误。确实,scio.core.sms.appKey=1d5123123165db5这段的写法是properties的写法。但是启动程序,没有任何错误报出,看着不爽,就想把错误取消,所以把scio.core.sms.appKey=1d5123123165db5修改成scio.core.sms.appKey: "1d5123123165db5"。启动项目,junit测试报错了,提示appKey不存在。

发现

发现junit测试错误,根据问题找到校验appKey的业务逻辑,发现${scio.core.sms.appKey}获取到的appKey居然是带有引号的"1d5123123165db5"。那就奇怪了,按照yaml的写法,双引号和单引号只是区分是否转义字符串中的特殊符号,不会把双引号到值里面去的。跟踪发现,core.yml的引用是使用了@PropertySource({"classpath:core.yml"})进行解析的,通过查看@PropertySource注解的解释,如下:Given a file app.properties containing the key/value pair testbean.name=myTestBean, the following @Configuration classuses @PropertySource to contribute app.properties to the Environment's set of PropertySources.,由此可见,默认他是解析的properties文件,猜想,他并没有按照yaml的格式解析,若properties的解析也支持冒号分隔,那么把冒号后面的数据解析带有引号,也就能解释通了。

解析

  • @PropertySource 的注解中,有一个factory属性,可指定一个自定义的PropertySourceFactory接口实现,用于解析指定的文件。默认的实现是DefaultPropertySourceFactory,继续跟进,使用了PropertiesLoaderUtils.loadProperties进行文件解析,所以默认就是使用Properties进行解析的。

扩展

  • CompositePropertySourceFactory 查看了DefaultPropertySourceFactory的解析方法后,发现其支持properties文件的解析,跟进properties的load方法发现在解析时,分隔符是=或者:,虽说可以解析简单的yml格式内容,但是无法支持真正的yaml语法,可以对DefaultPropertySourceFactory进行扩展,支持两种格式混合解析。以下是主要代码
package com.scio.cloud.cloudconfig;

import java.io.IOException;
import java.util.Optional;
import java.util.Properties;

import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
/**
 * CompositePropertySourceFactory support properties and yaml file
 *
 * @author Wang.ch
 * @date 2019-03-22 09:30:15
 */
public class CompositePropertySourceFactory extends DefaultPropertySourceFactory {
  @Override
  public PropertySource<?> createPropertySource(String name, EncodedResource resource)
      throws IOException {
    String sourceName = Optional.ofNullable(name).orElse(resource.getResource().getFilename());
    if (!resource.getResource().exists()) {
      // return an empty Properties
      return new PropertiesPropertySource(sourceName, new Properties());
    } else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {
      Properties propertiesFromYaml = loadYaml(resource);
      return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    } else {
      return super.createPropertySource(name, resource);
    }
  }
  /**
   * load yaml file to properties
   *
   * @param resource
   * @return
   * @throws IOException
   */
  private Properties loadYaml(EncodedResource resource) throws IOException {
    YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
    factory.setResources(resource.getResource());
    factory.afterPropertiesSet();
    return factory.getObject();
  }
}
  • @PropertySource
@PropertySource(
    value = {"core.yml", "key.properties"},
    factory = CompositePropertySourceFactory.class)

相关文章

  • 记一则对SpringBoot@PropertySource不能解

    scio https://github.com/rench/scio 起因 在项目中,有一个文件core.yml,...

  • 这,就是生活

    开心吗?不!为何?不知道。你丫有病! 烦恼?对,问题能解决吗?不能!烦恼有屁用! 问题能解决吗?有点难!……能解决...

  • 记十一则

    我畏惧神明,不相信他会给予爱,只知道他会给予惩罚。所谓信仰不过是垂头面向审判台等待神的鞭笞而已。世间的确有地狱,但...

  • 2020-09-04

    罗胖在启发俱乐部第6期里讲到了一则故事,一个学生回到自己的母校,对曾经一位老师说,你还记得我吗?老师回答说好像不记...

  • 儒语微言2021-01-31

    俗话说,鸡是“记吃不记打”,有的妈妈,对至亲之人却是“记打不记吃”,只记得自己挨打或受到了伤害,甚至记仇,却忘了这...

  • 云中听书|忆愁

    屋内一帘幽梦 空气拂面情柔 忆往日欢娱 平添一分春愁 相见视而不语 音容全记脑中 若此生疏陌陌 片片飞花能解愁

  • 2002年的回忆

    不记的从什么时侯开始我的心已开始疲惫,不记的从什么时侯开始我对周围的一切业已冷漠,也不记的从什么时侯开始我...

  • 记一则

    10.05 晚上23:10左右下班回家,如往常一样,走的小区前门,秋夜,夜深,人静,小区内绿道笼罩在偏暗雾白的路灯...

  • 记五十一则

    于千万人之中,遇见你要遇见的人。于千万年之中,时间无涯的荒野里,没有早一步,也没有迟一步,遇上了也只能轻轻地说一句...

  • 记三十一则

    相遇不一定有结果,喜欢不一定能在一起,在一起的人也会走散,每种距离和遗憾都有它存在的意义。 ——《你的婚礼》 --...

网友评论

      本文标题:记一则对SpringBoot@PropertySource不能解

      本文链接:https://www.haomeiwen.com/subject/xbakvqtx.html