通过@Value 获取属性并以编程方式将其放入application.yml。 Java 使用 Spring Boot

Get properties by @Value and put it into application.yml programmatically. Java with SpringBoot

我使用 Azure KeyVault 来存储一些值。我需要获取这些值(例如 mysql-uriclient-secret)并在 application.yml 中创建新属性(和应用程序-local.yml)。 首先,我尝试使用 @Bean 创建 Configuration-class 像 getDataSource 来创建与数据库的连接,我成功了,但我还需要添加其他字段, 例如 'oauth.client.secret'.

所以我尝试获取值并在 main-class 中创建 'properties',但是 @Value 不能是静态的,这个解决方案抛出 NPE。我尝试创建新的 Configuration-class 并从中获取属性,然后将其拉入 SpringApplicationBuilder,但我需要 ApplicationContext(因此将调用 SpringApplication.run)来获取实例(bean)这个 class 的值...

我不知道下一步该怎么做,我被卡住了。准备重写并展示您需要的任何解决方案。

更新 1:

    @Value("${secret}")
    private String clientSecret;

    public static void main(String[] args) {
        new SpringApplicationBuilder(DefaultApplication.class).properties(getProperties()).run(args);        
    }

    @NotNull
    private static Properties getProperties() {
        Properties properties = new Properties();
        properties.put("oauth.client.secret", Objects.requireNonNull(clientSecret));

        return properties;
    }

clientSecret 错误:无法从静态上下文引用非静态字段'clientSecret'

你可以试试这种注入属性的方式。这使用更简单的便利 class SpringApplication 而不是 SpringApplicationBuilder.

MainClass.java

@SpringBootApplication
public class MainClass {
    public static void main(String... args) {
        SpringApplication.run(MainClass.class, args);
    }
}

application.yaml 将通过 Spring 引导自动加载到上下文中(除非您已针对它进行配置)。可以重用、重新定义属性(使用配置文件),也可以使用 system/env 变量。

注意 Spring 配置非常灵活和强大。请阅读此文档 https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

application.yaml

app:
  name: Demo
oauth:
  client:
    secret: ${app.name} // This will have "Demo"
env:
  path: ${SOME_ENV_VAR} // This will take SOME_ENV_VAR from env variable

SomeService.java

@Service
public class SomeService {
    @Value("${app.name})
    private String appName;

    public void printAppName() {
        log.info(appName); // will log the appname
    }
}