2012-02-01 157 views
2

我使用Spring MVC與java配置。Spring MVC:如何從WEB-INF加載@PropertySource

而且我有兩個上下文配置類:RootContextServletContext

RootContext類在web.xml

這裏通過<context-param>加載是RootContext的代碼:

@Configuration 
@EnableTransactionManagement 
@Import(DaoConfig.class) 
@PropertySource("/WEB-INF/config/application.properties") 
public class RootContext { 

    @Autowired 
    private Environment env; 

    @Bean(destroyMethod = "close") 
    public DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); 
     dataSource.setUrl(env.getProperty("jdbc.url")); 
     dataSource.setUsername(env.getProperty("jdbc.username")); 
     dataSource.setPassword(env.getProperty("jdbc.password")); 
     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() { 
     return new DataSourceTransactionManager(dataSource()); 
    } 
} 

如果我運行應用程序,我得到這個錯誤:

java.io.FileNotFoundException: class path resource [WEB-INF/config/application.properties] cannot be opened because it does not exist 

如果我將application.properties文件移動到類路徑,一切正常。但我希望它位於/ WEB-INF/config目錄中。

任何建議如何解決這個錯誤?

我應該把@PropertySource("/WEB-INF/config/application.properties")行改爲ServletContext而不是RootContext?

謝謝。

回答

2

我知道這是一個遲到的回覆,但我希望這可能對任何人有同樣的問題有用。

您可以通過在web.xml中設置context-param並使用@PropertyResource在配置類中訪問它。

的web.xml

<context-param> 
    <param-name>myProperties</param-name> 
    <param-value>${catalina.home}/conf/application.properties</param-value> 
</context-param> 

AppConfig.class

@Configuration 
@PropertySource("file:${myProperties}") 
public class AppConfig{ 

    @Autowired 
    Environment env; 
+1

使用catalina.home將會是Tomcat特有的:-( – 2013-07-01 10:29:56

+0

我們可以直接在@ PropertySource裏面使用'$ {catalina.home}'嗎? – 2015-08-16 19:38:20

0

春天有多個ResourceLoaders可用。默認使用的是ClassPathResourceLoader,它假定資源可以在類路徑的某處找到(例如/ WEB-INF/classes)

我建議更改資源加載器並將其設置爲一個FileSystemResourceLoader或者將你的配置文件放在類路徑中的某個包中。

我更喜歡後者,因爲在部署應用程序時,類路徑之外的配置文件總是亂七八糟。

0

WebAppRootListener包含在您的其他聽衆之前的web.xml中。它將使用正確的路徑設置系統屬性${webapp.root}

<listener> 
    <listener-class>org.springframework.web.util.WebAppRootListener</listener-class> 
</listener> 

然後你可以使用它作爲

@Configuration 
@PropertySource("file:${webapp.root}/my.properties") 
public class AppConfig{ 

LogbackConfigListenerLog4jWebConfigurer也做同樣的事情。這些類所執行的是執行ServletContextListener並使用servletContext.getRealPath("/")獲取路徑。

請注意,這可能不適用於Servlet 2.2容器和Servlet 2.3,它們在servlet之前未初始化偵聽器。

相關問題