我想创建一个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中获取参数HandlerMapping
bean,然后从中获取其控制器名称(Controller1
,Controller2
),稍后我将使用这些名称获取@ActionMapping
注释方法。
是否可以访问每个portlet“私有”上下文并检索参数HandlerMapping
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的列表,使用
String beanNames[] = ctx.getBeanNamesForType(Object.class);
for (String beanName : beanNames) {
System.out.println(beanName);
}
并且参数“处理器映射
豆”不存在。
我的理解是每个portlet都有自己的参数HandlerMap
bean,所以我猜我得到的ctx
是“全局”上下文,而不是portlet自己的“私有”上下文,其中定义了参数HandlerMap
bean。
如果我是正确的,并且我得到了“全局”上下文,有没有办法根据 PortletId 获取 Portlet 的“私有”上下文?甚至有可能做我想做的事吗?
感谢您的帮助
您可以使用:
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