0

我正在尝试使用 JSON-WS API 创建 Liferay 权限资源。我还没有找到任何http://localhost:8080/api/jsonws用于创建资源的 JSON-WS API 注册服务方法。

根据JSON Web Services文档,您可以通过添加 @JSONWebService 注释来远程启用服务。我不清楚如果 Liferay 的内置服务尚未公开,您如何以及是否可以注册它们。

此外,ResourceLocalService的Javadocs特别声明:

这是本地服务。此服务的方法不会基于传播的 JAAS 凭据进行安全检查,因为只能从同一 VM 内访问此服务。

那么甚至可以使用 JSON-WS API 远程访问 ResourceLocalService 的方法吗?如果是这样,你能指出我正确的方向吗?

PS:我在我的外部应用程序中成功使用 JSON-WS API 来获取已经发布和列出的服务方法http://localhost:8080/api/jsonws

4

2 回答 2

2

在 Liferay 中 - 正如您从文档摘录中指出的那样 -*LocalService只能从同一个 VM 获得。远程可用的服务只是*Service(没有本地部分),它们的实现应该检查权限,然后将调用转发给*LocalService适用的。

在没有实际对象的情况下仅向 Liferay 添加资源是没有意义的,因此ResourceLocalService应该由添加另一个实体的服务调用(资源需要实际对象的附加对象引用,包括类名和首要的关键)

于 2013-03-14T20:00:03.673 回答
2

我为此使用的方法是编写自己的服务,该服务没有数据表,但公开了一些 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 页面作为服务的参考。这对于内置服务很好,但对于插件提供的服务,此页面不可靠,因为它提供了不正确的示例。去文档。

于 2013-03-14T15:17:18.820 回答