1

JMS 通知を送信するカスタム ライブラリがあります。プロジェクトでいくつかのプロパティを設定するだけでライブラリを使用できるという考え方です。

カスタム ライブラリは Apache Commons Configuration を使用しています。(私がこれに言及する理由は、それが私の問題で役割を果たしているのではないかと思うからです). Commons Config を使用せず、PropertyPlaceholderConfigurer を使用する現在の Spring プロジェクトで使用しようとしています。必要なプロパティを .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 の 1 つを参照しようとしたので、それを使用できました。プロパティ ファイルのプロパティを必要とするライブラリ Bean の 1 つを作成中にエラーが発生しました。

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}ます${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 に答える