У меня есть веб-приложение с несколькими весенними портлетами. Каждый портлет имеет XML-файл с объявленным контроллером, но службы, используемые контроллерами, помещаются в applicationContext.xml. Я знаю, что для каждого портлета создается один контекст приложения Spring (из собственного файла xml), и каждый этот контекст имеет в качестве корневого контекста контекст приложения Spring, созданный из applicationContext.xml. То есть все bean-компоненты, объявленные в applicationContext.xml, являются общими для всех портлетов.
Итак, давайте рассмотрим пример:
xml для портлета example-portlet.xml: ... ...
контроллер ExampleController.java:
package example.controller;
@Controller
@RequestMapping(value = "VIEW")
public class NavigareController {
@Autowired
private ExampleService es;
...
}
applicationContext.xml:
...
<context:component-scan base-package="example.service />
...
служба ExampleServiceImpl.java:
package example.service;
@Service
public class ExampleServiceImpl implements ExampleService {
...
}
Когда сервер запускается с приложением внутри него, приложение запускается, и все работает нормально. Когда приложение переустанавливается, у меня возникает ошибка:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exampleController'...
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private example.service.ExampleService...
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [example.service.ExampleService]...
В результате портлет не запускается.
Я отладил исходники жизни и нашел следующий код:
package org.springframework.web.portlet
...
public abstract class FrameworkPortlet extends GenericPortletBean
implements ApplicationListener<ContextRefreshedEvent> {
...
protected ApplicationContext initPortletApplicationContext() {
ApplicationContext parent = PortletApplicationContextUtils.getWebApplicationContext(getPortletContext());
ApplicationContext pac = createPortletApplicationContext(parent);
...
Приведенный выше код в первом случае (когда сервер запускается с приложением внутри) возвращает не нулевого родителя, а во втором случае (когда приложение повторно развертывается) он возвращает нулевого родителя. Внутри PortletApplicationContextUtils.getWebApplicationContext(getPortletContext()) есть следующий код:
Object attr = pc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
Таким образом, в первом случае этот атрибут находится в контексте портлета, а во втором — вне контекста портлета. Проблема ясна, bean-компонент exampleService не найден в нулевом родительском объекте.
Возникает вопрос: Есть ли ошибка в процессе горячего развертывания?. Пожалуйста помогите!!!