使用PropertyPlaceholderConfigurer使用Apache Commons Config与Spring项目集成库时遇到问题

时间:2012-05-25 19:39:27

标签: spring properties apache-commons-config

我有一个发送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如何加载这些属性的了解相当浅薄,因此这似乎是一个更好地处理幕后内容的机会。

如果有人能够了解正在发生的事情以及如何解决或解决问题,我们非常感谢任何帮助!

1 个答案:

答案 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*:表示法。