通过@Value 获取属性并以编程方式将其放入application.yml。 Java 使用 Spring Boot
Get properties by @Value and put it into application.yml programmatically. Java with SpringBoot
我使用 Azure KeyVault 来存储一些值。我需要获取这些值(例如 mysql-uri 或 client-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
}
}
我使用 Azure KeyVault 来存储一些值。我需要获取这些值(例如 mysql-uri 或 client-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
}
}