如何在 jsf portlet(gradle 构建项目)中使用 "liferay portal workflow kaleo api"? Liferay 7.0

how to use "liferay portal workflow kaleo api" in jsf portlet (gradle build project) ? Liferay 7.0

我已经使用了这个 gradal 属性“编译组:'com.liferay',名称:'com.liferay.portal.workflow.kaleo.api',版本:'1.0.0'”
在 MVC potlate 上,我得到了所有数据

@Component
public class KaleoTaskInstanceTokenPortlet extends MVCPortlet {
    @Reference
    KaleoTaskInstanceTokenLocalService kaleoTaskInstanceTokenLocalService;

    @Override
    public void render(RenderRequest renderRequest, RenderResponse renderResponse)
        throws IOException, PortletException {
        List<KaleoTaskInstanceToken> instanceToken = kaleoTaskInstanceTokenLocalService
            .getKaleoTaskInstanceTokens(QueryUtil.ALL_POS, QueryUtil.ALL_POS);
        for (KaleoTaskInstanceToken kaleoTaskInstanceToken : instanceToken) {
            System.out.println("=-=-=-=-" + kaleoTaskInstanceToken.getKaleoInstanceId());
        }

    }

}   

但是我的 JSF portlet 问题 我在 JSF portlet 中使用了相同的代码。不管用 我有“kaleoTaskInstanceTokenLocalService”值空..

根据 Liferays docs about JSF,您不能使用使用 @Reference 注释的基于 OSGi 的声明式服务;相反,您必须自己查询服务跟踪器:

To call OSGi-based Service Builder services from your JSF portlet, you need a mechanism that gives you access to the OSGi service registry, because you can’t look up services published to the OSGi runtime using Declarative Services. Instead, you should open a ServiceTracker when you want to call a service that’s in the OSGi service registry.

[..]

In a managed bean, whenever you need to call a service, open the service tracker. For example, this is done in the same demo JSF portlet to open the service tracker, using the @PostContruct annotation:

@PostConstruct
public void postConstruct() {
   Bundle bundle = FrameworkUtil.getBundle(this.getClass());
   BundleContext bundleContext = bundle.getBundleContext();
   userLocalServiceTracker = new UserLocalServiceTracker(bundleContext);
   userLocalServiceTracker.open();
}

Then the service can be called:

UserLocalService userLocalService = userLocalServiceTracker.getService();
...

userLocalService.updateUser(user);

When it’s time for the managed bean to go out of scope, you must close the service tracker using the @PreDestroy annotation:

@PreDestroy
public void preDestroy() {
    userLocalServiceTracker.close();
}

还有一条信息about Service Trackers here,结尾是

There’s a little boilerplate code you need to produce, but now you can look up services in the service registry, even if your plugins can’t take advantage of the Declarative Services component model.

...而 JSF portlet 确实属于该类别,因为它们是“WAR 风格的插件”(相对于 OSGi 包,a.k.a。“JAR 风格的插件").

最后,每当您在网络上的任何示例中看到任何使用 @Reference 注释的依赖项注入时,您都需要在“WAR”中调整上述样板代码-风格的插件”。

如果这还不够,可能是您的依赖项中的模块版本有误。我没有 Liferay 7.0 实例 运行,但即使在我找到的最旧的 zip 文件中,Kaleo API 的版本也是 2.0.0;另一方面,您明确依赖版本 1.0.0,这可能是您的问题。

您需要找出您为其编写模块的 Liferay 服务器上使用的确切 Kaleo API 包版本。打开 Gogo shell(控制面板 -> 系统 -> Gogo Shell),它允许您检查 运行 OSGi 包。使用此命令(“列出包,显示它们的符号名称,仅显示包含 'kaleo.api' 的行”):

lb -s | grep kaleo.api

在我这里的 Liferay 7.3 上,输出将是:

 5320|Active     |   10|com.liferay.portal.workflow.kaleo.api (6.4.0)|6.4.0

找出您的 Liferay 实例使用的版本,并在您的 build.gradle 中使用它。对于某些模块,您需要点击确切的版本;对于其他人,您至少可以匹配主要版本。

注意:对于较新版本的 Liferay(我认为是从 7.3.2 开始),您可以集中配置目标 Liferay 平台版本(它将所有模块版本预设为该特定平台版本中使用的版本)并转义这种依赖地狱;参见