Documentation

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

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

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

curl https://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クラスは、変更できる唯一のクラスです。 生成された他のクラスは変更しないでください。サービスビルダーは、サービスビルダーが実行されるたびにそのコンテンツを再生成します。

注釈

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

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 (MODIFIABLE)

モデルの実装。 このクラスを使用して、ヘルパーメソッドとアプリケーションロジックをモデルに追加できます。 ヘルパーメソッドまたはアプリケーションロジックを追加しない場合、自動生成されたフィールドゲッターとセッターのみが使用可能です。 このクラスでメソッドを追加または変更するたびに、サービスビルダーは、次回の実行時にその変更をW9B7Entryインターフェイスに伝播します。

W9B7EntryLocalServiceBaseImpl

ローカルサービスベースの実装。 これは抽象クラスです。 サービスビルダーは、さまざまなサービスクラスと永続性クラスのインスタンスをこのクラスに挿入します。

W9B7EntryLocalServiceImpl (MODIFIABLE)

ローカルサービスの実装。 これは、ローカルサービスで変更する必要がある唯一のクラスです。 ここにビジネスロジックを追加します。 サービスビルダーは、ここで追加または変更されたメソッドについて、次回の実行時にその変更を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メソッド呼び出しを介してそのエントリーが永続化されます。

    注釈

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

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

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

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

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

新しいメソッドは、モジュールで公開できます。

新しいサービスメソッドのテスト

次に、モジュールをデプロイして、新しいサービスをテストします。

  1. Liferay Dockerコンテナを起動します。

    docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22
    
  2. サンプルをビルドしてデプロイします。

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

    注釈

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

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

    STARTED com.acme.w9b7.api_1.0.0
    STARTED com.acme.w9b7.service_1.0.0
    
  4. ブラウザでhttp://localhost:8080を開きます。

  5. デフォルトの認証情報を使用してサインインします。

    ユーザー名 : test@liferay.com

    パスワード: test

  6. [コントロールパネル]→[サーバー管理]→[スクリプト]でスクリプトコンソールに移動します。

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

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

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

次のステップ

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