2016-11-11 154 views
1

我正在嘗試使用Spring加載屬性文件,該文件位於我的WEB-INF文件夾中。爲什麼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

您是否嘗試我的方式?春季不需要。您有名稱和值。您可以使用name.Check http:// docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/PropertySource.html –

+0

是的,我試過了,結果相同。我真的很難過這個 – user1154644

-1

它竟然是簡單的比我使其:

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

locations@PropertySource註釋中指定由ResourceLoader處理。在這種情況下,這將是您的AnnotationConfigWebApplicationContext,因爲這是一個Web應用程序,並且您想要使用註釋配置。

作爲ResourceLoader實施,AnnotationConfigWebApplicationContext知道如何解決位置值查找並初始化Resource對象。它使用這些來創建ResourcePropertySource在屬性解析中使用的對象。

位置值分辨率如下幾個步驟:

  • 如果有/開始,它解釋爲一個servlet上下文資源和Spring試圖通過ServletContext#getResourceAsStream進行檢索。
  • 如果它以classpath:開頭,它會被解釋爲類路徑資源,並且Spring會通過ClassLoader#getResourceAsStream嘗試檢索它,並給定合適的ClassLoader
  • 否則,它將解決方案推遲到使用URL定位資源的UrlResource。它的Javadoc指出

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

在你的情況,你file:所以Spring試圖用UrlResource前綴您的位置。您的路徑具有領先的/,文件系統將其視爲絕對路徑的開始。你顯然沒有在該位置的文件,/WEB-INF/config/prod.properties

如果按照this answer中的建議使用classpath:前綴,則必須確保/WEB-INF/config/prod.properties位於類路徑中。這是放在classpath上的一件很不常見的事情,所以我不推薦它。

最後,當你找到了,你可以使用

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

將嘗試檢索通過ServletContext的資源。它的Javadoc指出

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

WEB-INF文件夾將在上下文根(基本上選擇了你的Servlet容器作爲Web應用程序的根目錄)等資源會被發現和使用。


您可以在官方文檔,here在閱讀更多關於Resource,以及有關ResourceLoader過程,here

+0

OP和我的很好的解釋。我並不擅長寫作和解釋:) –

相關問題