如何在jsfportlet(gradle构建项目)中使用“liferay门户工作流kaleoapi”?liferay 7.0版

bmp9r5qi  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(275)

我使用了这个渐变属性“compile group:'com.liferay',name:'com.liferay.portal.workflow.kaleo.api',version:'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());
        }

    }

}

但是我在jsfportlet上的问题和我在jsfportlet中使用的代码相同。不工作,我的“kaleotaskinstancetokenlocalservice”值为空。。

dtcbnfnu

dtcbnfnu1#

根据liferays关于jsf的文档,不能使用基于osgi的声明性服务 @Reference 注解;相反,您必须自己查询服务跟踪器:
要从jsfportlet调用基于osgi的servicebuilder服务,您需要一种能够访问osgi服务注册表的机制,因为您无法使用声明性服务查找发布到osgi运行时的服务。相反,当您想调用osgi服务注册表中的服务时,应该打开servicetracker。
[..]
在托管bean中,每当需要调用服务时,打开服务跟踪器。例如,在同一个演示jsf portlet中使用@postcontuct注解打开服务跟踪器:

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

然后可以调用服务:

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

userLocalService.updateUser(user);

当托管bean超出范围时,必须使用@predestroy注解关闭服务跟踪器:

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

这里还有一条关于服务跟踪器的信息,以
您需要生成一些样板代码,但是现在您可以在服务注册表中查找服务,即使您的插件不能利用声明性服务组件模型。
... jsf portlet确实属于这一类,因为它们是“战争风格的插件”(与osgibundle相反,也就是“jar风格的插件”)。
最后,每当您看到使用 @Reference 在web上的任何示例中,您都需要在“war样式插件”中修改前面提到的样板代码。
如果这还不够,可能您的依赖项中有一个错误的模块版本。我没有运行liferay7.0示例,但即使在我找到的最老的zip文件中,kaleoapi也是2.0.0版本;另一方面,您明确地依赖于版本1.0.0,这可能是您的问题。
您需要找出在为其编写模块的liferay服务器上使用的kaleoapi包的确切版本。打开gogoshell(控制面板->系统->gogoshell),可以检查正在运行的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平台版本(它将所有模块版本预设为该特定平台版本中使用的版本),并摆脱这种依赖关系;请看这里的答案。

相关问题