【问题标题】:handle environment variable in .yml with jackson-dataformat-yaml使用 jackson-dataformat-yaml 处理 .yml 中的环境变量
【发布时间】:2022-01-28 00:04:54
【问题描述】:

我正在使用 jackson 将文件 .yml 检索到 pojo java 中。 它工作正常。

读取 pojo 时如何处理 .yml 中的环境变量?杰克逊有这个实现吗? 示例:

attr1: ${ENV_ATTR} # read this value from environment when has ${}

依赖

implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.1'

实现代码


var fileYml = new File(getClass().getClassLoader().getResource("file.yml").toURI());

var mapper = new ObjectMapper(new YAMLFactory());
    mapper.setPropertyNamingStrategy(PropertyNamingStrategies.KEBAB_CASE);
    
var entityFromYml = mapper.readValue(fileYmlContent, MyEntity.class);


注意:我没有使用弹簧或弹簧靴。

【问题讨论】:

    标签: java jackson yaml


    【解决方案1】:

    有 Apache Commons 的 StringSubstitutor 可以完成这项工作。 您可以使用它对输入字符串进行预处理,也可以对每个加载的字符串进行后处理。

    后处理显然只适用于加载到字符串中的值,因此您不能使用它,例如加载到 int 中的值。

    另一方面,预处理是危险的,因为它不能保护您免受 env 变量值中的 YAML 特殊字符的影响。在您的示例中,将 ENV_ATTR 设置为

    foo
    bar: baz
    

    替换后,您将拥有

    attr1: foo
    bar: baz
    

    这可能不是我们想要的。

    如果您想防范这种情况,但又想替换为非字符串值,则需要直接使用 SnakeYAML 的 API 并专门化其 Composer。 Jackson 是 SnakeYAML 之上的一个抽象 API,它限制了你可以做什么,所以这对 Jackson 来说是不可能的。

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2019-09-29
      • 2021-09-27
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2022-01-10
      • 2021-07-14
      • 2019-04-02
      相关资源
      最近更新 更多