2012-01-05 4 views
1

私はspring/tomcatからいくつかのxmlマーシャリングを試みています...私のアプリケーションはWARファイルとして通常どおりに配備されています。ファイルは実際に正しい場所WEB-INF/classes/myData.xmlにコピーされますが、私はJavaと特に私のスプリングサービス層からこれにアクセスする方法がわかりません。通常、私はアプリケーションコンテキスト自体からのファイルにアクセスします。SpringとTomcat内のjavaからファイルシステムにアクセス

は、私がこれやりたい:

final File xml = new File("WEB-INF/classes/myData.xml"); 

を私のdevの中で、それはFに行くの構築:\日食\ WEB-INF \クラス\ myData.xmlはなく、展開ディレクトリ内のTomcat

春、Javaのでこれを行うにはクリーンな方法で

答えて

6

ClasspathResourceを使用している。また

Resource myData = new ClasspathResource("myData.xml"): 

、これは仕事をしているのSpring Beanの場合あなたはXMLからそれを注入することができます。 myResourceと仮定

<property name="myResource" value="classpath:myData.xml"/> 

は...タイプ ResourceのあなたのSpring BeanにJavaBeanのプロパティです。

ディレクトリは自動的にサーバーのクラスパス上にあります。パスに明示的に指定する必要はありません。

Resourceインターフェースは、データ自体のホールドを取得するためのさまざまな方法を提供しています(例えばgetInputStream())あなたは、リソースへのパスを取得すると判断された場合

1

、あなたはそのURLを取得することができ、その後のように、それを解析この:あなたのリソースは、JARアーカイブからではなく、あなたのファイルシステム内のフラット・ファイルから直接読み込み、Fileオブジェクトを介したので、実際にはアクセスできませんすることができる。

URL url = getClass().getResource("/WEB-INF/web.xml"); 
    String path = url.toString(); 
    if (path.startsWith("file:/")) { 
     path = path.substring("file:/".length()); 
     File file = new File(path); 
     ...do something with the file... 
    } 

注意すべき点は、しかし、があります。上のコードはJBoss(Tomcatを含む)で動作しましたが、JBossはそれを展開する前にWARアーカイブを展開しています。純粋なTomcatでも同様です。

主な質問は、なぜリソースをFileオブジェクトの形で取得したいのですか?たぶんURLを取得するだけで十分ですか?それとも、読み込みアクセスが必要なのでしょうか?

あなたが必要とするすべてのアクセスを読んでいる場合は、(上記のweb.xmlのように)あなたのクラスパス上の任意のリソースを取得する最も簡単な方法は、単純に呼び出すことである:

InputStream in = getClass().getResourceAsStream("/WEB-INF/web.xml") 

あなたは、ファイルへの書き込みアクセスをしたい場合、もっと良い解決策はディレクトリを事前に設定し(例えばweb.xml経由で)、そこに必要なすべてのファイルを(例えば上記のgetResourceAsStreamメソッドを介して)解凍し、あらかじめ定義されたディレクトリから編集してアクセスすることですこれはアプリケーションサーバーから独立しています。