Liferay 可以通过JSON-WS API远程调用ResourceLocalService吗?

Liferay 可以通过JSON-WS API远程调用ResourceLocalService吗?,liferay,liferay-6,Liferay,Liferay 6,我正在尝试使用JSON-WS API创建Liferay权限资源。我在http://localhost:8080/api/jsonws用于创建资源 根据文档,您可以通过添加@JSONWebService注释远程启用服务。我不清楚如果Liferay的内置服务尚未公开,您如何以及是否可以注册这些服务 此外,ResourceLocalService还特别指出: 这是一项本地服务。此服务的方法将不受限制 基于传播的JAAS凭据进行安全检查,因为 只能从同一虚拟机内访问服务。 那么,甚至可以使用JSON-W

我正在尝试使用JSON-WS API创建Liferay权限资源。我在
http://localhost:8080/api/jsonws
用于创建资源

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

此外,ResourceLocalService还特别指出:

这是一项本地服务。此服务的方法将不受限制 基于传播的JAAS凭据进行安全检查,因为 只能从同一虚拟机内访问服务。

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


PS:我在外部应用程序中成功地将JSON-WS API用于已发布并在
中列出的服务方法http://localhost:8080/api/jsonws

我使用的方法是编写自己的服务,它没有数据表,但公开了一些JSON WS方法。您可以在一个插件项目中使用ServiceBuilder的选项来创建远程服务(我使用了一个portlet插件,因为我的应用程序中有portlet,但我相信它也可以在一个钩子插件中完成)

从service.xml中快速摘录:

 <entity name="UserNotification" local-service="true"
    remote-service="true">
 </entity>
还有其他调用格式,但关键是直接寻址Liferay,然后使用点符号标识插件和实体。如果您在自己的应用程序上下文中寻址插件

https://user:passwd@example.com/plugin-name/api/secure/jsonws/entity-name/method? ...parameters
您将无法获取身份验证上下文,因此无法使用权限检查器。不幸的是,你会在Liferay网站上发现大量的材料,告诉你这样打电话。不要

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

你还需要仔细阅读


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

我使用的方法是编写自己的服务,它没有数据表,但公开了一些JSON WS方法。您可以在一个插件项目中使用ServiceBuilder的选项来创建远程服务(我使用了一个portlet插件,因为我的应用程序中有portlet,但我相信它也可以在一个钩子插件中完成)

从service.xml中快速摘录:

 <entity name="UserNotification" local-service="true"
    remote-service="true">
 </entity>
还有其他调用格式,但关键是直接寻址Liferay,然后使用点符号标识插件和实体。如果您在自己的应用程序上下文中寻址插件

https://user:passwd@example.com/plugin-name/api/secure/jsonws/entity-name/method? ...parameters
您将无法获取身份验证上下文,因此无法使用权限检查器。不幸的是,你会在Liferay网站上发现大量的材料,告诉你这样打电话。不要

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

你还需要仔细阅读


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

在Liferay中-正如您在文档节选中指出的-
*LocalService
仅可从同一虚拟机上获得。从远程可用的服务只是
*服务
(没有本地部分),它们的实现应该检查权限,然后将调用转发到
*本地服务
(如果适用)


在没有实际对象的情况下向Liferay添加资源是没有意义的,因此
ResourceLocalService
应该由添加另一个实体的服务调用(资源需要实际对象的附加对象引用,包括类名和主键)在Liferay中-正如您在文档节选中指出的-
*LocalService
仅可从同一个VM中获得。从远程可用的服务只是
*服务
(没有本地部分),它们的实现应该检查权限,然后将调用转发到
*本地服务
(如果适用)


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

感谢您的详细回答。您提到“棘手的一点是调用自定义API”。我得到了404,并且很难找到正确的URL来使用。我是否还需要在web.xml中添加JSON Servlet,如Github示例中所述?哦,等等,医生是我的朋友。:)我看到这在开发指南中有介绍。我试试看。谢谢你详细的回答。您提到“棘手的一点是调用自定义API”。我得到了404,并且很难找到正确的URL来使用。我是否还需要在web.xml中添加JSON Servlet,如Github示例中所述?哦,等等,医生是我的朋友。:)我看到这在开发指南中有介绍。我试试看。