我使用Spring MVC和java config。
我有两个上下文配置类:RootContext
和ServletContext
。
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吗?
谢谢。
答案 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,请参阅此问题的问题跟踪器
答案 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{
LogbackConfigListener和Log4jWebConfigurer也会做同样的事情。这些类的作用是实现ServletContextListener
并使用servletContext.getRealPath("/")
获取路径。
注意,这可能不适用于Servlet 2.2容器和Servlet 2.3那些在servlet之前不初始化监听器的容器。
答案 3 :(得分:0)
春天有多个ResourceLoader可用。默认情况下可以使用的那个是ClassPathResourceLoader,它假定资源可以在类路径的某个地方找到(例如/ WEB-INF / classes)
我建议更改资源加载器并使其成为FileSystemResourceLoader,或者将配置文件放在类路径中的某个包中。
我更喜欢后者,因为在部署应用程序时,类路径之外的配置文件总是一团糟。