我为此使用的方法是编写自己的服务,该服务没有数据表,但公开了一些 JSON WS 方法。您可以在插件项目中使用服务构建器的选项来创建远程服务(我使用了一个 portlet 插件,因为我的应用程序中有 portlet,但我相信它也可以在钩子插件中完成)。
service.xml 的快速摘录:
<entity name="UserNotification" local-service="true"
remote-service="true">
</entity>
没有字段,没有查找器……只有实体名称。
然后在你的插件项目的 UserNotificationServiceImpl 中创建你想要公开的方法并对有问题的 Liferay 服务进行定期服务调用(你负责使用权限检查器,这里没有关于安全性的自动操作)。当您重新构建服务时,ServiceBuilder 会对您的方法进行反向工程并创建远程服务 API。
棘手的一点是调用您的自定义 API,它的形式与您对内置 API 的调用不同。假设您希望服务要求身份验证并为您的方法提供用户上下文以与权限检查器一起使用,您可以通过以下形式进行调用:
https://user:passwd@example.com/api/secure/jsonws/plugin-name.entity-name/method? ...parameters
还有其他调用格式,但关键是您直接寻址 Liferay,然后使用点分符号识别插件和实体。如果您在自己的应用程序上下文中处理您的插件
https://user:passwd@example.com/plugin-name/api/secure/jsonws/entity-name/method? ...parameters
您将无法获得身份验证上下文,因此您将无法使用权限检查器。不幸的是,您会在 Liferay 站点周围找到大量材料,告诉您以这种方式拨打电话。不。
我还没有解决所有细节(配置设置、调用细微差别等),但开发人员指南中的新文档现在已经很好地解决了这些问题。所以一定要研究一下。
您还需要阅读Service Builder。
但请注意——您可能习惯于使用门户提供的 API 页面作为服务的参考。这对于内置服务很好,但对于插件提供的服务,此页面不可靠,因为它提供了不正确的示例。去文档。