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

ローカルでサービスを呼び出す

DXP/Portalにデプロイされたサービスビルダーサービスは、同じJVM内の他のクラスから呼び出すことができます。 これらのサービスはクラスに対してローカルです。

サービスビルダーサービスは、宣言型サービス(DS)コンポーネントです。つまり、コンテナで管理されます。 コンシューマはコンテナにコンポーネントを要求し、コンテナは一致するコンポーネントインスタンスを提供します。

クラスをDSコンポーネントとして実装する利点は、クラスが依存する他のコンポーネントが使用可能でなければ、そのクラスが有効にならない点です。 コンポーネントの依存関係が満たされていないためにコンポーネントをアクティブ化できない場合、ランタイムフレームワークがその問題を報告します。

ここでは、 ポートレット DS コンポーネントからサービス ビルダー サービスを呼び出します。 新しいエントリーを追加するためのフォームがあるポートレットアプリケーションの例を使用します。 フォームはJavaServer Page(JSP)にあります。 フォームを送信すると、ポートレットがトリガーされ、エントリを作成して永続化するためのサービスが呼び出されます。

ポートレットからサービスを呼び出す

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

docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts

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

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

  1. サンプルをダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-t2p5.zip -O
    
    unzip liferay-t2p5.zip
    
  2. サンプルをビルドしてデプロイします。

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

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

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

    STARTED com.acme.t2p5.api_1.0.0
    STARTED com.acme.t2p5.service_1.0.0
    STARTED com.acme.t2p5.web_1.0.0
    
  4. T2P5ポートレットウィジェットを[サンプル]カテゴリからウィジェットページに追加します。 T2P5ポートレットが表示されます。

    T2P5ポートレットをページに追加しました。

  5. テキストフィールドにエントリ名と説明を入力し、[Submit]をクリックします。 例えば、

    名前: 生け垣を整える

    説明: 生垣バリカンを使用して、生垣をきれいな形に整えます。

T2P5ポートレットをページに追加しました。

名前と説明を含む新しいエントリーが[T2P5 Entry]リストに表示されます。

ポートレットからサービスビルダーサービスを呼び出しました。 その仕組みを、サービスAPIから見ていきましょう。

サービスAPIを調べる

t2p5-apiモジュールプロジェクトのT2P5EntryLocalServiceクラスには、addT2P5Entry(String description, String name)というメソッドがあります。

addT2P5Entryメソッドは、指定された説明と名前でT2P5Entryを作成し、エントリーを永続化します。

t2p5-service モジュール プロジェクトの T2P5EntryLocalServiceImpl クラスは、 T2P5EntryLocalService インターフェイスを実装します。

t2p5-apiモジュールのbnd.bndファイルは、com.acme.t2p5.serviceパッケージ、com.acme.t2p5.modelパッケージ、およびコンシューマが使用するその他のパッケージのエクスポートを宣言します。 bnd.bndファイルは次のとおりです。

Bundle-Name: Acme T2P5 API
Bundle-SymbolicName: com.acme.t2p5.api
Bundle-Version: 1.0.0
Export-Package:\
	com.acme.t2p5.exception,\
	com.acme.t2p5.model,\
	com.acme.t2p5.service,\
	com.acme.t2p5.service.persistence

t2p5-web モジュールのポートレット アプリケーションは、 T2P5EntryLocalService クラスに依存します。 Web モジュールの build.gradle ファイルは、 t2p5-api プロジェクトへの依存関係を宣言しています。

dependencies {
	compileOnly group: "com.liferay.portal", name: "release.portal.api"
	compileOnly project(":t2p5-api")
}

成果物の検索と依存関係の指定については、 依存関係の構成を参照してください。

ポートレットを調べる

t2p5-webモジュールのT2P5Portletクラスは、T2P5Entryインスタンスを追加する要求を処理します。 T2P5Portletクラスは次のとおりです。

@Component(
	property = {
		"com.liferay.portlet.display-category=category.sample",
		"javax.portlet.display-name=T2P5 Portlet",
		"javax.portlet.init-param.view-template=/view.jsp"
	},
	service = Portlet.class
)
public class T2P5Portlet extends MVCPortlet {

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

		_t2p5EntryLocalService.addT2P5Entry(
			ParamUtil.getString(actionRequest, "description"),
			ParamUtil.getString(actionRequest, "name"));
	}

	@Reference
	private T2P5EntryLocalService _t2p5EntryLocalService;

}

T2P5PortletMVCPortletです。 _t2p5EntryLocalServiceと呼ばれるT2P5EntryLocalServiceフィールドと、addT2P5Entryと呼ばれるアクション処理メソッドがあります。

_t2p5EntryLocalServiceフィールドの@Referenceアノテーションは、T2P5EntryLocalServiceコンポーネントインスタンスをフィールドに挿入するようにランタイムフレームワークにシグナルを送信します。

@Reference アノテーションの使用方法と他の方法でのサービスへのアクセスの詳細については、「 コア フレームワーク」の「 依存性注入 」を参照してください。

addT2P5Entryメソッドは、T2P5EntryLocalService'のaddT2P5Entryメソッドを呼び出し、ActionRequestから取得した説明と名前のパラメーターを渡します。

ポートレットのview.jspテンプレート(次で説明)は、ActionRequestsT2P5Portletに送信します。

JSPを調べる

view.jspは、エントリを追加するためのフォームを提供し、現在のすべてのエントリを表示します。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>

<%@ page import="com.acme.t2p5.model.T2P5Entry" %><%@
page import="com.acme.t2p5.service.T2P5EntryLocalServiceUtil" %>

<%@ page import="java.util.List" %>

<portlet:defineObjects />

<h4>T2P5 Portlet</h4>

<hr />

<h5>Add T2P5 Entry</h5>

<portlet:actionURL name="addT2P5Entry" var="addT2P5EntryURL" />

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

	<aui:input name="description" type="text" />

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

<hr />

<h5>T2P5 Entries</h5>

<%
List<T2P5Entry> t2p5Entries = T2P5EntryLocalServiceUtil.getT2P5Entries(-1, -1);
%>

<c:choose>
	<c:when test="<%= t2p5Entries.size() > 0 %>">
		<table>
			<tbody>
				<c:forEach items="<%= t2p5Entries %>" var="entry">
					<tr>
						<td>${entry}</td>
					</tr>
				</c:forEach>
			</tbody>
		</table>
	</c:when>
	<c:otherwise>
		<em>There are no T2P5 entries.</em>
	</c:otherwise>
</c:choose>

JSPは、次のタグライブラリのタグを使用します。

  • コアJSTL
  • ポートレット
  • LiferayのAlloy UI(aui

次のクラスをインポートします。

  • T2P5Entry
  • T2P5EntryLocalServiceUtil
  • java.util.List

ページの[Add T2P5 Entry]セクションには、エントリーを追加するためのフォームがあります。 <portlet:defineObjects /> タグにより、標準のポートレット オブジェクトをテンプレートで使用できるようになります。 auiタグは、これらのオブジェクトを使用します。

<portlet:actionURL name="addT2P5Entry" var="addT2P5EntryURL" /> タグは、 addT2P5EntryURL 変数を addT2P5Entryという名前のポートレット アクションにマッピングします。 このactionURLを使用してActionRequestを送信すると、ポートレットのメソッドaddT2P5Entryが呼び出されます。これは、このメソッドがactionUrladdT2P5Entryにマッピングされるためです。

<aui:form> は、エントリの名前と説明のテキスト フィールドをレンダリングします。 フォームを送信すると、その値がActionRequestとともにポートレットメソッドに渡されます。

ポートレット アクションの詳細については、「 MVC ポートレットを使用したアクションの呼び出し」を参照してください。

ページの[エントリ]セクションには、すべてのエントリーが一覧表示されます。 T2P5EntryLocalServiceUtil.getT2P5Entries(-1, -1)を呼び出すことにより、すべてのエントリーを取得します。最小値と最大値の範囲の値-1は、すべてのエントリーを返すようにメソッドに指示します。

ポートレットアプリケーションからサービスビルダーサービスを呼び出しました。 これらのサービスは、MVCポートレットで簡単に使用できます。

次のステップ

サービスビルダーの基本を理解したので、エンティティの定義を調べて、エンティティ間の関係を作成したり、エンティティをローカライズしたり、クエリをサポートしたりできます。 または、 サービス ビルダーを使用してビジネス ロジックを詳しく調べることもできます。