リモートサービスの作成

デフォルトのLiferay DXPサービスの多くは、JSONおよびSOAP Webサービスとして公開されています。ポータルを8080番ポートでローカルに実行する場合、以下のURLにアクセスしてデフォルトのJSON Webサービスを参照します。

http://localhost:8080/api/jsonws/

デフォルトのSOAP Webサービスを参照するには、以下のURLにアクセスします。

http://localhost:8080/api/axis

これらのWebサービスのAPIは、非ポートレットクライアントや非Javaクライアントを含む、様々なタイプのクライアントからアクセスできます。Service Builderを使用して、プロジェクトのエンティティに対して同様のリモートサービスを作成できます。エンティティのremote-service属性をtrueに設定して、Service Builderを実行すると、SOAPおよびJSON Webサービスの両方をサポートするために必要なすべてのクラス、インターフェース、およびファイルがそのエンティティに対して作成されます。Service Builderは既存のサービスを呼び出すメソッドを作成しますが、リモートで公開されるメソッドを実装するかは開発者次第です。このチュートリアルでは、アプリケーションのリモートサービスを作成する方法を説明します。リモートサービスの作成が完了すると、アプリケーションのリモートサービスメソッドをJSONおよびSOAP Webサービスを介してリモートで呼び出すことができるようになります。

Service Builderを使用したリモートサービスの作成

アプリケーションのローカルサービスメソッドは、*LocalServiceImplに実装する必要があります。そして、アプリケーションのリモートサービスメソッドは*ServiceImplに実装する必要があります。

ここでは、Webコンテンツの記事を例として考えてみます。Webコンテンツの記事はJournalArticleエンティティによって表されます。このエンティティは、trueに設定されたremote-service属性を使用して、journal-serviceモジュールのservice.xml ファイルで宣言されます。したがって、Service Builderはリモートサービスメソッドの実装を保持するために、リモートサービスクラスのJournalArticleServiceImplを作成します。このアプリをゼロから開発している場合、このクラスは最初は空の状態です。したがって、これを使用して、エンティティのリモートサービスメソッドを実装する必要があります。また、JournalArticleServiceImplのリモートサービスメソッドの実装では、権限を確認し、対応するローカルサービスメソッドを呼び出すというベストプラクティスに従っていることに注意してください。たとえば、以下から分かるように、JournalArticleServiceImplの各addArticleメソッドは権限をチェックし、ローカルサービスの一致するaddArticleメソッドを呼び出します。

@Override
public JournalArticle addArticle(...)
throws PortalException {

ModelResourcePermissionHelper.check(
_journalFolderModelResourcePermission, getPermissionChecker(),
groupId, folderId, ActionKeys.ADD_ARTICLE);

return journalArticleLocalService.addArticle(...);
}

ModelResourcePermissionHelper.check(...)を使用していることに注意してください。このヘルパークラスは、Liferay 7.1で導入されました。モデルリソースの権限チェックでは、カスタムの権限ヘルパークラスを使用する代わりに、このヘルパークラスを使用できます。 また、ローカルサービスはjournalArticleLocalServiceフィールドを介して呼び出されることにも注意してください。これは、JournalArticleLocalServiceImpl型のSpring Beanであり、Service BuilderによってJournalArticleServiceImplに注入されます。Service Builderで作成されたクラスも同じことを行います。

*ServiceImplクラスへのリモートサービスメソッドの追加が完了したら、それを保存し、Service Builderを再度実行します。Service Builderを実行した後、プロジェクトをデプロイしてJSON WebサービスのURL(http://localhost:8080/api/jsonws/)を確認し、アプリケーションのコンテキストパスを選択したときにリモートサービスが表示されることを確認します。

これで、Service Builderを使用して、アプリケーションのリモートサービスが作成できました。ただし、これらのサービスをSOAP経由で利用可能にするには、アプリのWebサービスデプロイメント記述子(WSDD)を構築して、デプロイする必要があります。次のセクションでは、その方法を解説します。SOAP Webサービスを作成する必要がない場合は、チュートリアルのInvoking Remote Servicesに進んでください。

アプリケーションのWSDDを作成する

Liferay DXPはApache Axisを使用しているので、SOAP Webサービスが利用可能です。AxisではSOAPを介してアプリケーションのリモートサービスを利用できるようにするためにWSDDが必要なので、アプリケーションのWSDDを構築してデプロイする必要があります。WSDDを作成するには、LiferayのWSDD Builder Gradleプラグインをアプリのプロジェクトにインストールする必要があります。ただし、インストール方法は、所有しているプロジェクトの種類によって異なります。Liferay WorkspaceのService Builderプロジェクトのようなマルチモジュールプロジェクトの場合、ワークスペースのsettings.gradleファイルを介してプラグインをインストールします。これにより、WSDD BuilderプラグインがService Builderを使用するワークスペース内のすべてのモジュール(通常、 *-apiおよび*-serviceモジュール)に適用されます。ただし、Service Builderを使用するスタンドアロンの*-serviceモジュールがある場合は、モジュールのbuild.gradleファイルにWSDD Builderプラグインをインストールします。

次のセクションでは、マルチモジュールプロジェクトにWSDDビルダーをインストールする方法を説明します。スタンドアロンのモジュールプロジェクトがある場合は、Installing the WSDD Builder Plugin in a Standalone Module Projectセクションに進んでください。

マルチモジュールプロジェクトへのWSDD Builderプラグインのインストール

Liferay WorkspaceのService BuilderプロジェクトのようなマルチモジュールプロジェクトにWSDD Builderプラグインをインストールするには、ワークスペースのsettings.gradleファイルを以下の手順で変更します。

  1. ServiceBuilderPluginWSDDBuilderPluginのインポートをファイルの先頭に追加します。

    import com.liferay.gradle.plugins.service.builder.ServiceBuilderPlugin
    import com.liferay.gradle.plugins.wsdd.builder.WSDDBuilderPlugin
    
  2. repositoriesブロックでは、Mavenを介して、LiferayのCDNリポジトリを追加します。

    repositories {
    maven {
    url "https://repository-cdn.liferay.com/nexus/content/groups/public"
    }
    }
    

    このリポジトリは、WSDD Builderライブラリとその推移的な依存関係、およびその他のLiferayライブラリをホストします。Blade CLIまたはLiferay Dev Studio DXPでservice-builderテンプレートを使用してService Builderプロジェクトを作成した場合は、settings.gradleファイルにはすでにこれが含まれていることに注意してください。

  3. 以下のコードをファイルの最後に追加します。

    gradle.beforeProject {
    project ->
    
    project.plugins.withType(ServiceBuilderPlugin) {
    project.apply plugin: WSDDBuilderPlugin
    }
    }
    

    これは、Service Builderを使用するLiferay WorkspaceのすべてのモジュールでWSDD Builderプラグインを適用するコードです。対象のsettings.gradleファイルは、以下のようになります。

    import com.liferay.gradle.plugins.service.builder.ServiceBuilderPlugin
    import com.liferay.gradle.plugins.wsdd.builder.WSDDBuilderPlugin
    
    buildscript {
    dependencies {
    classpath group: "com.liferay", name: "com.liferay.gradle.plugins.workspace", version: "1.2.0"
    }
    
    repositories {
    maven {
    url "https://repository-cdn.liferay.com/nexus/content/groups/public"
    }
    }
    }
    
    apply plugin: "com.liferay.workspace"
    
    gradle.beforeProject {
    project ->
    
    project.plugins.withType(ServiceBuilderPlugin) {
    project.apply plugin: WSDDBuilderPlugin
    }
    }
    
  4. Liferay WorkspaceのGradleプロジェクトを更新します。Liferay Dev Studio DXPを使用している場合は、閉じて再起動します。

WSDD Builderプラグインがインストールできたので、WSDDを構築してデプロイする準備が整いました。この手順については、Building and Deploying the WSDDのセクションを参照してください。

スタンドアロンモジュールプロジェクトへのWSDD Builderプラグインのインストール

Service Builderを使用するスタンドアロンの*-serviceモジュールにWSDD Builderプラグインをインストールするために、以下の手順でモジュールのbuild.gradleファイルを変更します。

  1. プラグインを依存関係としてbuildscriptに追加します。

  2. Mavenを介してLiferay CDNリポジトリを追加します。

  3. プラグインをプロジェクトに適用します。

たとえば、スタンドアロンの*-serviceモジュールにあるサンプルのbuild.gradleファイルの以下の部分にはWSDD Builderプラグインが含まれており、プロジェクトに適用されます。

buildscript {
dependencies {
classpath group: "com.liferay", name: "com.liferay.gradle.plugins.wsdd.builder", version: "1.0.9"
}

repositories {
maven {
url "https://repository-cdn.liferay.com/nexus/content/groups/public"
}
}
}

apply plugin: "com.liferay.portal.tools.wsdd.builder"

これで、WSDDを構築してデプロイする準備ができました。次のセクションでは、このデプロイ方法を説明します。

WSDDの構築とデプロイ

WSDDを構築するには、*-serviceモジュールでbuildWSDD Gradleタスクを実行する必要があります。開発ツールによって、適切な方法は異なります。

  • Liferay Dev Studio DXP: Liferay WorkspaceパースペクティブのGradle Tasksペイン(通常は右側)から、[*-service]モジュールの[build]フォルダを開き、[buildWSDD]をダブルクリックします。
  • コマンドライン: [*-service]モジュールに移動して、../../../gradlew buildWSDDを実行します。Gradleラッパー(gradlew)の正確な場所は、異なる場合があることに注意してください。Liferay Workspaceプロジェクトの場合、通常はルートワークスペースフォルダにあります。

もし、buildWSDDが失敗してしまった場合は、buildWSDDの失敗の一般的な原因として*-serviceモジュールに対してWSDD Builderが必要とする依存関係を満たしていないことが考えられます。これらの依存関係はプロジェクトのコードによって異なることに注意してください。標準セットはありません。しかし、ポートレットの開発には以下の依存関係が必要になることがよくあります。

compileOnly group: "javax.portlet", name: "portlet-api", version: "3.0.0"
compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1"
compileOnly group: "com.liferay", name: "com.liferay.registry.api", version: "2.0.0"

アプリの依存関係の検索と設定方法の詳細については、こちらをクリックしてください。

*-serviceプロジェクトのbuild/libsフォルダで、buildWSDDタスクはWSDDを含む*-service-wsdd-[version].jarを作成しました。このJARをLiferay DXPインスタンスにデプロイします。これで、SOAP Webサービスは、以下のパターンを使用するURLで利用可能になります。

yourportaladdress/o/your.apps.service.module.context/api/axis

たとえば、Fooというアプリケーションがモジュールfoo-apifoo-service、およびfoo-webで構成されている場合、アプリのサービスモジュールコンテキストはfoo-serviceです。このアプリがhttp://localhost:8080で実行されているローカルのLiferay DXPインスタンスにデプロイされている場合、以下で対象のSOAPサービスにアクセスすることができます。

http://localhost:8080/o/foo-service/api/axis

アプリの*-serviceモジュールコンテキストがわからない場合は、アプリが実行されているアプリケーションマネージャでアプリを検索して、探し出すことができます。たとえば、以下のスクリーンショットはアプリケーションマネージャでのFooアプリのモジュールを示しています。アプリケーションマネージャの*-serviceモジュールの名前は、foo-serviceで、コンテキストでもあります。また、アプリケーションのWSDDモジュールがグレー表示され、アクティブではなく解決済みとしてリストされていますが、これは正常です。WSDDモジュールはOSGiフラグメントであり、アクティブ化できません。しかし、意図したとおりに機能します。

次に、デフォルトでWSDDを含まない組み込みアプリ向けにWSDDモジュールを作成する方法を紹介します。これを行う必要がない場合は、チュートリアルのInvoking Remote Servicesに進んでください。

組み込みアプリ用のWSDDの構築

Liferay DXPでは、ポータルコンテキストの外部に存在する組み込みアプリ用のWSDDモジュールは提供していません。つまり、デフォルトでは、WikiやBlogなどのアプリのSOAP Webサービスにアクセスできません。このようなアプリでSOAP Webサービスを利用できるようにするには、liferay-portalのGitHubリポジトリからWSDDを構築して、デプロイする必要があります。 アプリケーションは、liferay-portal/modules/appsフォルダ内にあります。これらのアプリのWSDDを構築するには、まずliferay-portalのソースコードをマシンにダウンロードする必要があります。ローカルのliferay-portalのコピーから、WSDDビルドを実行します。

アプリのWSDDを構築するときは、マシンのgradleではなく、liferay-portalgradlewを使用してください。構築が完了したら、ローカルのliferay-portalのコピーにあるtools/sdk/distフォルダでWSDD JARを見つけることができます。 それ以外の場合は、アプリのWSDDの構築は前のセクションで紹介した方法と同じです。

たとえば、ブックマークアプリ用のWSDDを構築するには、まずターミナルのliferay-portal/modules/apps/bookmarks/bookmarks-serviceフォルダに移動します。次に、以下のコマンドを実行します。

../../../../../gradlew buildWSDD

そして、liferay-portal/tools/sdk/dist/com.liferay.bookmarks.service-wsdd-[version].jarをデプロイします。 インスタンスがlocalhost:8080でローカルに実行されている場合、http://localhost:8080/o/com.liferay.bookmarks.service/api/axisでブックマークアプリのSOAPサービスを確認できるはずです。

作成したリモートWebサービスを呼び出す方法については、Invoking Remote Servicesのチュートリアルを参照してください。

関連トピック

Invoking Remote Services

Invoking JSON Web Services

JSON Web Services Invoker

What is Service Builder?

« Service Builder Webサービスリモートサービスの呼び出し »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています