我面临一些挑战,根据另一个属性文件中提供的某些值创建PropertySourcesPlaceholderConfigurer。 我有一个属性文件custom- {environment} .property,它包含一个值,用于设置PropertySourcesPlaceholderConfigurer的位置。
My CustomConfiguration类似于:
@Bean
public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocation(customLocation);
//Custom url location based on a String available in the properties file. This is the problem area
return propertySourcesPlaceholderConfigurer;
}
我想从属性文件中填充此customLocation
。尝试自动装配环境,但是当调用placeholderConfigurer()
时环境为空,它失败了。尝试使用@PropertySource("custom-${environment}.property")
然后使用@Value("**customLocation**")
,但这也无效。
请让我知道如何做到这一点。提前谢谢。
答案 0 :(得分:1)
我建议添加ApplicationContextInitializer
来加载您的属性文件,而不是普通的@PropertySource
。首先在您的可配置属性文件旁边加载custom-{environment}.properties
。
public class PropertySourceInitializer implements ApplicationContextInitializer {
private static final String DEFAULT_CONFIG_FILE = "classpath:custom-${environment}.properties";
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
final ConfigurableEnvironment env = applicationContext.getEnvironment();
final MutablePropertySources mps = env.getPropertySources();
//
Resource resource = applicationContext.getResource(env.resolvePlaceholders(DEFAULT_CONFIG_FILE));
mps.addLast(new ResourcePropertySource(resource.getDescription(), resource));
String additional = env.getProperty("name.of.property");
if (StringUtils.hasText(additional) {
Resource additionalResource = applicationContext.getResource(env.resolvePlaceholders(additional));
if (additionalResource.isReadable() ) {
mps.addLast(new ResourcePropertySource(resource.getDescription(), resource));
}
}
}
}
尝试将其与@PropertySource
一起使用会更加困难,因为创建PropertySourcesPlaceHolderConfigurer
的阶段与扫描@PropertySource
注释的阶段不同。分阶段加载@PropertySource
(这基本上是你想要的)非常困难。 Spring Boot也有自己的加载机制(实际上也是ApplicationContextInitializer
。
答案 1 :(得分:0)
您可以尝试将您的位置设置为系统属性吗?
@Value("#{ systemProperties['myapp.location'] }")
private String location;
您需要将“myapp.location”设置为系统属性。