java - 动态操作应用程序属性 - 保险库设置(或任何其他值)

标签 java spring-boot spring-cloud-vault-config

我希望能够在我的应用程序使用的 3rd 方组件之间灵活选择。 ATM 我有硬编码值

spring.cloud.vault.token=ffffffff-ffff-ffff-ffff-ffffffffffff
spring.cloud.vault.scheme=http
spring.cloud.vault.application-name=test
spring.cloud.vault.host=127.0.0.1
spring.cloud.vault.port=8200

目标是:
  • spring.cloud.vault.host设置尝试使用它。如 spring.cloud.vault.host是空用
    本地数据库代替(具有适当的配置)

  • 我的第一个想法是使用 environment变量如:
    spring.cloud.vault.token=${VAULT_TOKEN}
    spring.cloud.vault.scheme=${VAULT_SCHEME}
    spring.cloud.vault.application-name=${VAULT_APP_NAME}
    spring.cloud.vault.host=${VAULT_HOST}
    spring.cloud.vault.port=${VAULT_PORT}
    

    然后使用组件类,如:
    @Component
    public class VaultHelper {
        private final VaultOperations vaultOperations;
        @Value("${spring.cloud.vault.host}")
        String vaultHostname;
    
        @Autowired
        public VaultHelper(VaultOperations vaultOperations){
            this.vaultOperations = vaultOperations;
        }
    
        public void saveToVault(String password){
            if (!vaultHostname.equals("")) { 
                // Use vaultOperations to store password
            } else {
                // Use plaintext db storage
            }
        }
    
        public byte[] readFromVault(String passwordLoc){
            if (!vaultHostname.equals("")) {
                // Use vaultOperations to access password
            } else {
                // return plaintext password
            }
            return new byte[0];
        }
    
    
    }
    

    这样我就可以设置 ${VAULT_HOST}都来自环境变量(从 docker-compose 运行应用程序)或只是设置 --spring.cloud.vault.host=URL在本地机器上为 java范围。

    不幸的是,我在解析时遇到异常 ${VAULT_PORT} field
    Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [int] for value '${VAULT_PORT}'; nested exception is java.lang.NumberFormatException: For input string: "${VAULT_PORT}"
        at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:191) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.BindConverter$CompositeConversionService.convert(BindConverter.java:170) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.BindConverter.convert(BindConverter.java:96) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.BindConverter.convert(BindConverter.java:88) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.Binder.bindProperty(Binder.java:435) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:380) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:320) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE]
        ... 83 common frames omitted
    Caused by: java.lang.NumberFormatException: For input string: "${VAULT_PORT}"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_231]
        at java.lang.Integer.parseInt(Integer.java:569) ~[na:1.8.0_231]
        at java.lang.Integer.valueOf(Integer.java:766) ~[na:1.8.0_231]
        at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:211) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:62) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:49) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:436) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41) ~[spring-core-5.2.1.RELEASE.jar:5.2.1.RELEASE]
        ... 90 common frames omitted
    
    
    Process finished with exit code 1
    

    谁能给我一个提示如何使它工作?

    最佳答案

    我想事实上,您没有提供默认/后备。在这种情况下,当它找不到相应的环境变量时,它只是将字段 PORT 声明为给定的字符串。尝试使用 (:) 默认值。

    您还可以提供另一个变量作为默认值,您知道它将被设置。

    spring.cloud.vault.port=${VAULT_PORT}:9000
    
    
    spring.cloud.vault.port=${VAULT_PORT:8200}
    

    关于java - 动态操作应用程序属性 - 保险库设置(或任何其他值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60261834/

    相关文章:

    java - Bitmap 对象是否通过引用保存在内存中?

    java - spring boot找不到jsp View

    java - Junit 5 找不到测试(Spring Boot)

    java - 将本地目录中的 zip 文件放入 java spring boot 中的列表中

    spring-cloud - 将 Spring Cloud Vault Config 配置为从/secret 以外的位置拉取

    java - 线程联网导致空指针异常

    关于final关键字的Java基础

    hashicorp-vault - 未能创建客户端 : parse "http://127.0.0.1:8200": first path segment in URL cannot contain colon in Hashi-corp Vault

    java - 传递字符串对象时使用 apache poi 格式化日期

    spring-boot - Spring Cloud Vault - 存储 Secret-Id 和 Role-Id 的最佳位置