2011-08-25 49 views
3

私は、PropertyPlaceholderConfigurerを使ってSpringに奇妙な問題があります。私の豆の一つは、以下のように設計されていますSpring:PropertyPlaceholderConfigurerがプロパティファイルを見つけることができません

<bean name="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:jdbc.properties</value> 
    </property> 
</bean> 

問題は春がjdbc.properties(FileNotFoundException)を見つけることはありませんということです。このファイルはバンドルクラスパスにある "resources"という名前のフォルダにあります(私はOSGiプロジェクトで作業しています)。

ほとんどすべての組み合わせ( "jdbc.properties"、 "/jdbc.properties"、 "classpath:jdbc.properties"、 "classpath:/jdbc.properties"、 "/resources/jdbc.properties"等...)しかしそれは決して働かない。

URL u = someClassLoader.getResource("jdbc.properties"); 

それは何の問題もなく作業を行い、ファイルを見つける:いくつかの点であれば

は情報については、私のような何かをします。実際に私は春のバグは何かを完全に理解することができません。

ご協力いただきありがとうございました。ありがとうございます。私は春にはあまり経験がないので、どこかでミスをしたことがあります。

[EDIT]

は実際には、クラスローダの問題だ:私が行う場合 :

new ClassPathResource("jdbc.properties"); 

それは動作しません。しかし:

new ClassPathResource("jdbc.properties",someClassIntheBundle.class.getClassLoader()); 

は完全に動作します。

Springは自分のバンドルで消費される独自のバンドルのClassLoaderを使用すると信じています。あなたはこのトリッキーな問題を解決する方法を知っていますか?

おかげで、

+0

現時点では、テストのためにconfig-fileにひどい静的パスを入れる必要があります(bundleresource://63.jhdjlzeo:2/jdbc.properties(これと同じです))。私は他の解決策を見いださなかった(下記の他のコメントを参照) – ThR37

答えて

2

は春のOSGiマニュアルをlinkclasspath*:jdbc.properties

+0

印象的な、それは動作する!あなたの助けをありがとう! – ThR37

+0

実際には、それはもはや不平はありませんが、場所も見つけられません。あなたの助けを借りて感謝します。クラスパスとの主な違いは何ですか? – ThR37

+0

長い答えは申し訳ありません。あなたは春[参考文献](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/resources.html)で見つけることができます。もちろん、PropertyPlaceholderConfigurerのサブクラスを作成し、 'MyConfigurer.class.getResourceAsStream()'を使ってpropファイルをロードすることもできます。 –

1

IANA OSGIの開発者が、迅速なGoogleの検索結果を試してみてください。セクション5.4を見て、spring-osgiパッケージがResourceローディングにいくつかの変更を加えることに注意してください。 osgiのデフォルトApplicationContextによって実装されたResourceLoaderは、他の接頭辞が指定されていない場合は自動的にosgibundle:がプリペイドされるようです。

classpath:を使用した場合に検索されるパスとclasspath*:を使用する場合に使用されるパスの間にある程度の違いがあるように見えますが、これまでのところ説明が分かりません。

+0

リンクをありがとう。私はおそらくそれを逃したでしょう。すべてのケースで調査する必要のある「奇妙な」ものがいくつかあります(classpath *:ではプロパティファイルが見つかりますが、それでもプレースホルダを解決できません。 。 – ThR37

+0

@ ThR37:現在のところドキュメントを見つけることができませんが、親 'ApplicationContext'の' PropertyPlaceholderConfigurer'にロードされたプロパティが 'インポートされた 'ApplicationContext'。 –

関連する問題