2012-02-01 2 views
2

Я использую Spring MVC с конфигурацией java.Spring MVC: Как загрузить @PropertySource из WEB-INF

И у меня есть два класса конфигурации контекста: RootContext и ServletContext.

класс RootContext загружается через <context-param> в web.xml

Вот код 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

Я знаю, что это поздний ответ, но я надеюсь, что это может быть полезно для тех, кто имеет ту же проблему.

Вы можете сделать это, установив context-param в свой web.xml и получив доступ к нему в классе конфигурации с помощью @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

Можно ли использовать '$ {catalina.home}' inside '@ PropertySource' напрямую? –

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{ 

LogbackConfigListener и Log4jWebConfigurer также делать то же самое.Что эти классы делают, это реализовать ServletContextListener и захватить путь, используя servletContext.getRealPath("/").

Примечание. Это может не работать для контейнеров Servlet 2.2 и Servlet 2.3, которые не инициализируют прослушиватели перед сервлетами.

Смежные вопросы