доступ к свойствам, загруженным из бэкэнда java объекта из @value - PullRequest
0 голосов
/ 09 марта 2020

Я пишу пользовательский стартовый проект с весенней загрузкой, в котором у нас есть собственный класс VaultFactory, который подключается к хранилищу на основе свойств потребителя, определенных в файле application.yml.

В пользовательском стартовом проекте я могу прочитать все секреты и соответствующие ценности. Теперь я хочу представить все эти пары ключ / значение в качестве источника свойств, чтобы потребители могли напрямую получать доступ через @ value

@Value{${some.vault.secret.name}}
private String value;

Код моего стартового проекта

@Configuration
@EnableConfigurationProperties(VaultConfiguration.class)
@ConditionalOnClass(VaultFactory.class)
public class VaultEnableAutoConfiguration {

    /**
     * @param vaultConfiguration
     * @return
     * @throws VaultException 
     */
    @Bean
    @ConditionalOnMissingBean
    public Vault getVaultFactoryByProperties(VaultConfiguration vaultConfiguration) throws VaultException {
        VaultFactory vaultFactory = VaultFactory.newInstance(vaultConfiguration.getVault().get("file.path"), vaultConfiguration.getVaultProperties());
        return vaultFactory.getVault("vault-01");
    }
}

@EnableConfigurationProperties(VaultConfiguration.class)
public class VaultPropertiesConfiguration {

    @Autowired
    Vault vault;

    @Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(VaultConfiguration vaultConfiguration) throws VaultException {

        PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
        ConfigurableEnvironment environment = new StandardEnvironment();
        MutablePropertySources ps = environment.getPropertySources();

        pspc.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
        pspc.setIgnoreUnresolvablePlaceholders(true);
        ps.addLast(new VaultPropertySource("vaultProperties", vault));
        pspc.setPropertySources(ps);
        return pspc;
    }

}
public class VaultPropertySource extends PropertySource<Vault>{

    Vault vault;

    public VaultPropertySource(String name) {
        super(name);
    }

    public VaultPropertySource(String name, Vault vault) {
        super(name);
        this.vault = vault;
    }

    @Override
    public Object getProperty(String name) {
        try {
            return vault.getSecret(name).getValue();
        } catch (VaultException e) {
            e.printStackTrace();
        }
        return null;
    }
}

@ConfigurationProperties("platform")
public class VaultConfiguration {

    private final Map<String, String> vault = new HashMap<>();

    public Map<String, String> getVault() {
        return vault;
    }

    public Properties getVaultProperties() {
        Properties p = new Properties();
        vault.entrySet().stream().forEach( e -> p.put(e.getKey(), e.getValue()));
        return p;
    }

}

Как я могу это сделать? По сути, просто если у меня есть карта ключа / значения в моем начальном проекте, как я могу сделать их доступными для загрузки приложения с помощью аннотации @value?

Столкновение с несколькими проблемами:

  1. VaultPropertiesConfiguration всегда вызывается первым, а @EnableConfigurationProperties и @autowired не работают.

  2. Я запрограммировал код, чтобы обойти вышеуказанную проблему, но он пытается загрузить spring.messages Свойство .always-use-message-format из источника данных, которого у меня нет.

1 Ответ

0 голосов
/ 09 марта 2020

Вы не можете использовать @Value с файлом .yml так же, как с файлом .properties.

Можете ли вы объяснить больше значение "я могу прочитать все секреты и соответствующие значения". Так как же это доступно в приложении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...