サービスビルダーを使用したビジネスロジック

サービスビルダーを使用したビジネスロジック

サービスビルダーでモデル、永続化、サービスコードを生成したら、ビジネスロジックを追加し始めることができます。 サービスビルダが生成するエンティティには,モデル実装とローカルサービス実装クラスが含まれます. アプリケーションのビジネスロジックは、これらのクラスで実装することができます。 生成されたサービスは、後で永続レイヤーからCRUD操作を呼び出すデフォルトのメソッドを含んでいます。 ビジネスロジックを作成したら、再びサービスビルダーを実行して、アプリケーションのインターフェースをプロパゲートさせ、新しいロジックを呼び出せるようにします。

サンプルプロジェクトを参照する

新しいLiferay DXPインスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/dxp:7.4.13-u86。

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

次に、以下の手順を実行します。

  1. Business Logic with Service Builder をダウンロードして解凍します。

    curl https://resources.learn.liferay.com/dxp/latest/en/building-applications/data-frameworks/service-builder/liferay-e4g5.zip -O
    
    unzip liferay-e4g5.zip
    
  2. モジュールのルートから、ビルドおよびデプロイします。

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

    このコマンドは、デプロイされたjarをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。

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

    STARTED com.acme.e4g5.api_1.0.0 [1034]
    STARTED com.acme.e4g5.service_1.0.0 [1035]
    STARTED com.acme.e4g5.web_1.0.0 [1036]
    
  4. サンプルのモジュールが機能していることを確認します。 ブラウザでhttps://localhost:8080を開きます。

  5. E4G5ポートレットをページに追加します。 サンプルポートレットは、サンプルウィジェットの下にあります。

    E4G5ポートレットをページに追加します。

  6. 名前と説明を入力してエントリーを追加する(例:e4g5 name1 と e4g5 description1)。Addをクリックすると、E4G5 Entriesの下に新しいエントリーが表示されます。e4g5EntryId の番号を控えておいてください。

  7. 次に、このエントリーを更新し、前のステップで入力した e4g5EntryId と新しい名前と説明を入力します。(例:41804、e4g5 name2、e4g5 description2)。Updateをクリックすると、エントリーが更新されます。

  8. 最後に、e4g5EntryIdを入力して、エントリーを削除します。 [Delete]をクリックすると、エントリーが削除されます。

サービスレイヤーの更新

E4G5Entryエントリーを追加、更新、削除できるメソッドを追加し、ローカルサービスを拡張します。

Addメソッドの実装

  1. エンティティを作成するためのパラメータを持つadd*メソッドを宣言します。
	public E4G5Entry addE4G5Entry(String description, String name)
		throws PortalException {

		E4G5Entry e4g5Entry = e4g5EntryPersistence.create(
			counterLocalService.increment());

		e4g5Entry.setDescription(description);
		e4g5Entry.setName(name);

		return e4g5EntryPersistence.update(e4g5Entry);
	}
  1. エンティティに関連付けられた*Persistenceクラスは、与えられたIDのエンティティインスタンスを構築するcreate()メソッドを持っています。 *BaseLocalServiceImplごとに、エンティティのcounterLocalServiceオブジェクトがあります。 カウンターサービスのincrement()メソッドを呼び出して、エンティティインスタンスのプライマリーキーを生成します。

  2. エンティティのセッターメソッドを使用して、エンティティの属性を入力します。 サンプルでは2つの属性を設定しています。 namedescriptionです。

  3. *Persistenceクラスのupdate()メソッドを呼び出し、エンティティオブジェクトを渡します。

Updateメソッドの実装

  1. エンティティを更新するためのパラメータを持つupdate*メソッドを宣言します。 このサンプルでは、e4g5EntryIdとともに、namedescription属性を受け取ります。

	public E4G5Entry updateE4G5Entry(
			long e4g5EntryId, String description, String name)
		throws PortalException {

		E4G5Entry e4g5Entry = e4g5EntryPersistence.findByPrimaryKey(
			e4g5EntryId);

		e4g5Entry.setDescription(description);
		e4g5Entry.setName(name);

		return e4g5EntryPersistence.update(e4g5Entry);
  1. *PersistenceクラスのfindByPrimaryKey()メソッドを使用して、エントリーIDによるエンティティインスタンスを取得します。

  2. エンティティのセッターメソッドを使用して、エンティティの属性を入力します。

  3. *Persistenceクラスのupdate()メソッドを呼び出し、エンティティオブジェクトを渡します。

Deleteメソッドの実装

  1. エンティティのエントリIDを受け取るdelete*メソッドを宣言します。
	public E4G5Entry deleteE4G5Entry(long e4g5EntryId) throws PortalException {
		E4G5Entry e4g5Entry = e4g5EntryPersistence.findByPrimaryKey(
			e4g5EntryId);

		e4g5EntryPersistence.remove(e4g5Entry);

		return e4g5Entry;
  1. *Persistence クラスの delete() メソッドを呼び出し、エンティティオブジェクトを渡します。

add*, update*, delete* メソッドを実装した後、サービスビルダーを実行して、新しいサービスメソッドを *LocalServiceインターフェースにプロパゲートさせます。

バックエンドの統合

ここで、作成したサービスメソッドをポートレットアクションでWebモジュールに実装します。

ポートレットアクション

Webモジュールには、MVC Portletを使用することができます。 サンプルプロジェクトのポートレットは、 add, update, deleteのエントリアクションを持ちます。

	public void addE4G5Entry(
			ActionRequest actionRequest, ActionResponse actionResponse)
		throws PortalException {

		_e4g5EntryLocalService.addE4G5Entry(
			ParamUtil.getString(actionRequest, "description"),
			ParamUtil.getString(actionRequest, "name"));
	}

	public void deleteE4G5Entry(
			ActionRequest actionRequest, ActionResponse actionResponse)
		throws PortalException {

		_e4g5EntryLocalService.deleteE4G5Entry(
			ParamUtil.getLong(actionRequest, "e4g5EntryId"));
	}

	public void updateE4G5Entry(
			ActionRequest actionRequest, ActionResponse actionResponse)
		throws PortalException {

		_e4g5EntryLocalService.updateE4G5Entry(
			ParamUtil.getLong(actionRequest, "e4g5EntryId"),
			ParamUtil.getString(actionRequest, "description"),
			ParamUtil.getString(actionRequest, "name"));
	}

各メソッドは、ActionRequestActionResponseのパラメータを受け取ります。 ActionRequestはビューレイヤーから情報を受け取り、 ActionResponseはビューレイヤーに情報を戻すのに使用することができます。

addE4G5Entry()メソッドは、名前と説明を受け取り、サービスを呼び出してエントリーを追加します。 updateE4G5Entry()メソッドは、エントリID、名前、説明を受け取り、特定のエントリを更新するためにサービスを呼び出します。 deleteE4G5Entry()メソッドは、エントリIDを受け取り、サービスを呼び出してエントリを削除します。

JSPのアクションをマッピングする

ここで、作成したアクションメソッドをJSPにマッピングします。

<h3>Add a E4G5 Entry</h3>

<portlet:actionURL name="addE4G5Entry" var="addE4G5EntryURL" />

<aui:form action="<%= addE4G5EntryURL %>">
	<aui:input name="name" type="text" />
	<aui:input name="description" type="text" />

	<aui:button type="submit" value="add" />
</aui:form>

<hr />

<h3>Update a E4G5 Entry</h3>

<portlet:actionURL name="updateE4G5Entry" var="updateE4G5EntryURL" />

<aui:form action="<%= updateE4G5EntryURL %>">
	<aui:input name="e4g5EntryId" type="text" />
	<aui:input name="name" type="text" />
	<aui:input name="description" type="text" />

	<aui:button type="submit" value="update" />
</aui:form>

<hr />

<h3>Delete a E4G5 Entry</h2>
<portlet:actionURL name="deleteE4G5Entry" var="deleteE4G5EntryURL" />

<aui:form action="<%= deleteE4G5EntryURL %>">
	<aui:input name="e4g5EntryId" type="text" />

	<aui:button type="submit" value="delete" />
</aui:form>

JSPでは、タグライブラリのportlet:actionURLタグを使ってアクションをUIコンポーネントにバインドします。 portlet:actionURLname属性はポートレットで作成した各アクションメソッドと一致しなければならないことに注意してください。 var属性は、ポートレットアクションURLを任意の変数に割り当てます。 <aui:form>はユーザー入力用のテキストフィールドを描画します。 フォームを送信すると、その値がActionRequestとともにポートレットメソッドに渡されます。