2016-11-11 12 views
1

私はWEB-INFフォルダにあるSpringを使ってプロパティファイルをロードしようとしています。なぜSpringのPropertySourceはFileNotFoundExceptionをスローしますか?

私は、次のエラーが発生します:ここで

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.elastictest.config.ProdConfig]; nested exception is java.io.FileNotFoundException: \WEB-INF\config\prod.properties (The system cannot find the path specified)

は私のプロダクション設定ファイルである:ここで

@Configuration 
@Profile("prod") 
@PropertySource("file:${prodPropertiesFile}") 
public class ProdConfig { 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

} 

は私のweb.xmlの宣言です:

<context-param> 
    <param-name>prodPropertiesFile</param-name> 
    <param-value>/WEB-INF/config/prod.properties</param-value> 
</context-param> 

私が開いています戦争を確認し、プロパティファイルがWEB-INF/configフォルダの下にあることを確認しました。何か案は?

答えて

-1

web.xml宣言は不要です。これは

@PropertySource(name="prodPropertiesFile", value="classpath:/WEB-INF/config/prod.properties") 
public class ProdConfig { 
} 
+0

コンテキストパラメータのwen.xml宣言を削除した場合、prodPropertiesFileは何を参照するのですか – user1154644

+0

私のやり方を試しますか?春には必要ありません4.名前と値があります。名前はhttp://で確認できますdocs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html –

+0

はい、私は同じ結果を試しました。私は本当にこの1つに困っています – user1154644

-1

それは私がそれを作っていたよりも簡単であることが判明したように試してみてください。

@PropertySource("/WEB-INF/config/prod.properties") 
3

locationsあなたは@PropertySource注釈内に指定ResourceLoaderによって処理されています。この場合は、AnnotationConfigWebApplicationContextになります。これはWebアプリケーションであり、アノテーション設定を使用したいからです。 AnnotationConfigWebApplicationContextResourceオブジェクトを検索し、初期化するために場所値を解決する方法を知っているResourceLoader実装として

。これらを使用してプロパティの解決に使用されるオブジェクトResourcePropertySourceを作成します。

位置値の解像度はいくつかの手順に従う:

  • /で始まる場合、それはサーブレット・コンテキスト・リソースとServletContext#getResourceAsStreamを通してそれを取得するスプリング試みとして解釈されます。
  • classpath:で始まる場合、それはクラスパスリソースとして解釈され、Springは適切なClassLoaderが与えられた場合、ClassLoader#getResourceAsStreamで取得しようとします。
  • それ以外の場合は、UrlResourceに解決を延期し、URLを使用してリソースを特定します。そのjavadocの状態、あなたの場合は

    Supports resolution as a URL and also as a File in case of the "file:" protocol.

春はUrlResourceを使用しようとしたので、あなたはfile:とあなたの場所を接頭辞。あなたのパスは、ファイルシステムが絶対パスの先頭とみなす先頭の/を持っていました。あなたは明らかにその場所にファイルがありません。/WEB-INF/config/prod.properties

接頭辞classpath:this answerに示すように使用する場合は、/WEB-INF/config/prod.propertiesがクラスパス上にあることを確認する必要があります。それはクラスパスを置くのは非常に珍しいことですので、私はそれをお勧めしません。あなたが出て見つけたとして

最後に、あなたはServletContextを通じてリソースを取得しようとします

@PropertySource("/WEB-INF/config/prod.properties") 
// or to support your property 
@PropertySource("${prodPropertiesFile}") 

を使用することができます。そのjavadocの状態は

The path must begin with a / and is interpreted as relative to the current context root

あなたWEB-INFフォルダには、コンテキストルート(Webアプリケーションのルートとして、あなたのサーブレットコンテナ用に選択された基本的にはディレクトリ)になりますので、資源が発見され、使用されます。


あなたは公式ドキュメント、hereResourceについての詳細を読み、そしてResourceLoaderプロセス、hereについてすることができます。

+0

OPと私の素晴らしい説明。私は書くことと説明の多くはあまり良くありません:) –

関連する問題