Spring Boot - 依赖的初始化顺序

Posted

技术标签:

【中文标题】Spring Boot - 依赖的初始化顺序【英文标题】:Spring Boot - Initialization Order of Dependencies 【发布时间】:2020-10-23 14:23:34 【问题描述】:

我有一个 Spring Boot 项目,它在 application.yml 文件中将 Jasypt 用于 encrypting properties。 Jasypt 总是在使用解密密码的任何依赖项之前初始化和解密密码。

但是我现在也想使用Azure Key Vault。这个依赖现在tries to access its properties before they have been decrypted by Jasypt

如何更改 Spring Boot 初始化这些依赖项的顺序? 对于这两个依赖项,我没有在应用程序中定义任何 @Bean。

我创建了一个Demo-Repository。

它是一个普通的 Spring Boot 项目。唯一改变的是:

pom.xml 中添加了两个依赖项:

    <!-- Azure Key Vault -->
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
        <version>2.2.5</version>
    </dependency>

    <!-- Jasypt -->
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>2.1.2</version>
    </dependency>

application.yml:

jasypt:
  encryptor:
    password: test
azure:
  keyvault:
    enabled: true
    uri: ENC(1pGS+OSU9a9Bs+2iAjhyVd8NonXkLp0BsPBOuUzcyJSFnABs+bc5jw==)
    client-id: test
    client-key: test
    tenant-id: test

错误:

java.lang.IllegalArgumentException: The Azure Key Vault url is malformed.

(...)

Caused by: java.net.MalformedURLException: no protocol: ENC(1pGS+OSU9a9Bs+2iAjhyVd8NonXkLp0BsPBOuUzcyJSFnABs+bc5jw==)

如您所见,首先 Azure Key Vault 初始化自身,尝试使用 azure.keyvault.uri 但 Jasypt 尚未解密。

在这种情况下,我希望它尝试连接但由于 URL 不存在而无法连接。但它至少应该使用解密版本。

非常感谢任何建议。

【问题讨论】:

【参考方案1】:

我实际上是在Jasypt docs on GitHub (Section: Custom Environment)的帮助下找到了解决方案

@SpringBootApplication
public class DemoApplication 

   public static void main(String[] args) 
       //Doesn't work
       //SpringApplication.run(DemoApplication.class, args);

       //This works:
       new SpringApplicationBuilder().environment(new StandardEncryptableEnvironment())
                                     .sources(DemoApplication.class).run(args);
   

(...) While not required in most scenarios could be useful when customizing Spring Boot's init behavior or integrating with certain capabilities that are configured very early, such as Logging configuration. (...)

重要的部分是您指定 StandardEncryptableEnvironment。 这将使 Spring (Jasypt) 做的第一件事就是解密变量。其他一切都保持相同的顺序。

【讨论】:

以上是关于Spring Boot - 依赖的初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 学习番外篇:超快速项目初始化

spring-boot入门

Mybatisplus创建Spring Boot工程打包错误解决方法

Spring Boot 无法从 Spring Cloud AWS Core 依赖项启动

Spring Boot认知

Spring Boot 5:应用程序启动时初始化资源