Service Builder Basics
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

生成されたクラスの理解と拡張

Service Builderは、エンティティのテーブルと、そのためのモデル、永続性、およびサービスクラスの両方を生成します。 ここでは、W9B7Entryというエンティティに対して生成されたクラスを調べます。 次に、新しいメソッドを使用してローカルサービスを拡張し、それを呼び出します。

サンプルプロジェクトをダウンロードして解凍することから始めます。

curl https://resources.learn.liferay.com/examples/liferay-w9b7.zip -O
unzip liferay-w9b7.zip

w9b7-service/service.xmlファイルを調べます:

<?xml version="1.0"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 7.4.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_7_4_0.dtd">

<service-builder dependency-injector="ds" mvcc-enabled="true" package-path="com.acme.w9b7" short-no-such-exception-enabled="false">
	<namespace>W9B7</namespace>
	<entity local-service="true" name="W9B7Entry" remote-service="false">

		<!-- PK フィールド -->

		<column name="w9b7EntryId" primary="true" type="long" />

		<!-- 監査フィールド -->

		<column name="companyId" type="long" />

		<!-- その他のフィールド -->

		<column name="description" type="String" />
		<column name="name" type="String" />
	</entity>
</service-builder>

package-path="com.acme.w9b7" 設定は、クラスが com/acme/w9b7 パッケージ パスに、 -api モジュールと -service モジュールに生成されることを指定します。 唯一のエンティティはW9B7Entryと呼ばれます。 ローカルサービス(DXP/Portalと同じJVMからアクセス可能なサービス)はありますが、リモートサービスはありません。

生成されたクラスを確認してください。

生成されたクラス一覧

各モジュールのcom/acme/w9b7パッケージフォルダには、サービスビルダーで生成されたJavaクラスが含まれています。 ファイルストラクチャーに表示されるモジュールクラスは次のとおりです。

w9b7-api/src/main/java/com/acme/w9b7
├── 例外
│ └── NoSuchW9B7EntryException.java
├── モデル
│ ├── W9B7Entry.java
│ ├── W9B7EntryModel.java
│ ├── W9B7EntryTable.java
│ └── W9B7EntryWrapper.java
└── サービス
    ├── パーシステンス
    │ ├── W9B7EntryPersistence.java
    │ └── W9B7EntryUtil.java
    ├── W9B7EntryLocalService.java
    ├── W9B7EntryLocalServiceUtil.java
    └── W9B7EntryLocalServiceWrapper.java

w9b7-service/src/main/java/com/acme/w9b7
├── model
│ └── impl
│ ├── W9B7EntryBaseImpl.java
│ ├── W9B7EntryCacheModel.java
│ ├── W9B7EntryImpl.java // 変更可能
│ └── W9B7EntryModelImpl.java
└── service
    ├── base
    │ └── W9B7EntryLocalServiceBaseImpl.java
    ├── impl
    │ └── W9B7EntryLocalServiceImpl.java // 変更可能
    └── persistence
        └── impl
            ├── constants
            │ └── W9B7EntryPersistenceConstants.java
            ├── W9B7EntryModelArgumentsResolver.java
            └── W9B7EntryPersistenceImpl.java

W9B7EntryImpl.javaクラスとW9B7EntryLocalServiceImpl.javaクラスは、変更できる唯一のクラスです。 他の生成されたクラスは変更しないでください—Service Builder は、Service Builder が実行されるたびにそのコンテンツを再生成します。

注記

エンティティに対してリモート サービスを有効にして Service Builder を実行すると (つまり、 remote-service="true")、Service Builder はリモート サービス クラスを生成します。これには、変更可能なリモート サービス実装クラス (例: W9B7EntryServiceImpl.java ) が含まれます。

APIクラスから順に、すべてのクラスについて説明します。

APIクラス

APIクラスは、パブリックインターフェイス、ユーティリティー、および定数を定義します。

APIクラス説明
W9B7EntryW9B7Entryモデルインターフェイス。 W9B7EntryModelを拡張します。
W9B7EntryModelベースモデルインターフェイス。 このインターフェイスとそのW9B7EntryModelImpl実装は、サービスビルダーが生成するデフォルトのプロパティアクセサーのコンテナとしてのみ機能します。 すべてのヘルパーメソッドとすべてのアプリケーションロジックをW9B7EntryImplに追加する必要があります。
W9B7エントリテーブルエンティティのテーブルを表します。
W9B7エントリーラッパーラッパー、ラップ W9B7Entry。 このクラスは、エンティティをカスタマイズするために拡張される。
W9B7エントリ永続性エンティティの CRUD メソッドを定義する永続化インターフェイス。たとえば、 create、 remove、 countAll、 find、 findAllなどです。
W9B7EntryUtilW9B7EntryPersistenceImpl をラップし、CRUD 操作のためにデータベースへの直接アクセスを提供する永続化ユーティリティ クラス。 このユーティリティはサービス レイヤーでのみ使用してください。ポートレット クラスでは、 W9B7Entry クラスに @Reference アノテーション を注入して使用してください。
W9B7EntryLocalServiceローカルサービスインターフェース。
W9B7EntryLocalServiceUtilW9B7EntryLocalServiceImpl をラップするローカルサービスユーティリティクラス。
W9B7EntryLocalServiceWrapperW9B7EntryLocalService を実装するローカルサービスラッパー。 このクラスは、エンティティのローカルサービスをカスタマイズするために拡張される。

実装クラス

これらのクラスは、モデルレイヤー、永続性レイヤー、およびサービスレイヤーを実装します。

実装クラス説明
W9B7EntryBaseImplW9B7EntryModelImplを拡張して、W9B7_W9B7Entry データベーステーブルの行を表します。各列はW9B7EntryModelプロパティにマッピングされます。
W9B7EntryCacheModelキャッシュ内のW9B7Entryエンティティを表します。
W9B7EntryImpl (変更可能)モデルの実装。 このクラスを使用して、ヘルパーメソッドとアプリケーションロジックをモデルに追加できます。 ヘルパーメソッドまたはアプリケーションロジックを追加しない場合、自動生成されたフィールドゲッターとセッターのみが使用可能です。 このクラスでメソッドを追加または変更するたびに、サービスビルダーは、次回の実行時にその変更をW9B7Entryインターフェイスにプロパゲートします。
W9B7EntryLocalServiceBaseImplローカルサービスベースの実装。 これは抽象クラスです。 サービスビルダーは、さまざまなサービスクラスと永続性クラスのインスタンスをこのクラスに挿入します。
W9B7EntryLocalServiceImpl (変更可能)ローカルサービスの実装。 これは、ローカルサービスで変更する必要がある唯一のクラスです。 ここにビジネスロジックを追加します。 サービスビルダーは、ここで追加または変更されたメソッドについて、次回の実行時にその変更をW9B7EntryLocalServiceインターフェイスにプロパゲートします。
W9B7EntryModelArgumentsResolverエンティティ値を取得するためのパラメーターを処理します。
W9B7EntryModelImplベースモデルの実装。
W9B7EntryPersistenceImplW9B7EntryPersistenceを実装する永続性実装クラス。

*BaseImpl抽象クラスは実装に富んでいます。 W9B7EntryImplクラスとW9B7EntryLocalServiceImplクラスはそれらを拡張し、機能を追加する方法を提供します。

ローカルサービスメソッドの追加

指定された名前と説明からW9B7Entryインスタンスを作成するための便利なメソッドを追加して、ローカルサービスを拡張します。

  1. W9B7EntryLocalServiceImpl クラスに次の便利なメソッドを追加します。

    public W9B7Entry addW9B7Entry(String description, String name)
       throws PortalException {
    
       W9B7Entry w9b7Entry = w9b7EntryPersistence.create(
          counterLocalService.increment());
    
       w9b7Entry.setDescription(description);
       w9b7Entry.setName(name);
    
       return w9b7EntryPersistence.update(w9b7Entry);
    }
    

    基本クラスの w9b7EntryPersistence フィールドと counterLocalService フィールドを使用して、カウンター サービスによって生成された ID を持つ W9B7Entry インスタンスを作成します。 説明と名前がエントリに割り当てられ、その後、 w9b7EntryPersistence.update メソッド呼び出しによってエントリが永続化されます。

    注記

    Service Builder によって生成された基本クラス ( W9B7EntryLocalServiceBaseImpl.javaなど) は、アプリケーションで使用するための便利なフィールドとメソッドを提供します。

  2. サービスビルダーを実行します。

    cd w9b7-service
    
    ../gradlew buildService
    

    出力:

    > タスク :w9b7-service:buildService
    W9B7Entry を構築中
    ../w9b7-api/src/main/java/com/acme/w9b7/model/W9B7EntryModel.java を書き込み中
    ../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalService.java を書き込み中
    ../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalServiceUtil.java を書き込み中
    書き込み中../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalServiceWrapper.java
    src/main/resources/service.properties を書き込み中
    

    Service Builderは、新しいローカルサービスメソッドの実装をサポートするために、ローカルサービスAPIを更新しました。

  3. w9b7-api モジュールの W9B7EntryLocalService クラスで新しいメソッドシグネチャを確認します。

    public W9B7Entry addW9B7Entry(String description, String name) throws PortalException;
    

新しいメソッドは、モジュールとともに公開するために利用できます。

新しいサービス方法のテスト

モジュールをデプロイして、新しいサービスをテストする時が来ました。

Liferay の新しいインスタンスを起動するには、次のコマンドを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132

http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更してください。

次に、以下の手順に従います。

  1. サンプルをビルドしてデプロイします。

    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
    注記

    このコマンドは、モジュール JAR を Docker コンテナ上の /opt/liferay/osgi/modules にコピーすることと同じです。

  2. Dockerコンテナコンソールでデプロイを確認してください。

    com.acme.w9b7.api_1.0.0 を開始しました
    com.acme.w9b7.service_1.0.0 を開始しました
    
  3. コントロールパネル → サーバー管理 → スクリプト からスクリプトコンソールに移動します。

  4. 新しい方法でエントリを追加するには、以下のスクリプトを実行してください。

    import com.acme.w9b7.service.W9B7EntryLocalServiceUtil;
    
    W9B7EntryLocalServiceUtil.addW9B7Entry("机の上の散らかりを取り除いてください。", "机を整えてください");
    
    w9b7Entries = W9B7EntryLocalServiceUtil.getW9B7Entries(-1, -1);
    
    for (w9b7Entry in w9b7Entries){
       out.println(w9b7Entry);
    }
    

    出力:

    {w9b7EntryId=1234, description=机の上の散らかりを片付けましょう。, name=机を整理整頓}
    

    エントリはJSON形式で出力されます。

  新しいサービス方法の追加に成功しました。

次は?

Service Builderによって生成されたクラスや、ローカルサービスメソッドの追加方法について理解できたところで、次はポートレットからサービスを呼び出す方法を学びましょう。