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

时间:2014-01-29 10:14:04

标签: java spring liferay portlet spring-portlet-mvc

我想创建一个portlet(让我们称之为'Action Manager')列出与我的Action Manager portlet在同一页面中的所有portlet中的所有操作方法(使用spring Annotation @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>

所以我的目的是获取当前页面中的所有portlet(我已经这样做了)并尝试从每个portlet获取parameterHandlerMapping bean,并从那里获取其控制器名称({{ 1}},Controller1)我稍后将用它来获取Controller2注释方法。

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

我现在坚持这个:

parameterHandlerMapping

这会导致抛出异常,因为应用程序上下文中没有匹配的bean。我试图通过bean的名字来获取它,结果几乎是一样的。

我还使用

获得了上下文中存在的所有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);

}

并且String beanNames[] = ctx.getBeanNamesForType(Object.class); for (String beanName : beanNames) { System.out.println(beanName); } bean不存在。

我的理解是每个portlet都有自己的parameterHandlerMapping bean,所以我想我得到的parameterHandlerMapping是“全局”上下文而不是portlet自己的“私有”上下文{} {1}} bean已定义。

如果我是正确的并且我正在获得“全局”上下文,是否有办法根据其portletId获取portlet的“私有”上下文?甚至可以做我想做的事情吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用:

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

通过给出每个portlet的上下文名称来获取所需的每个portlet的BeanLocator对象。 从那里,您可以使用:

locator.locate("bean-id")

传递bean的id,获取你想要的bean。

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

P.S。我指的是Liferay 6.0版