当前位置: 首页 > 知识库问答 >
问题:

从另一个 Portlet 获取 Portlet 应用程序上下文(生命之春)

郎磊
2023-03-14

我想创建一个portlet(让我们称之为“Action Manager”)来列出与我的Action Manager portlet相同页面中的所有portlet中的所有操作方法(使用Spring注释@ActionMap)。

我的所有其他portlets都使用< code > 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中获取参数HandlerMappingbean,然后从中获取其控制器名称(Controller1Controller2),稍后我将使用这些名称获取@ActionMapping注释方法。

是否可以访问每个portlet“私有”上下文并检索参数HandlerMappingbean?

我目前坚持这个:

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的列表,使用

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

并且参数“处理器映射豆”不存在。

我的理解是每个portlet都有自己的参数HandlerMapbean,所以我猜我得到的ctx是“全局”上下文,而不是portlet自己的“私有”上下文,其中定义了参数HandlerMapbean。

如果我是正确的,并且我得到了“全局”上下文,有没有办法根据 PortletId 获取 Portlet 的“私有”上下文?甚至有可能做我想做的事吗?

感谢您的帮助

共有1个答案

艾泽语
2023-03-14

您可以使用:

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

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

locator.locate("bean-id")

传递bean的id,以获得所需的bean。

然而,您需要确保所有这些portlets都部署在服务器中,否则您可能会得到一个异常。确保这一点的一种方法是,在其liferay插件包属性中将这些portlet声明为您的动作管理器portlet的必需上下文,从而确保除非所有其他portlet都已部署在web服务器中,否则不会部署动作管理器portlet。

p.s. 我指的是生命力6.0版

 类似资料:
  • 问题内容: 我有一个用例,需要加载单独的角度应用程序。 基于几个堆栈溢出问题和这个google线程,它是可行的。但是,我无法使其正常工作。 查看文档: http://docs.angularjs.org/api/angular.bootstrap 看来您需要提供该元素(在该元素上获得句柄的正确方法是什么?),然后如何将其绑定回config,controller等。这如何与路由一起使用?IE碰撞如何

  • 我需要使用portlet名称获取资源权限。 我将使用portlet的名称,而不是Id。 portlet的资源权限名称是该portlet的Id。我检查了portlet表,它只有Id和其他信息。portlet的其他属性将保存在哪里?。 有没有一种方法可以通过使用portlet的名称来获取portlet的Id。我有一个解决方案来获取所有portlet并进行比较,但是如果我可以使用portlet的名称直接

  • 问题内容: 我已经使用和上下文init-parameter 配置了根应用程序上下文。 然后,JSF(* .jsf)变量解析器访问根上下文。它工作正常。 现在的问题是,经过的请求将获得另一个应用程序上下文,然后将单例bean实例化两次。 我不需要其他的应用程序上下文,如何指定它来重用由加载的现有根应用程序上下文? 注意 阅读答案中的参考页后,我知道根上下文和调度程序上下文之间存在上下文分隔,但是没有

  • 问题内容: 我有2个项目,其中一个包含在另一个构建路径中,两个项目都有自己的应用程序上下文来定义他的bean。 我想管理全局事务,因此我必须在一个应用程序上下文中同时导入这两个事务,但是我没有找到做到这一点的方法。 在不同的项目中可能有2个应用程序上下文,并将其中一个导入另一个。 如果没有可能,那将是最佳解决方案? 我认为成为1中的2个项目。 问题答案: 是的,可以导入;在您的一个appconte

  • 问题内容: 有没有办法在Spring应用程序中静态/全局地请求ApplicationContext的副本? 假设主类启动并初始化了应用程序上下文,它是否需要通过调用堆栈将其向下传递给需要它的任何类,或者是否有一种方法可以让类要求先前创建的上下文?(我认为必须是单身人士?) 问题答案: 如果需要访问容器的对象是容器中的Bean,则只需实现BeanFactoryAware或ApplicationCon

  • 我是Spring的初学者。今天,当我在阅读Spring core文档时,我在第1.3章中发现了以下说明。Bean概述 除了包含关于如何创建特定bean的信息的bean定义外,ApplicationContext实现还允许注册(由用户)在容器外部创建的现有对象。这是通过getBeanFactory()方法访问ApplicationContext的BeanFactory来完成的,该方法返回BeanFa