2014-01-29 3 views
3

Я хочу создать портлет (назовем его «Диспетчер действий»), чтобы перечислить все методы действий (используя 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? Возможно ли сделать то, что я хочу?

Спасибо за вашу помощь

ответ

0

Вы могли бы использовать:

com.liferay.portal.kernel.bean.PortletBeanLocatorUtil.getBeanLocator("portlet-context-name") 

, чтобы получить объект BeanLocator для каждого портлета вы хотите, давая имя-контекст каждого из них. Оттуда, вы могли бы использовать:

locator.locate("bean-id") 

передавая идентификатор боба, чтобы получить боб вы хотите.

Однако вы должны быть уверены, что все эти портлеты развернуты на сервере, иначе вы, вероятно, получите исключение. Чтобы обеспечить это, нужно объявить эти портлеты в качестве необходимых контекстов для вашего портлета Action Manager в своих свойствах пакета плагинов liferay, гарантируя, что портлет Action Manager не будет развернут, если все другие портлеты уже не развернуты на веб-сервере ,

p.s. Я имею в виду версию Liferay 6.0

Смежные вопросы