Получить контекст приложения портлета из другого портлета (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

Другие вопросы по тегам