Spring MVC:如何从WEB-INF加载@PropertySource

时间:2012-02-01 23:43:01

标签: spring-mvc

我使用Spring MVC和java config。

我有两个上下文配置类: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文件移动到classpath,一切正常。但我希望它在/ WEB-INF / config目录中。

有任何建议如何解决此错误?

我应该将@PropertySource("/WEB-INF/config/application.properties")行放到ServletContext而不是RootContext吗?

谢谢。

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您使用的是Spring版本3.2.x,请参阅此问题的问题跟踪器

https://jira.spring.io/browse/SPR-10401

答案 2 :(得分:1)

web.xml之前将WebAppRootListener包括在其他听众之前。它将使用正确的路径设置系统属性${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之前不初始化监听器的容器。

答案 3 :(得分:0)

春天有多个ResourceLoader可用。默认情况下可以使用的那个是ClassPathResourceLoader,它假定资源可以在类路径的某个地方找到(例如/ WEB-INF / classes)

我建议更改资源加载器并使其成为FileSystemResourceLoader,或者将配置文件放在类路径中的某个包中。

我更喜欢后者,因为在部署应用程序时,类路径之外的配置文件总是一团糟。