gpt4 book ai didi

java - 从另一个 portlet (Liferay + Spring) 获取 Portlet Application Context

转载 作者:行者123 更新时间:2023-12-03 21:40:21 24 4
gpt4 key购买 nike

我想创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com