我尝试创建一个配置类,使用@PropertySource注释从文件加载应用程序属性,但PropertySourcesPlaceholderConfigurer似乎没有设置从注释中接收的位置。
@Configuration
@ComponentScan("com.just.a.test")
@PropertySources({
@PropertySource(value="file:C:\\tmp\\1.cfg"
, ignoreResourceNotFound=true)
})
public class TestConfig {
@Value("${just.a.string}")
String justAString;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
return propertySourcesPlaceholderConfigurer;
}
}
应用程序属性文件是:
just.a.string=DOH
我收到以下异常:
.... 引起:java.lang.IllegalArgumentException:无法解析占位符&just.a.string'在字符串值" $ {just.a.string}"
在org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:174)
在org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
在org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:204)
在org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:178)
在org.springframework.context.support.PropertySourcesPlaceholderConfigurer $ 2.resolveStringValue(PropertySourcesPlaceholderConfigurer.java:175)
在org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:801)
在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:955)
在org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
......还有15个
但是,如果我使用PropertySourcesPlaceholderConfigurer bean设置位置,一切正常。
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
propertySourcesPlaceholderConfigurer.setLocation(new FileSystemResource("c:\\tmp\\1.cfg"));
return propertySourcesPlaceholderConfigurer;
}
我正在使用Spring 4.1.6-RELEASE和jdk 8.05。
提前感谢。
更新1
如sivaprasadreddy.k所述。上面的代码确实工作正常,我忘了在我的原始代码中我使用 -
从JVM参数中检索文件@PropertySource(value="file:#{systemProperties['config.path']}"
并传递了一个jvm参数:
-Dconfig.path=C:\\tmp\\1.cfg
@Sotirios - 我只是使用像这样的AnnotationConfigApplicationContext(Class) -
public static void main(String[] args) {
new AnnotationConfigApplicationContext(TestConfig.class);
}
更新2
基本上我想要实现的是:
1)使用jvm param加载属性文件,其名称定义为const
a)如果找到该文件,则继续
b)否则,如果存在定义为const的默认文件路径,则继续
c)否则继续。
2)尝试使用其名称定义为const
的属性来解析@Valuea)如果发现继续
b)否则使用const。
加载默认值 抱歉这些空间。编辑出了点问题。答案 0 :(得分:1)
考虑您的编辑
@PropertySource(value="file:#{systemProperties['config.path']}"
你必须首先意识到@Configuration
类(及其注释)在其中声明的@Bean
之前被解析和处理。换句话说,在Spring处理PropertySourcesPlaceholderConfig
注释时,您的#{..}
(确定@PropertySource
占位符的解析)尚未注册。它不可用。
相反,Spring可以执行PropertySourcesPlaceholderConfig
提供的行为的子集,只有${..}
占位符。 (See the javadoc。)并且它只能使用已在ApplicationContext
的{{1}}注册的媒体资源。在您的示例中,(应该)只有两个来源,即系统属性和系统环境。
符号
Environment
陈述:在名为systemProperties['config.path']
的属性来源中提供属性config.path
的值。我不确定Spring检查上面命名的属性源的顺序,但是如果你知道只有你的系统属性(而不是环境)有systemProperties
属性,你可以简单地使用
config.path
答案 1 :(得分:-1)
尝试:
@Configuration
@ComponentScan("com.just.a.test")
@PropertySource(value = {"file:C:/tmp/1.cfg/application.properties",
"classpath:config.properties" //if same key, this will 'win'
}, ignoreResourceNotFound = true)
public class TestConfig {
@Value("${just.a.string}")
String justAString;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
return propertySourcesPlaceholderConfigurer;
}
}