【问题标题】:Can the ResourceLocalService be called remotely via the JSON-WS API?可以通过 JSON-WS API 远程调用 ResourceLocalService 吗?
【发布时间】:2013-03-15 04:00:03
【问题描述】:

我正在尝试使用 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 中的服务方法

【问题讨论】:

    标签: liferay liferay-6


    【解决方案1】:

    我为此使用的方法是编写自己的服务,该服务没有数据表,但公开了一些 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 站点周围找到大量材料,告诉您以这种方式拨打电话。不要。

    我还没有解决所有细节(配置设置、调用细微差别等)但是Developer Guide 中的新文档现在已经很好地解决了这些问题。所以一定要研究一下。

    您还需要阅读Service Builder

    但请注意——您可能习惯于使用门户提供的 API 页面作为服务的参考。这对于内置服务很好,但对于插件提供的服务,此页面不可靠,因为它提供了不正确的示例。参考文档。

    【讨论】:

    • 感谢您的详细解答。您提到“棘手的是然后调用您的自定义 API”。我收到 404,并且无法确定要使用的正确 URL。我是否还需要按照这个 Github 示例中的描述在 web.xml 中添加 JSON Servlet? github.com/kastork/jsonsw-example-portlet
    • 哦,等等,文档是我的朋友。 :) 我看到这在开发指南中得到了解决。我会试试看。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2020-10-03
      • 2022-06-11
      • 2018-03-31
      • 2018-12-15
      相关资源
      最近更新 更多