Liferay redeploy: корневой контекст пуст при повторном развертывании

У меня есть веб-приложение с несколькими весенними портлетами. Каждый портлет имеет 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 не найден в нулевом родительском объекте.

Возникает вопрос: Есть ли ошибка в процессе горячего развертывания?. Пожалуйста помогите!!!


person Mihai    schedule 27.09.2012    source источник
comment
Можете ли вы дать полную трассировку стека ошибки, которую вы получаете? А какая версия лайфрея? Какой пакет liferay tomcat или jboss или glassfish и т. д.?   -  person Prakash K    schedule 28.09.2012
comment
Не могли бы вы получить какую-либо подсказку, которая разрешила бы это чтение: "> stackoverflow.com/questions/5260119/   -  person mico    schedule 29.09.2012


Ответы (1)


Какая у вас версия Liferay? Если это 6.1.1, то это известная проблема.

http://issues.liferay.com/browse/LPS-29103

Если вам просто нужно развернуть портлеты один раз - измените порядок слушателей в web.xml вручную, как это предлагается в тикете.

Если вам нужно повторно развернуть портлеты (для разработки), то предыдущее решение требует очень много времени, и самый простой способ — сделать резервную копию исправления из ветки 6.2.0.

person František Hartman    schedule 02.10.2012