我有一个 Java 21 Spring Boot 3.2 应用程序,需要加载一堆属性。在应用程序中,有几个文件使用:
@Value("${some.value}")
private String someValue;
我还有一个 SOPS 文件,其中包含几个键/值,我需要 Spring Boot 应用程序才能加载这些键/值。文件内容的格式如下:
some.value = myValue
如何将值加载到 Spring Boot 应用程序中?
这是为了当地发展。现在这些值正在被复制到 application-local.properties 文件中以供本地开发。但之后需要删除该文件,因为拥有这两个文件是没有意义的,而且 SOPS 文件已加密。有没有办法将值加载到环境中?
谢谢。
我通过创建一个
implements ApplicationContextInitializer<ConfigurableApplicationContext>
类并仅在 local
弹簧配置文件处于活动状态时通过创建一个 application-local.properties
来调用它来解决这个问题,我已将其添加到我的 .gitignore
中,其中至少包含:context.initializer.classes=com.your.path.to.class
。
在
initialize
方法中,我创建一个 ProcessBuilder
,并使用命令来验证 &&
将 sops 文件解密到标准输出。我捕获输出并将其解析为适合 MapPropertySource
的
applicationContext.getEnvironment().getPropertySources().addLast(props)
最后添加允许您通过忽略的本地属性文件覆盖在 sops 中找到的任何属性。此外,与许多其他方法不同,此方法允许来自 sops 的属性成为
@Value
注释的来源。
最糟糕的部分是必须编写解析解密的
.properties
文件的代码。考虑注释 #
和 !
、多行支持以及将 \n
等特殊字符处理为非文字。
我确实看到了一个名为
mrvisser/prop-doc
的 git 存储库,它可能会为你做这个?