我正在使用Spring Framework 3.2.6.RELEASE。
我正在尝试使用命令行界面(使用JOptCommandLinePropertySource)通过
设置属性PropertySource<?> propertySource = new JOptCommandLinePropertySource(options);
final GenericApplicationContext context = new GenericApplicationContext();
context.getEnvironment().getPropertySources().addFirst(propertSource);
...
我有这个bean配置器:
package com.example;
@Configuration
public class AppConfig {
@Value("${prop1}")
private String prop1;
@Bean
public MyBean myBean() {
MyBean ret = new MyBean();
ret.init(prop1);
return ret;
}
}
我正在使用命令行参数启动我的程序: - prop1 = prop_value
如果我使用此xml进行初始化:
<beans>
<context:annotation-config />
<context:property-placeholder />
<context:component-scan base-package="com.example" />
</beans>
然后我收到此错误:无法在字符串值“$ {prop1}”中解析占位符'prop1'
13:47:36.932 [main] DEBUG o.s.b.f.annotation.InjectionMetadata - Processing injected method of bean 'AppConfig': AutowiredFieldElement for private java.lang.String com.example.AppConfig.prop1
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppConfig': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.example.AppConfig.prop1; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'prop1' in string value "${prop1}"
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289) ~[spring-beans-3.2.6.RELEASE.jar:3.2.6.RELEASE]
...
但是使用这个xml一切正常:
<beans>
<context:annotation-config />
<context:component-scan base-package="com.example" />
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="environment" ref="environment" />
</bean>
</beans>
为什么PropertySourcesPlaceholderConfigurer不检查Javadoc中定义的当前应用程序上下文环境?
PlaceholderConfigurerSupport的专业化,它针对当前的Spring环境及其PropertySources集解析bean定义属性值和@Value注释中的$ {...}占位符。
答案 0 :(得分:2)
使用命名空间配置时,建议使用无版本的xsd。因此,建议使用http://www.springframework.org/schema/context/spring-context-2.5.xsd
而不是http://www.springframework.org/schema/context/spring-context.xsd
。这可以确保spring将使用类路径上最新版本的xsd。
关于<context:property-placeholder />
关于默认配置,Spring 3.1中有一些,破坏(?)的变化。在Spring 3.1之前,system-properties-mode
属性的默认值为 FALLBACK ,在Spring 3.1中导致创建PropertyPlaceholderConfigurer
而不是PropertySourcesPlaceholderConfigurer
。默认值在特定的xsd中配置。 (好像Spring 3.1它是 ENVIRONMENT )。
因此,使用较旧的xsd会导致属于xsd特定版本的默认行为,请切换到3.2 xsd或无版本的xsd。 (如前所述,建议使用后者)。