繁体   English   中英

使用 Java 中的占位符解析 yaml

[英]Parse a yaml with placeholder in Java

我有一个 yaml 文件,其中包含要从环境变量中获取的占位符。 我想将其解析为自定义 class。 目前我正在使用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 引导项目,因此不能使用标准 Spring 占位符替换。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM