2011-09-20 7 views
27

私のSpring 3.0アプリケーションでは、私は/WEB-INF/dirにいくつかのリソースを持っています。実行時に私はInputStream(または他のタイプ)としてそれらのいくつかを必要とします。どうすればそれらを取得できますか?通常のように注入することは可能ですかResource春3.0はリソースとしてファイルを注入します

答えて

54

は注釈を経由してそれを行うための最も簡単な方法です:

import org.springframework.core.io.Resource; 

@Value("classpath:<path to file>") 
private Resource cert; 
+0

これはかなりクールです! – Kong

+1

ディレクトリはどのようにロードできますか?たとえば、25個のファイルを含むディレクトリ "dir" –

+0

これはかなりクールですが、jarファイル内では機能しない可能性があります。 –

2

あなたが使用することができるはずです:

appContextは、あなたの春 ApplicationContextある
Resource resource = appContext.getResource("classpath:<your resource name>"); 
InputStream is = resource.getInputStream(); 

+0

' Resource'インターフェースは 'getInputStream()'メソッドを宣言していないので、 'new FileInputStream(resource.getFile())'を呼び出す必要があります。 –

+0

これは間違っています。 'Resource'はそれを' org.springframework.core.io.InputStreamSource'インターフェースから継承します – Saket

+0

私の悪い、申し訳ありませんが、 'implements'を見ませんでした。 –

-1

あなたは春の依存性を導入しない場合(具体的には、WebApplicationContext、あなたはWebアプリケーションを持っているので) Populate Spring Bean's File field via Annotation

+0

私は、その質問に対する答えがSpringへの依存度の低下をどのようにもたらすのか見当たりません。 –

+0

@Valueの使用はゼロのスプリング依存性ではないことに同意します。 –

+1

しかし、注釈は、反復自己の原則に違反することなく春の噴射を達成するための最良の方法です。推奨するXMLアプローチは、あなた自身を繰り返すことを強いられます。遅かれ早かれ、誰かがJavaファイル内のプロパティ名を変更し、Spring Bean定義ファイルを更新することを忘れてしまいます。 –

5

すべてApplicationContextは、定義上、ResourceLoaderです。これは、構成内で見つかったすべてのリソース文字列を解決できることを意味します。これを念頭に置いて、org.springframework.core.io.Resourceを受け入れるセッターでターゲットBeanを宣言できます。次に、ターゲットBeanをコンフィグレーションするときは、プロパティの値にリソースパスを使用します。 Springはコンフィグレーション内のStringの値をResourceに変換しようとします。

public class Target { 
    private Resource resource; 
    public void setResource(final Resource resource) { 
    this.resource = resource; 
    } 
} 

//configuration 
<beans> 
    <bean id="target" class="Target"> 
    <property name="resource" value="classpath:path/to/file"/> 
    </bean> 
</beans> 
1

ここでは、クラスパスリソースを取得するための完全な例を示します。私はJavaクラスに格納したくない、本当に複雑なクエリ持っているSQLファイルをつかむためにそれを使用します。ここでは

public String getSqlFileContents(String fileName) { 
    StringBuffer sb = new StringBuffer(); 
    try { 
     Resource resource = new ClassPathResource(fileName); 
     DataInputStream in = new DataInputStream(resource.getInputStream()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) { 
      sb.append(" " + strLine); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return sb.toString(); 
} 
関連する問題