【问题标题】:Using services of a portlet in another Liferay plugin在另一个 Liferay 插件中使用 portlet 的服务
【发布时间】:2025-12-15 17:50:02
【问题描述】:

我们试图在另一个 portlet (portlet B) 中使用一个 portlet (portlet A) 的服务。我们已将服务(Portlet A)的 jar 文件放在 \tomcat-7.0.27\webapps\ROOT\WEB-INF\lib 中,并将此 jar 包含在另一个 portlet(Portlet B)的显示插件 packages.xml 中。

我们正在使用外部数据库,即我们在 portlet-spring.xml 中进行了更改。

如果我部署包含实际服务(Portlet A)的 portlet 并调用一些服务方法,那么它被称为正常并获取数据。如果我们在另一个 Portlet(Portlet B)中编写相同的方法,那么它会获取数据。 但是,当我们尝试在另一个 Portlet(Portlet B)中编写尚未在实际服务 Portlet(Portlet A)中调用的方法时,就会出现问题,然后无法获取数据。它总是带来空白。

谁能指出可能是什么原因。

我们不能将所有的 portlet 放在同一个 jar 中,因为没有一个 portlet 非常大。(大约 35 个)。

或者除了把jar文件放到lib目录下还有其他更好的办法吗?

【问题讨论】:

  • 我猜你的 jars 应该在 "\tomcat-7.0.27\lib\ext" 目录中

标签: liferay portlet spring-portlet-mvc


【解决方案1】:

作为 Lucky Boy cmets,一种选择是将您的 *-service.jar 文件放在全局类路径 tomcat/lib/ext

另一种选择是显式命名依赖项:编辑插件的 WEB-INF/liferay-plugin-package.properties 并将依赖项添加到此插件所需的另一个插件:

required-deployment-contexts=my-other-portlet,my-custom-hook

这将确保包含此声明的插件仅在已部署依赖项后才部署,并且还将其服务 jar 复制到“自身”中 - 例如my-other-portlet-service.jarmy-custom-hook-service.jar 将自动出现在您自己的 Web 应用程序中,可供使用。

【讨论】:

  • 亲爱的 Olaf Kock,我已经尝试了上述两种方法。但是有了这些,我面临着另一个问题。我在 Portlet B 中找不到 XXXXImpl 类。我需要创建一个像 XXXX xxxx = new XXXXImpl(); 这样的对象。 .任何相同的建议。
  • 不,抱歉。 *Impl 类不是服务接口的一部分——服务构建器让它们最终位于插件的 WEB-INF/src 文件夹中,该文件夹不是 *-service.jar 的一部分。这是设计使然,您不应假设您可以访问这些类。不过,您可以将对象创建委托给您的服务类,并让您的服务返回一个处女 XXXImpl 对象(它很可能最终在您的依赖项目中作为 XXXWrapper 结束。
  • 搞定了.. :-) XXXX xxxx = XXXXLocalServiceUtil.createXXXXX(-1 or 0) 这不会创建数据库条目,但会返回一个空实例,这就像说 new XXXXImpl( ) .如果您有一个具有多个主键的表,则创建一个 xxxxpk 对象并将其传递给 XXXXLocalServiceUtil.createXXXXX 的构造函数。非常感谢...
最近更新 更多