在Java中解析带有占位符的yaml

在Java中解析带有占位符的yaml,java,snakeyaml,Java,Snakeyaml,我有一个yaml文件,其中包含从环境变量获取的占位符。我想把它解析成一个自定义类。目前我正在使用snakeyaml库来解析它并正确地填充bean,如何使用snakeyaml或Java中的任何其他库解析环境变量 datasource: url: {url_environment_variable} foo: bar username: {user_name_environment_variable} password: {password_environment_variable}

我有一个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解决这个问题,并且有疑问-

如何在Java中实现同样的功能。如果需要,我可以添加一个新的依赖项。
PS-它不是Spring引导项目,因此无法使用标准的Spring占位符替换。

最简单的方法是分两次完成。首先反序列化到
MyDataSource
,就像您已经做的那样。然后使用反射迭代实例的所有字段,如果值以大括号开始,以大括号结束,则提取键,并从
System.getenv
map获取值。有关代码,请参阅


如果希望一次完成,那么需要使用snakeyaml事件驱动程序解析器。对于每个键,您都可以如上所述解析值,然后根据键名,在
MyDataSource
类中设置相应的字段,可以使用反射,也可以使用simple(如果有的话)。有关事件驱动解析器的示例,请参阅;它不是Java,而是Kotlin,但它可能是您可以找到的唯一JVM语言示例。

我认为您需要一个包含
System.getEnv()
的显式getter。不,上面显示的代码和结构只是其中的一部分。这是一个相当复杂的结构,中间有占位符,我一开始无法读懂你的心思,我的错。