@VaultPropertySource 导致 VaultAutoConfiguration 失败

问题描述

我使用的是 Spring-Boot 2.4.0 和 org.springframework.cloud:spring-cloud-starter-vault-config:3.0.0

成功启动后,我发现了以下内容

@Bean
public Object see(@Value("${credentials}") String secretFromVault,VaultTemplate tpl) throws URISyntaxException {
    VaultResponse resp = tpl.read("secret/data/myapp");
    System.out.println("kv entries = " + resp.getData()); // This successfully show the secret
    System.out.println("secret = " + secretFromVault); // Sadly,this returns null
    return "hello";
}

所以,我尝试了另一种更简单的方法来定义它来读取值:

@Configuration
@VaultPropertySource("secret/data/myapp")
public class VaultConfig {

  @Autowired
  Environment env;

  @Bean
  public Object testBean() {
    System.out.println(env.getProperty("credentials") + "===============================");
    return new ArrayList<>();
  }
}

结果更糟,应用程序甚至无法启动。

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.vault.config.VaultAutoConfiguration]: No default constructor found; nested exception is java.lang.NoSuchMethodException: org.springframework.cloud.vault.config.VaultAutoConfiguration.<init>()
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:83) ~[spring-beans-5.3.1.jar:5.3.1]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateBean(AbstractAutowireCapablebeanfactory.java:1310) ~[spring-beans-5.3.1.jar:5.3.1]
    ... 46 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.springframework.cloud.vault.config.VaultAutoConfiguration.<init>()
    at java.base/java.lang.class.getConstructor0(Class.java:3349) ~[na:na]
    at java.base/java.lang.class.getDeclaredConstructor(Class.java:2553) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:78) ~[spring-beans-5.3.1.jar:5.3.1]
    ... 47 common frames omitted

解决方法

您的配置类缺少 extends 子句。

@Configuration
class VaultConfig extends AbstractVaultConfiguration {
// ...
}

https://spring.io/projects/spring-vault

,

实际上,您唯一需要做的就是让这个 bean 就位(除了正确配置):

@Component
public class VaultEnvironmentRegistrationBean implements InitializingBean {
    private final ConfigurableEnvironment environment;
    private final VaultTemplate vaultTemplate;
    @Value("${spring.application.name}")
    private String applicationName;

    public VaultEnvironmentRegistrationBean(ConfigurableEnvironment environment,VaultTemplate vaultTemplate) {
        this.environment = environment;
        this.vaultTemplate = vaultTemplate;
    }

    @Override
    public void afterPropertiesSet() {
        MutablePropertySources sources = environment.getPropertySources();
        sources.addFirst(new VaultPropertySource(vaultTemplate,"secret/" + applicationName));
    }
}

配置供您参考:

spring:
  application:
    name: management-ui-backend

  cloud.vault:
    host: 127.0.0.1
    port: 8200
    authentication: TOKEN
    token: s.Whatever9n
    scheme: http

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...