2014-01-29 53 views
3

我想创建一个portlet(我们称之为'Action Manager'),以列出同一页面中所有portlet的所有操作方法(使用spring Annotation @ActionMapping)作为我的动作管理器portlet。从另一个Portlet获取Portlet应用程序上下文(Liferay + Spring)

我的所有其他portlet使用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> 

所以我的目的是要得到我的当前页面上的所有portlet(我已经这样做)地图,并尝试从每个portlet获取parameterHandlerMapping bean,并从那里获取其控制器名称(Controller1,Controller2),我稍后将使用它来获取@ActionMapping带注释的方法。

是否可以访问每个Portlet“私有”上下文并检索parameterHandlerMapping bean?

我目前坚持了这一点:

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。我试图通过bean的名字得到它,结果几乎相同。

我也得到了使用

String beanNames[] = ctx.getBeanNamesForType(Object.class); 
for (String beanName : beanNames) { 
    System.out.println(beanName); 
} 

所有出现在上下文中的豆列表和parameterHandlerMapping bean是不存在的。

这是我的理解是每个portlet都有自己的parameterHandlerMapping豆,所以我想ctx我得到的是“全球性”方面,而不是在portlet自己的“私有”上下文,其中parameterHandlerMapping豆定义。

如果我是正确的,我得到的“全局”上下文,有没有办法根据它的portletId获取portlet的“私有”上下文?是否有可能做我想做的事?

感谢您对所有您的帮助

回答

0

您可以使用:

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

得到你想要给他们每个人的情况下,名称的每个portlet一个BeanLocator对象。 从那里,你可以使用:

locator.locate("bean-id") 

传递bean的id,得到你想要的豆。

但是,您需要确保所有这些portlet都部署在服务器中,否则您可能会遇到异常。确保这一点的一种方法是将这些portlet声明为其Liferay插件包属性中Action Manager portlet的必需上下文,从而确保这种方式除非所有其他Portlet已部署在Web服务器中,否则将不会部署Action Manager portlet 。

p.s.我指的是Liferay版本6.0