嗨,我是Spring Boot的新手(但是已经在我的应用程序中使用Spring一段时间了)。我正在尝试使用基于SSM PropertyPlaceholderConfigurer的自定义SSM Client,除了常规application.properties中的属性之外,它还从AWS SSM读取我的属性。 这段代码在我的spring-boot之前的应用程序中可以正常工作。但是,在新应用程序中,我看到它覆盖了application.properties。这似乎是一个有据可查的问题。
因此,我决定将application.properties文件包含在我的自定义PropertyPlaceholderConfigurer类中,并将所有属性一起加载,但是它仍然无法解析application.properties中标记为“ $ {}”的任何属性,并且无法通过我的自定义进行解析位置。我还需要做什么?
作为替代方案,我试图拥有需要从SSM加载以通过EnvironmentPostProcessor进行加载的属性,但是此时在加载过程中无法连接到AWS SSM服务器(不确定原因)>
答案 0 :(得分:0)
答案是使用EnvironmentPostProcessor。完美运作。参见下面的代码:
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import java.util.HashMap;
import java.util.Map;
/**
* This class loads SSM parameters base on region and environment
* Needs to be added to spring.factories class so that it will be invoked. as follow:
* org.springframework.boot.env.EnvironmentPostProcessor=<full package>.SSMEnvironmentPostProcessor
* Add the SSM propeties to other properties already set
*/
public class SSMEnvironmentPostProcessor implements EnvironmentPostProcessor {
private static final String QUOTE = "\"";
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
SSMClient ssmClient = new SSMClient(DefaultAWSCredentialsProviderChain.getInstance(), System.getProperty("env" +
".region"), new ClientConfiguration());
ssmClient.init();
Map<String, Object> parameters = new HashMap<>();
ssmClient.getParametersByPath("/" + System.getProperty("env"), true).entrySet().stream()
.forEach(entry -> parameters.put(entry.getKey(), entry.getValue()));
MapPropertySource mapPropertySource = new MapPropertySource("ssm", parameters);
environment.getPropertySources().addLast(mapPropertySource);
}
}