我有一个发送 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 如何加载这些属性的了解非常浅,所以这似乎是一个更好地处理幕后情况的机会。
如果有人可以阐明正在发生的事情以及如何修复/解决它,我们将不胜感激!