我使用了这个渐变属性“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”值为空。。
1条答案
按热度按时间dtcbnfnu1#
根据liferays关于jsf的文档,不能使用基于osgi的声明性服务
@Reference
注解;相反,您必须自己查询服务跟踪器:要从jsfportlet调用基于osgi的servicebuilder服务,您需要一种能够访问osgi服务注册表的机制,因为您无法使用声明性服务查找发布到osgi运行时的服务。相反,当您想调用osgi服务注册表中的服务时,应该打开servicetracker。
[..]
在托管bean中,每当需要调用服务时,打开服务跟踪器。例如,在同一个演示jsf portlet中使用@postcontuct注解打开服务跟踪器:
然后可以调用服务:
当托管bean超出范围时,必须使用@predestroy注解关闭服务跟踪器:
这里还有一条关于服务跟踪器的信息,以
您需要生成一些样板代码,但是现在您可以在服务注册表中查找服务,即使您的插件不能利用声明性服务组件模型。
... jsf portlet确实属于这一类,因为它们是“战争风格的插件”(与osgibundle相反,也就是“jar风格的插件”)。
最后,每当您看到使用
@Reference
在web上的任何示例中,您都需要在“war样式插件”中修改前面提到的样板代码。如果这还不够,可能您的依赖项中有一个错误的模块版本。我没有运行liferay7.0示例,但即使在我找到的最老的zip文件中,kaleoapi也是2.0.0版本;另一方面,您明确地依赖于版本1.0.0,这可能是您的问题。
您需要找出在为其编写模块的liferay服务器上使用的kaleoapi包的确切版本。打开gogoshell(控制面板->系统->gogoshell),可以检查正在运行的osgi包。使用此命令(“列出捆绑包,显示其符号名称,仅显示包含“kaleo.api”的行”):
在我的liferay 7.3上,输出是:
找出您的liferay示例正在使用的版本,并在build.gradle中使用它。对于某些模块,您需要找到准确的版本;对其他人来说,你至少可以匹配主要版本。
注意:对于较新版本的liferay(从7.3.2开始,我认为),您可以集中配置目标liferay平台版本(它将所有模块版本预设为该特定平台版本中使用的版本),并摆脱这种依赖关系;请看这里的答案。