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

标签 java spring liferay portlet spring-portlet-mvc

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

相关文章:

java - 多模块项目中的 Maven 并行构建

java - 如何在 JSTL 函数/EL 中转义双引号?

java - 沿着 LibGDX 中的路径 vector 偏移 Sprite

java - DefaultMessageListenerContainer : is it possible to cache consumer when using global transactions

linux - org.springframework.dao.InvalidDataAccessApiUsageException : Unable to determine the correct call signature - no procedure/function/signature for

java - 在 Liferay 中获取自定义用户字段值 (expando)

java - 如何将 C++ 类连接到 Java?

java - 如何处理 URL(Spring、REST、CXF)中的转义字符(管道 |)?

Liferay 6.1 DLApp * API : How to get images?

java - 无法在 Liferay 上注册 portlet