自定义PropertyPlaceholderConfigurer无法解析

时间:2019-05-29 12:20:06

标签: spring-boot

嗨,我是Spring Boot的新手(但是已经在我的应用程序中使用Spring一段时间了)。我正在尝试使用基于SSM PropertyPlaceholderConfigurer的自定义SSM Client,除了常规application.properties中的属性之外,它还从AWS SSM读取我的属性。 这段代码在我的spring-boot之前的应用程序中可以正常工作。但是,在新应用程序中,我看到它覆盖了application.properties。这似乎是一个有据可查的问题。

因此,我决定将application.properties文件包含在我的自定义PropertyPlaceholderConfigurer类中,并将所有属性一起加载,但是它仍然无法解析application.properties中标记为“ $ {}”的任何属性,并且无法通过我的自定义进行解析位置。我还需要做什么?

作为替代方案,我试图拥有需要从SSM加载以通过EnvironmentPostProcessor进行加载的属性,但是此时在加载过程中无法连接到AWS SSM服务器(不确定原因)

1 个答案:

答案 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);
    }




}