微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 Java 中的占位符解析 yaml

如何解决用 Java 中的占位符解析 yaml

我有一个 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 解决它并且有问题 - error message from postman

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

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。