Я хочу создать портлет (назовем его «Диспетчер действий»), чтобы перечислить все методы действий (используя Spring Annotation @ActionMapping
) из всех портлетов на той же странице как портлет моего менеджера действий.Получить контекст приложения портлета из другого портлета (Liferay + Spring)
Всех мои другие портлеты используют 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
от каждого портлета и, оттуда, получить его имена контроллеров (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);
}
Это приводит к выбросу исключения, потому что нет соответствия компонент в контексте приложения. Я попытался получить его по имени bean, и результат почти такой же.
Я также получил список всех бобов, присутствующих в контексте с использованием
String beanNames[] = ctx.getBeanNamesForType(Object.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
и parameterHandlerMapping
боб нет.
Это мое понимание того, что каждый портлет имеет свой собственный parameterHandlerMapping
боб, поэтому я предполагаю, что ctx
я получаю это «глобальный» контекст и не собственный «частный» контекст портлета, где определен parameterHandlerMapping
боба.
Если я прав, и я получаю «глобальный» контекст, есть ли способ получить «частный» контекст портлета на основе его portletId? Возможно ли сделать то, что я хочу?
Спасибо за вашу помощь