2012-02-01 2 views
2

私はSpring MVCをjavaの設定で使用します。Spring MVC:WEB-INFから@PropertySourceをロードするには

私は2つのコンテキスト構成クラス、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")行をRootContextの代わりにServletContextに入れる必要がありますか?

ありがとうございます。

答えて

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固有のものになります:-( –

+0

'@ PropertySource'の中で' $ {catalina.home} 'を直接使用できますか? –

0

春には複数のResourceLoaderが利用できます。デフォルトでpropably使用されているクラスパスリソースは、クラスパスのどこかにあるリソース(例えば/ WEB-INF/classes)があると仮定します。

私はリソースローダーを変更してFileSystemResourceLoaderを使用するか、設定ファイルをクラスパスのどこかのパッケージに入れてください。

アプリケーションをデプロイするときに、クラスパス以外の構成ファイルが常に混乱するので、私は後の方が好きです。

0

他のリスナーの前にweb.xmlWebAppRootListenerを含めてください。システムプロパティ${webapp.root}に正しいパスが設定されます。

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

LogbackConfigListenerLog4jWebConfigurerも同じことを行うよう

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

次に、あなたがそれを使用することができます。これらのクラスは、ServletContextListenerを実装し、servletContext.getRealPath("/")を使用してパスを取得します。

サーブレットの前にリスナーを初期化していないサーブレット2.2コンテナおよびサーブレット2.3のコンテナでは、これは機能しないことに注意してください。

関連する問題