【问题标题】:Parse a yaml with placeholder in Java在 Java 中使用占位符解析 yaml
【发布时间】:2021-02-09 06:48:24
【问题描述】:

我有一个 yaml 文件,其中包含要从环境变量中获取的占位符。我想将其解析为自定义类。目前我正在使用snakeyaml 库来解析它并正确填充bean,如何使用snakeyaml 或Java 中的任何其他库来解析环境变量。

datasource:
  url: {url_environment_variable}
  foo: bar
  username: {user_name_environment_variable}
  password: {password_environment_variable}

@Getter
@Setter
public class DataSource {
private String url;
private String foo;
private String username;
private String password;
}

下面的解析代码

Constructor c = new Constructor(MyDataSource.class);
Yaml yaml = new Yaml(c);
MyDataSource myData = yaml.loadAs(inputStream, MyDataSource.class);

问题是我还没有找到解决占位符的方法。人们能够使用python解决它并且有问题 - How to replace environment variable value in yaml file to be parsed using python script

我怎样才能在 Java 中做同样的事情。如果需要,我可以添加新的依赖项。 PS - 这不是 Spring Boot 项目,因此不能使用标准的 Spring 占位符替换。

【问题讨论】:

  • 我认为你需要一个显式的getter,里面有System.getEnv()

标签: java snakeyaml


【解决方案1】:

最简单的方法是分两次完成。首先反序列化为MyDataSource,就像你已经在做的那样。然后使用反射遍历实例的所有字段,如果值以花括号开头并以1结尾,则提取键,并从System.getenv映射中获取值。代码见this answer

如果你想一次性完成,那么你需要使用snakeyaml 事件驱动解析器。对于每个键,您按照上述方法解析值,然后根据键名称,使用反射或简单的 if-else 设置 MyDataSource 类中的相应字段。有关事件驱动解析器的示例,请参阅this class;它不是 Java,而是 Kotlin,但它可能是您能找到的唯一 JVM 语言示例。

【讨论】:

  • 不是上面显示的代码和结构只是其中的一部分。这是一个相当复杂的结构,中间有占位符
  • 抱歉,我一开始没能读懂你的想法,我的错。
猜你喜欢
  • 2017-05-28
  • 2021-03-08
  • 2018-05-11
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2022-11-01
  • 2014-03-23
  • 2020-06-05
相关资源
最近更新 更多