Spring MVC: как загрузить @PropertySource из WEB-INF - PullRequest
2 голосов
/ 02 февраля 2012

Я использую Spring MVC с конфигурацией Java.

И у меня есть два класса конфигурации контекста: 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 файл в classpath. Но я хочу, чтобы он был в каталоге / WEB-INF / config.

Есть предложения, как решить эту ошибку?

Должен ли я поставить @PropertySource("/WEB-INF/config/application.properties") строку в ServletContext вместо RootContext ??

Спасибо.

Ответы [ 4 ]

2 голосов
/ 29 августа 2012

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

Вы можете сделать это, установив 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 голос
/ 19 августа 2015

Включите 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, которые не инициализируют прослушиватели перед сервлетами.

1 голос
/ 16 сентября 2014

Если вы используете Spring версии 3.2.x, обратитесь к системе отслеживания проблем этой проблемы

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

0 голосов
/ 02 февраля 2012

Весной доступно несколько ResourceLoaders.Вероятно, по умолчанию используется класс ClassPathResourceLoader, который предполагает, что ресурс можно найти где-то в вашем пути к классам (например, / WEB-INF / classes)

Я бы предложил либо изменить загрузчик ресурсов, либосделайте его FileSystemResourceLoader или поместите ваши файлы конфигурации в пакет где-нибудь в пути к классам.

Я предпочитаю более поздний вариант, так как файлы конфигурации вне пути к классам всегда беспорядок при развертывании вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...