我想创建一个 portlet(我们称它为“Action Manager”)以列出与我的 Action Manager 相同的页面中所有 portlet 的所有操作方法(使用 spring Annotation @ActionMapping
)小门户。
我的所有其他 portlet 都使用 ParameterHandlerMapping
将传入请求映射到适当的 Controller
<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,然后从那里获取其 Controller 名称(Controller1
, Controller2
),稍后我将使用它来获取 @ActionMapping
注释方法。
是否可以访问每个 portlet“私有(private)”上下文并检索 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 的名称获取它,结果几乎相同。
我还得到了上下文中存在的所有 beans 的列表
String beanNames[] = ctx.getBeanNamesForType(Object.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
parameterHandlerMapping
bean 不存在。
据我了解,每个 portlet 都有自己的 parameterHandlerMapping
bean,所以我猜我得到的 ctx
是“全局”上下文,而不是 portlet 自己的“定义 parameterHandlerMapping
bean 的私有(private)"上下文。
如果我是正确的并且我正在获取“全局”上下文,是否有一种方法可以根据 portletId 获取 portlet 的“私有(private)”上下文?甚至可以做我想做的事吗?
谢谢大家的帮助
最佳答案
你可以使用:
com.liferay.portal.kernel.bean.PortletBeanLocatorUtil.getBeanLocator("portlet-context-name")
通过给出每个 portlet 的上下文名称,为您想要的每个 portlet 获取一个 BeanLocator 对象。 从那里,您可以使用:
locator.locate("bean-id")
传递bean的id,获取你想要的bean。
但是,您需要确保所有这些 portlet 都部署在服务器中,否则您可能会遇到异常。确保这一点的一种方法是在其 liferay 插件包属性中将这些 portlet 声明为 Action Manager portlet 所需的上下文,以确保除非所有其他 portlet 已部署在 Web 服务器中,否则不会部署 Action Manager portlet .
附注我指的是 Liferay 6.0 版
关于java - 从另一个 portlet (Liferay + Spring) 获取 Portlet Application Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21427924/