我有一个发送JMS通知的自定义库。我们的想法是只需在项目中设置一些属性即可使用库。
自定义库正在使用Apache Commons Configuration。 (我提到这个的原因是我怀疑它可能在我的问题中发挥作用)。我正在尝试在我当前的Spring项目中使用它,它不使用Commons Config但使用PropertyPlaceholderConfigurer。我已经在.properties文件中写了我需要的属性。
我在我的pom.xml文件中添加了库作为依赖项。我尝试将其添加到 web.xml 中,如此
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
...
classpath:mylibrary-context.xml
</param-value>
</context-param>
在我的Spring项目中创建bean时,我试图引用库中定义的一个bean,所以我可以使用它。创建一个需要我的属性文件中的属性的库bean时出错。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'libraryBean' defined in class path resource [mylibrary-context.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'useCompression'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [${foo.bar.use.compression}]
我知道项目中的一些其他属性文件的布尔属性设置完全相同,没有问题。以下是我在 applicationContext.xml 中加载属性文件的方法(在检查日志后,似乎正确加载)
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
...
<!-- loaded in order-->
<value>classpath:foo/bar/some-props.properties</value>
<value>classpath:foo/bar/some-monitoring.properties</value>
<value>file:/${user.home}/foo/bar/some-monitoring.properties</value>
<value>file:/etc/foo/bar/some-monitoring.properties</value>
</list>
</property>
<property name="ignoreResourceNotFound" value="true"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
最后是我的some-monitoring.properties文件:
foo.bar.use.compression=true
foo.bar.name=foobar
foo.bar.broker.url=someurl
所以我只是想知道布尔属性发生了什么,为什么?如果它是PropertyPlaceholderConfigurer的一般问题,没有加载布尔属性,奇怪的是我没有遇到其他属性文件的问题。由于库使用Commons配置,是否存在冲突?我对Spring如何加载这些属性的了解相当浅薄,因此这似乎是一个更好地处理幕后内容的机会。
如果有人能够了解正在发生的事情以及如何解决或解决问题,我们非常感谢任何帮助!
答案 0 :(得分:0)
在spring-dev列表中引用Jurgen:
PropertyPlaceholderConfigurer是BeanFactoryPostProcessor接口的一个实现:这个接口和它的兄弟 BeanPostProcessor只适用于定义它们的BeanFactory, 也就是说,定义它们的应用程序上下文。
如果将多个配置文件合并为一个 contextConfigLocation,一个在任何中定义的PropertyPlaceholderConfigurer 这些文件将应用于所有文件,因为它们已加载 在一个应用程序上下文中。
据我了解,您尝试将所有应用程序上下文组合到contextConfigLocation中。根据报价,它应该工作正常。我认为你还有其他问题。在我看来,boolean和string属性都没有加载。也许它似乎是在加载字符串属性时,但我认为它们的值设置为${foo.bar.name}
和${foo.bar.broker.url}
。由于它们是字符串,因此它们可以保留这些值。当Spring尝试将${foo.bar.use.compression}
设置为布尔值时,您会遇到类型问题,这只会揭示更广泛的问题。
可能,如果你设置:
<property name="ignoreResourceNotFound" value="false"/>
<property name="ignoreUnresolvablePlaceholders" value="false"/>
您会看到PropertyPlaceHolderConfigurer
无法解析您的属性文件。
当您引用其他JAR中的资源时,请尝试使用classpath*:
表示法。