生成されたクラスの理解と拡張
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" package-path="com.acme.w9b7" short-no-such-exception-enabled="false">
<namespace>W9B7</namespace>
<entity local-service="true" name="W9B7Entry" remote-service="false">
<!-- PK fields -->
<column name="w9b7EntryId" primary="true" type="long" />
<!-- Other fields -->
<column name="description" type="String" />
<column name="name" type="String" />
</entity>
</service-builder>
package-path="com.acme.w9b7" 設定は、クラスが -api モジュールと -service モジュール内の com/acme/w9b7 パッケージ パスに生成されることを指定します。 唯一のエンティティはW9B7Entryと呼ばれます。 ローカルサービス(DXP/Portalと同じJVMからアクセス可能なサービス)はありますが、リモートサービスはありません。
生成されたクラスを確認してください。
生成されたクラスのリスト
各モジュールのcom/acme/w9b7パッケージフォルダには、サービスビルダーで生成されたJavaクラスが含まれています。 ファイルストラクチャーに表示されるモジュールクラスは次のとおりです。
w9b7-api/src/main/java/com/acme/w9b7
├── exception
│ └── NoSuchW9B7EntryException.java
├── model
│ ├── W9B7Entry.java
│ ├── W9B7EntryModel.java
│ ├── W9B7EntrySoap.java
│ ├── W9B7EntryTable.java
│ └── W9B7EntryWrapper.java
└── service
├── persistence
│ ├── 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 // MODIFIABLE
│ └── W9B7EntryModelImpl.java
└── service
├── base
│ └── W9B7EntryLocalServiceBaseImpl.java
├── impl
│ └── W9B7EntryLocalServiceImpl.java // MODIFIABLE
└── persistence
└── impl
├── constants
│ └── W9B7EntryPersistenceConstants.java
├── W9B7EntryModelArgumentsResolver.java
└── W9B7EntryPersistenceImpl.java
W9B7EntryImpl.javaクラスとW9B7EntryLocalServiceImpl.javaクラスは、変更できる唯一のクラスです。 生成された他のクラスを変更しないでください—Service Builder は、実行されるたびにそれらのコンテンツを再生成します。
エンティティに対してリモート サービスを有効にして (つまり、 remote-service="true") Service Builder を実行すると、Service Builder は変更可能なリモート サービス実装クラス (例: W9B7EntryServiceImpl.java) を含むリモート サービス クラスを生成します。
APIクラスから順に、すべてのクラスについて説明します。
APIクラス
APIクラスは、パブリックインターフェイス、ユーティリティー、および定数を定義します。
| APIクラス | 説明 |
|---|---|
W9B7Entry | W9B7Entryモデルインターフェイス。 W9B7EntryModelを拡張します。 |
W9B7EntryModel | ベースモデルインターフェイス。 このインターフェイスとそのW9B7EntryModelImpl実装は、サービスビルダーが生成するデフォルトのプロパティアクセサーのコンテナとしてのみ機能します。 すべてのヘルパーメソッドとすべてのアプリケーションロジックをW9B7EntryImplに追加する必要があります。 |
W9B7EntrySoap | W9B7EntryModelImplに似たSOAPモデル。 W9B7EntrySoapはシリアル化可能です。 W9B7Entryは実装されていません。 |
W9B7EntryTable | エンティティのテーブルを表します。 |
W9B7EntryWrapper | W9B7Entryをラップするラッパー。 このクラスは、エンティティ をカスタマイズするために拡張されます。 |
W9B7EntryPersistence | create、remove、countAll、find、findAllなどのエンティティのCRUDメソッドを定義する永続性インターフェイス。 |
W9B7EntryUtil | W9B7EntryPersistenceImplをラップし、CRUD操作のためにデータベースへの直接アクセスを提供する永続性ユーティリティクラス。 このユーティリティはサービス レイヤーでのみ使用する必要があります。ポートレット クラスでは、 W9B7Entry クラスに @Reference アノテーションを挿入して使用します。 |
W9B7EntryLocalService | ローカルサービスインターフェイス。 |
W9B7EntryLocalServiceUtil | W9B7EntryLocalServiceImplをラップするローカルサービスユーティリティクラス。 |
W9B7EntryLocalServiceWrapper | W9B7EntryLocalServiceを実装するローカルサービスラッパー。 このクラスは、 エンティティのローカル サービスをカスタマイズするために拡張されます。 |
実装クラス
これらのクラスは、モデルレイヤー、永続性レイヤー、およびサービスレイヤーを実装します。
| 実装クラス | 説明 |
|---|---|
W9B7EntryBaseImpl | W9B7EntryModelImplを拡張して、W9B7_W9B7Entry データベーステーブルの行を表します。各列はW9B7EntryModelプロパティにマッピングされます。 |
W9B7EntryCacheModel | キャッシュ内のW9B7Entryエンティティを表します。 |
W9B7EntryImpl (変更可能) | モデルの実装。 このクラスを使用して、ヘルパーメソッドとアプリケーションロジックをモデルに追加できます。 ヘルパーメソッドまたはアプリケーションロジックを追加しない場合、自動生成されたフィールドゲッターとセッターのみが使用可能です。 このクラスでメソッドを追加または変更するたびに、サービスビルダーは、次回の実行時にその変更をW9B7Entryインターフェイスにプロパゲートします。 |
W9B7EntryLocalServiceBaseImpl | ローカルサービスベースの実装。 これは抽象クラスです。 サービスビルダーは、さまざまなサービスクラスと永続性クラスのインスタンスをこのクラスに挿入します。 |
W9B7EntryLocalServiceImpl (変更可能) | ローカルサービスの実装。 これは、ローカルサービスで変更する必要がある唯一のクラスです。 ここにビジネスロジックを追加します。 サービスビルダーは、ここで追加または変更されたメソッドについて、次回の実行時にその変更をW9B7EntryLocalServiceインターフェイスにプロパゲートします。 |
W9B7EntryModelArgumentsResolver | エンティティ値を取得するためのパラメーターを処理します。 |
W9B7EntryModelImpl | ベースモデルの実装。 |
W9B7EntryPersistenceImpl | W9B7EntryPersistenceを実装する永続性実装クラス。 |
*BaseImpl抽象クラスは実装に富んでいます。 W9B7EntryImplクラスとW9B7EntryLocalServiceImplクラスはそれらを拡張し、機能を追加する方法を提供します。
ローカルサービスメソッドの追加
指定された名前と説明からW9B7Entryインスタンスを作成するための便利なメソッドを追加して、ローカルサービスを拡張します。
-
次の便利なメソッドを
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メソッド呼び出しを介してそのエントリーが永続化されます。注W9B7EntryLocalServiceBaseImpl.javaなどのサービス ビルダーによって生成された基本クラスは、アプリケーションで使用するのに役立つフィールドとメソッドを提供します。 -
サービスビルダーを実行します。
cd w9b7-service../gradlew buildService出力:
> Task :w9b7-service:buildService Building W9B7Entry Writing ../w9b7-api/src/main/java/com/acme/w9b7/model/W9B7EntryModel.java Writing ../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalService.java Writing ../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalServiceUtil.java Writing ../w9b7-api/src/main/java/com/acme/w9b7/service/W9B7EntryLocalServiceWrapper.java Writing src/main/resources/service.propertiesサービスビルダーは、新しいローカルサービスメソッドの実装をサポートするようにローカルサービスAPIを更新しました。
-
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に変更します。
次に、以下の手順に従います。
-
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、モジュールJARをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.w9b7.api_1.0.0 STARTED com.acme.w9b7.service_1.0.0 -
[コントロールパネル]→[サーバー管理]→[スクリプト]でスクリプトコンソールに移動します。
-
次のスクリプトを実行して、新しいメソッドを介してエントリーを追加します。
import com.acme.w9b7.service.W9B7EntryLocalServiceUtil; W9B7EntryLocalServiceUtil.addW9B7Entry("Remove clutter from your desk.", "Straighten Desk"); w9b7Entries = W9B7EntryLocalServiceUtil.getW9B7Entries(-1, -1); for (w9b7Entry in w9b7Entries){ out.println(w9b7Entry); }出力:
{w9b7EntryId=1234, description=Remove clutter from your desk., name=Straighten Desk}エントリーはJSON形式で印刷されます。
これで、新しいサービスメソッドが正常に追加されました。
次のステップ
サービスビルダーで生成されたクラスについてと、ローカルサービスメソッドを追加する方法を理解したので、ポートレットからサービスを呼び出す方法を学習できます。