0

JSON-WSAPIを使用してLiferayパーミッションリソースを作成しようとしています。http://localhost:8080/api/jsonwsリソースを作成するためのJSON-WSAPI登録済みサービスメソッドが見つかりません。

JSON Webサービスのドキュメントによると、@ JSONWebServiceアノテーションを追加することで、サービスをリモートで有効にできます。Liferayの組み込みサービスがまだ公開されていない場合に、それらを登録する方法と登録できるかどうかは、私にはわかりません。

また、ResourceLocalServiceのJavadocには、具体的に次のように記載されています。

これはローカルサービスです。このサービスは同じVM内からのみアクセスできるため、このサービスのメソッドには、伝播されたJAASクレデンシャルに基づくセキュリティチェックはありません。

では、JSON-WS APIを使用してResourceLocalServiceのメソッドにリモートでアクセスすることも可能ですか?もしそうなら、あなたはそれを行う方法の正しい方向に私を向けることができますか?

PS:すでに公開され、リストされているサービスメソッドの外部アプリケーションでJSON-WSAPIを正常に使用しています。http://localhost:8080/api/jsonws

4

2 に答える 2

2

これに使用したアプローチは、データテーブルを持たないが、いくつかのJSONWSメソッドを公開する独自のサービスを作成することです。これは、リモートサービスを作成するためのサービスビルダーのオプションを使用するプラグインプロジェクトで行います(アプリにポートレットが含まれているため、ポートレットプラグインを使用しましたが、フックプラグインでも実行できると思います)。

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サイトの周りには、この方法で電話をかけるように指示するかなりの量の資料があります。しないでください。

すべての詳細(構成設定、呼び出しのニュアンスなど)については説明していませんが、開発者ガイドの新しいドキュメントでは、現在かなりうまく対処しています。ですから、必ずそれを研究してください。

また、 ServiceBuilderについても読む必要があります。

ただし、注意が必要です。おそらく、ポータルが提供するAPIページをサービスのリファレンスとして使用することに慣れているでしょう。これは組み込みのサービスには問題ありませんが、プラグインによって提供されるサービスの場合、このページは誤った例を示しているため、信頼できません。ドキュメントを参照してください。

于 2013-03-14T15:17:18.820 に答える
2

Liferayでは、ドキュメントの抜粋から指摘している*LocalServiceように、同じVMからのみ利用できます。リモートから利用できるサービスは*Serviceローカル部分なしで)ただであり、それらの実装はアクセス許可をチェックし、該当する場合は呼び出しをに転送することになってい*LocalServiceます。

実際のオブジェクトなしでLiferayにリソースを追加するだけでは意味がないため、ResourceLocalServiceは別のエンティティを追加するサービスによって呼び出されることになっています(リソースには、クラス名と主キー)

于 2013-03-14T20:00:03.673 に答える