1

我有一个发送 JMS 通知的自定义库。这个想法是您可以通过在项目中设置一些属性来使用该库。

自定义库正在使用 Apache Commons 配置。(我提到这一点的原因是我怀疑它可能在我的问题中起作用)。我正在尝试在我当前的 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 Configuration 的库而存在一些冲突?我对 Spring 如何加载这些属性的了解非常浅,所以这似乎是一个更好地处理幕后情况的机会。

如果有人可以阐明正在发生的事情以及如何修复/解决它,我们将不胜感激!

4

1 回答 1

0

在 spring-dev 列表中引用 Jurgen 的话:

PropertyPlaceholderConfigurer 是 BeanFactoryPostProcessor 接口的实现:该接口及其兄弟 BeanPostProcessor 只适用于定义它们的 BeanFactory,即适用于定义它们的应用程序上下文。

如果将多个配置文件组合到单个 contextConfigLocation 中,则在任何文件中定义的 PropertyPlaceholderConfigurer 将应用于所有文件,因为它们被加载到单个应用程序上下文中。

据我了解,您尝试将所有应用程序上下文组合到 contextConfigLocation 中。根据报价,它应该可以正常工作。我认为您还有其他问题。在我看来,布尔属性和字符串属性都没有加载。也许似乎加载了字符串属性,但我认为它们的值设置为${foo.bar.name}and ${foo.bar.broker.url}。由于它们是字符串,它们可以保存这些值。当 Spring 尝试设置${foo.bar.use.compression}为布尔值时,您会遇到类型转换问题,这只会揭示更广泛的问题。

可能,如果你设置:

<property name="ignoreResourceNotFound" value="false"/>
<property name="ignoreUnresolvablePlaceholders" value="false"/>

您将看到PropertyPlaceHolderConfigurer无法解析您的属性文件。

classpath*:当您引用来自其他 JAR 的资源时,也请尝试使用符号。

于 2012-05-26T19:50:52.113 回答