Documentation

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

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

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

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

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

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

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

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

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

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

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

    curl https://learn.liferay.com/dxp/latest/ja/building-applications/data-frameworks/service-builder/service-builder-basics/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] をクリックします。 例:

    Name] : Trim the Hedges

    Description]: Use hedge clippers to trim the hedges into a nice shape.

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ポートレットで簡単に使用できます。

次のステップ

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