从另一个Portlet(Liferay + Spring)获取Portlet应用程序上下文

3
我希望创建一个portlet(称之为“Action Manager”),以列出在同一页面中与我的Action Manager portlet相同的所有portlet中的所有操作方法(使用spring注释@ActionMapping)。
我所有其他的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>

所以我的意图是获取当前页面上的所有端口,然后尝试从每个端口获取parameterHandlerMapping bean,并从中获取其控制器名称(Controller1Controller2),稍后我将使用这些名称获取@ActionMapping注释的方法。
能否访问每个端口的“私有”上下文并检索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的名称获取它,结果基本相同。

我还使用以下方法获取了上下文中存在的所有bean的列表

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

如果没有parameterHandlerMapping bean,则可能是由于其未在端口中定义。每个门户都有自己的parameterHandlerMapping bean,因此我猜测我得到的ctx是“全局”上下文,而不是该门户自己的“私有”上下文,其中定义了parameterHandlerMapping bean。

如果我的理解正确,并且我得到的是“全局”上下文,则是否有一种方法可以基于其portletId获取一个门户的“私有”上下文?我想做的事情是否可能?

感谢您的帮助

1个回答

0

你可以使用:

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

通过为每个想要的portlet提供其上下文名称来获取BeanLocator对象。从那里,您可以使用以下内容:

locator.locate("bean-id")

通过传递bean的ID,获取您想要的bean。

但是,您需要确保所有这些portlet都已部署在服务器上,否则可能会出现异常。一种确保方法是,在liferay插件包属性中将这些portlet声明为Action Manager portlet的必需上下文,以确保只有在所有其他portlet已经部署在Web服务器上时,Action Manager portlet才会被部署。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接