Я пишу пользовательский стартовый проект с весенней загрузкой, в котором у нас есть собственный класс 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?
Столкновение с несколькими проблемами:
-
VaultPropertiesConfiguration всегда вызывается первым, а @EnableConfigurationProperties и @autowired не работают.
Я запрограммировал код, чтобы обойти вышеуказанную проблему, но он пытается загрузить spring.messages Свойство .always-use-message-format из источника данных, которого у меня нет.