我想创建一个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的“私有”上下文?甚至可以做我想做的事情吗?
感谢您的帮助
答案 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版