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

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

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

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

curl https://resources.learn.liferay.com/dxp/latest/ja/building-applications/data-frameworks/service-builder/service-builder-basics/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クラスは、変更できる唯一のクラスです。 生成された他のクラスは変更しないでください。サービスビルダーは、サービスビルダーが実行されるたびにそのコンテンツを再生成します。

note

エンティティに対してリモートサービスを有効にして(つまり、remote-service="true")サービスビルダーを実行すると、サービスビルダーは、変更可能なリモートサービス実装クラス(たとえば、W9B7EntryServiceImpl.java)を含むリモートサービスクラスを生成します。

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

APIクラス

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

APIクラス 説明
W9B7Entry W9B7Entryモデルインターフェイス。 W9B7EntryModelを拡張します。
W9B7EntryModel ベースモデルインターフェイス。 このインターフェイスとそのW9B7EntryModelImpl実装は、サービスビルダーが生成するデフォルトのプロパティアクセサーのコンテナとしてのみ機能します。 すべてのヘルパーメソッドとすべてのアプリケーションロジックをW9B7EntryImplに追加する必要があります。
W9B7EntrySoap W9B7EntryModelImplに似たSOAPモデル。 W9B7EntrySoapはシリアル化可能です。 W9B7Entryは実装されていません。
W9B7EntryTable エンティティのテーブルを表します。
W9B7EntryWrapper W9B7Entryをラップするラッパー。 このクラスを拡張して、エンティティをカスタマイズすることができます。
W9B7EntryPersistence createremovecountAllfindfindAllなどのエンティティの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インスタンスを作成するための便利なメソッドを追加して、ローカルサービスを拡張します。

  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メソッド呼び出しを介してそのエントリーが永続化されます。

    note

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

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

    cd w9b7-service
    
    ../gradlew buildService
    

    Output:

    > 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を更新しました。

  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.55-ga55。

http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。

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

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

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

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

  2. Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.w9b7.api_1.0.0
    STARTED com.acme.w9b7.service_1.0.0
    
  3. [コントロールパネル]→[サーバー管理]→[スクリプト]でスクリプトコンソールに移動します。

  4. 次のスクリプトを実行して、新しいメソッドを介してエントリーを追加します。

    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形式で印刷されます。

  これで、新しいサービスメソッドが正常に追加されました。

次のステップ

サービスビルダーで生成されたクラスについてと、ローカルサービスメソッドを追加する方法を理解したので、ポートレットからサービスを呼び出す方法を学習できます。