Получить контекст приложения портлета из другого портлета (Liferay + Spring)
Я хочу создать портлет (назовем его "Диспетчер действий"), чтобы вывести список всех методов действий (используя Spring Annotation). @ActionMapping
) из всех портлетов на той же странице, что и мой портлет Action Manager.
Все мои другие портлеты используют ParameterHandlerMapping
сопоставить входящие запросы с соответствующим контроллером
<bean id="parameterHandlerMapping" class="org.springframework.web.portlet.handler.ParameterHandlerMapping">
<property name="defaultHandler" ref="Controller1" />
<property name="parameterName" value="control" />
<property name="parameterMap">
<map>
<entry key="1" value-ref="Controller1" />
<entry key="2" value-ref="Controller2" />
</map>
</property>
</bean>
Поэтому я собираюсь получить все портлеты на моей текущей странице (я уже делаю это) и попытаться получить parameterHandlerMapping
bean-компонент из каждого портлета и оттуда получить имена его контроллеров (Controller1
, Controller2
), который я позже использовал, чтобы получить @ActionMapping
аннотированные методы.
Можно ли получить доступ к каждому "частному" контексту портлета и получить parameterHandlerMapping
фасоль?
Я в настоящее время застрял с этим:
PortletBag portletBag = PortletBagPool.get(portlet.getPortletId());
if (portletBag != null) {
ServletContext servletContext = portletBag.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ParameterHandlerMapping parameterHandlerMapping = (ParameterHandlerMapping) ctx.getBean(ParameterHandlerMapping.class);
}
Это приводит к исключению, потому что в контексте приложения нет соответствующего компонента. Я попытался получить его по имени боба, и результат был почти таким же.
Я также получил список всех бинов, присутствующих в контексте, используя
String beanNames[] = ctx.getBeanNamesForType(Object.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
и parameterHandlerMapping
боба нет.
Насколько я понимаю, каждый портлет имеет свой parameterHandlerMapping
боб, так что я думаю, ctx
я получаю это "глобальный" контекст, а не собственный "частный" контекст портлета, где parameterHandlerMapping
боб определяется.
Если я прав и получаю "глобальный" контекст, есть ли способ получить "частный" контекст портлета на основе его portletId? Можно ли вообще делать то, что я хочу?
Спасибо за твою помощь
1 ответ
Вы можете использовать:
com.liferay.portal.kernel.bean.PortletBeanLocatorUtil.getBeanLocator("portlet-context-name")
получить объект BeanLocator для каждого желаемого портлета, указав имя контекста для каждого из них. Оттуда вы можете использовать:
locator.locate("bean-id")
передавая идентификатор боба, чтобы получить боб, который вы хотите.
Однако вы должны быть уверены, что все эти портлеты развернуты на сервере, иначе вы, вероятно, получите исключение. Чтобы убедиться в этом, нужно объявить эти портлеты как необходимые контексты для вашего портлета Action Manager в его свойствах пакета подключаемых модулей liferay, гарантируя, что портлет Action Manager не будет развернут, если все остальные портлеты уже не развернуты на веб-сервере.,
ps я имею в виду Liferay версии 6.0