2015-07-02 2 views
0

Я использую весенний ботинок для проекта. В этом проекте мне нужно импортировать applicationContext.xml из другого проекта, как следующий код:ServletContextParameterFactoryBean без web.xml

@SpringBootApplication 
@EnableSwagger 
@EnableEntityLinks 
@ImportResource("classpath:applicationContext.xml") 
public class MyApplication { 

    public static void main(String[] args) { 
    SpringApplication.run(MyApplication.class, args); 
    } 

    @Bean 
    public CurieProvider curieProvider() { 
    return new DefaultCurieProvider("pm", new UriTemplate("http://www.xpto.com/docs/pm/rels/{rel}")); 
    } 
} 

Один из бобов на applicationContext.xml имеет следующий аспект:

<bean id="configLocation" class="org.springframework.web.context.support.ServletContextParameterFactoryBean"> 
    <property name="initParamName"> 
    <value>propertiesLocation</value> 
    </property> 
</bean> 

Теперь я требуется определить propertiesLocation без использования web.xml со следующим:

<context-param> 
    <description> 
    </description> 
    <param-name>propertiesLocation</param-name> 
    <param-value>file:/a/b/c/application.properties</param-value> 
</context-param> 

Я перепробовал все решения, которые я нашел, но без успеха (например, How to set context-param in spring-boot). Когда я создаю проект, он всегда жалуется на недостающие свойства. Есть ли какое-либо решение, которое не связано с web.xml или изменениями в applicationContext.xml?

Когда я пытаюсь сделать «МВН весна-загрузки: запустить», он терпит неудачу с IllegalArgumentException:

java.lang.IllegalArgumentException: Resource must not be null 
    at org.springframework.util.Assert.notNull(Assert.java:112) 
    at org.springframework.core.io.support.EncodedResource.<init>(EncodedResource.java:82) 
    at org.springframework.core.io.support.EncodedResource.<init>(EncodedResource.java:67) 
    at org.springframework.core.io.support.PropertiesLoaderSupport.loadProperties(PropertiesLoaderSupport.java:175) 
    at org.springframework.core.io.support.PropertiesLoaderSupport.mergeProperties(PropertiesLoaderSupport.java:156) 
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:80) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:265) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:162) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:606) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:462) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
    at com.nsn.oss.pm.api.MyApplication.main(MyApplication.java:28) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.boot.maven.RunMojo$LaunchRunner.run(RunMojo.java:418) 
    at java.lang.Thread.run(Thread.java:724) 

Другой проект, который я использую в качестве руководства используются следующие web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    <display-name>portal</display-name> 
    <context-param> 
     <description></description> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:/datasourceContext.xml 
      classpath:/applicationContext.xml 
      classpath:/aopContext.xml 
      classpath:/mailContext.xml 
     </param-value> 
    </context-param> 
    <context-param> 
     <description> 
     </description> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>classpath:/log4j.properties</param-value> 
    </context-param> 
    <context-param> 
     <description> 
     </description> 
     <param-name>propertiesLocation</param-name> 
     <param-value>file:/a/b/c/application.properties</param-value> 
    </context-param> 
    ... 

Итак, я пытаюсь настроить мой проект, как выше без web.xml

+1

Оба решения (с использованием 'ServletContextInitializer' или настройки' server.context-parameters' в 'application.properties') в вопросе вы связаны с работой для меня. Возможно, вы можете поделиться примером проекта, который воспроизводит проблему? –

ответ

0

не используйте ServletContextParameterFactoryBean. Более новая версия весны использует PropertySourcePlaceholderConfigurer. Поэтому вместо этого используйте @Value("${propertiesLocation}"), который в зависимости от местоположения будет использовать контекст сервлета или не искать свойство. Поэтому, если вы можете удалить его, добавлено преимущество в том, что вы можете использовать свойства системы для переопределения свойств из контекста сервлета (или, например, их определения в JNDI).

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

Окончательное решение заключается в простом переопределении компонента с помощью метода @Bean. Что должно дать вам преимущество использования PropertySource s.

@Autowired 
private Environment env; 

@Bean 
public String configLocation() { 
    return env.getRequiredProperty("propertiesLocation"); 
} 
+0

Изменение определения bean-компонента на applicationContext.xml - это мой последний ресурс. Я уже пытался добавить в application.properties, и когда я делаю mvn clean install, фаза тестов вызывает beanCreationException, потому что не может найти свойства параметра init init. –

+0

Неужели это происходит из-за параметра init или из-за отсутствия «ServletContext»? Можете ли вы добавить тестовый пример к своему вопросу и уточнить, что это касается тестового приложения, а не приложения времени выполнения ... –

+0

Я исправил тесты. Ошибка выполнения во время выполнения приложения –

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