通过@Value获取属性,并以编程方式将其放入application.yml中.Java与SpringBoot



我使用Azure KeyVault来存储一些值。我需要获得这些值(例如mysql-uri客户端机密(,并在application.yml(和applicationlocal.yml(中创建新属性。首先,我尝试使用@Bean(如getDataSource(创建Configuration类来创建与数据库的连接,我成功地做到了,但我还需要添加其他字段,如"oauth.client.secret"。

因此,我尝试获取值并在主类中创建"属性",但@Value不能是静态的,该解决方案抛出NPE。我试图创建新的Configuration类并从中获取属性,然后将其拉入SpringApplicationBuilder,但我需要ApplicationContext(因此将调用SpringApplication.run(来获取该类的一个具有值的实例(bean(。。。

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

更新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">

您可以尝试这种注入属性的方式。这使用了一个更简单的便利类SpringApplication而不是SpringApplicationBuilder

MainClass.java

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

application.yaml将由Spring Boot自动加载到上下文中(除非您针对它进行了配置(。属性可以重复使用、重新定义(使用配置文件(,系统/环境变量也可以使用。

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

应用程序.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
}
}

相关内容

  • 没有找到相关文章

最新更新