web-dev-qa-db-ja.com

Spring Webアプリのクラスパスから(xml)ファイルをロードします

クラスパスからxmlファイルを取得してマーシャリングを解除し、テスト目的で使用したいと思います。私の問題は、それをInputStreamとして取得することです。私はこれらの行を書きましたが、常にnullの結果が得られます。

InputStream is = getClass().getResourceAsStream("WebContent/WEB-INF/classes/testing/"+ COMPLETE_DOCUMENT + ".xml");

もちろん、method引数に表示されるパスは、私のファイルへのパスです。私はいくつかの組み合わせを試しました:

WebContent/WEB-INF/classes/testing/
classpath:testing/
classpath*:testing/

しかし、私は常にInputStream = nullを取得します。

私も切り替えようとしました

 ClassLoader.getResourceAsStream(...)

しかし、何も起こりません。リソースへのパスがどういうわけか間違っていると思いますが、どこにあるのかわかりません。私のservlet.xmlから、構文だけでPropertyPlaceholderConfigurerまたはJaxb2Marshallerを構成するクラスパスのリソースを使用します

"classpath:folder/file.xsd"

そしてそれは完璧に機能します。 xmlをロードしたいフォルダーは、上記の例のフォルダーの兄弟です。何が足りないのですか?

EDIT: Spring ClassPathResourceヘルパークラスのアプローチに従おうとすると、奇妙な動作が発生します。前に述べたように、起動時にいくつかのSpringBeanによってクラスパスからいくつかのリソースが既にロードされています。次のようにdardoによって提案されたコードでそのようなリソースへのパスを使用する場合:

ClassPathResource cpr = new ClassPathResource("xmlschemas/lrinode.xsd");
InputStream is = cpr.getInputStream();

まだFileNotFound Exceptionを取得します!もちろん、"xmlschemas/lrinode.xsd"は起動時に正常にロードしたxsdです。アプリケーションのルートから始めて、リソースへのフルパスを使用しても機能しません。

些細なことが欠けていると思い始めています。

11
MaVVamaldo

Springは、ClassPathResourceという名前のヘルパークラスを提供します

だから次のようなもの:

ClassPathResource cpr = new ClassPathResource("folder/file.xsd");
InputStream is = cpr.getInputStream();

うまくいくはずです、これが役立つことを願っています!

APIドキュメントへのリンク: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/core/io/ClassPathResource.html

サイドノート

また、テスト目的で使用している場合は、xsdにマップされたBeanをワイヤリングすることをお勧めします。

JAXBマーシャラーを調べたいと思うかもしれません

http://static.springsource.org/spring-ws/site/reference/html/oxm.html#oxm-jaxb2-xsd

20
dardo

試したことのない組み合わせが必要です。

getClass().getResourceAsStream("/testing/"+ COMPLETE_DOCUMENT + ".xml");

WebContent/WEB-INF/classesディレクトリはすでにクラスパス上にあるはずです。

classpath:構文は、SpringのResourceLoader抽象化を使用している場合にのみ機能しますが、使用していません。 Springがclasspath:folder/file.xsdを自動的に解決するServletContextResourceLoaderを通過するため、servlet.xmlwoprksでのclasspath:の使用法。

3
skaffman

スラッシュを先頭にせずにリソース名を指定してClass.getResourceAsStream()を呼び出すと、現在のパッケージ(つまり、呼び出し元クラスのパッケージ)に関連するリソースを要求していると見なされます。絶対的なリソースパスにするには、リソース名に先頭のスラッシュを追加する必要があります。あなたの場合"/testing/"+ COMPLETE_DOCUMENT + ".xml"

0
Eugene Kuleshov