ローカルでサービスを呼び出す
DXP/Portalにデプロイされたサービスビルダーサービスは、同じJVM内の他のクラスから呼び出すことができます。 これらのサービスはクラスに対して ローカル です。
サービスビルダーサービスは、宣言型サービス(DS)コンポーネントです。つまり、コンテナで管理されます。 コンシューマはコンテナにコンポーネントを要求し、コンテナは一致するコンポーネントインスタンスを提供します。
クラスをDSコンポーネントとして実装する利点は、クラスが依存する他のコンポーネントが使用可能でなければ、そのクラスが有効にならない点です。 コンポーネントの依存関係が満たされていないためにコンポーネントをアクティブ化できない場合、ランタイムフレームワークがその問題を報告します。
ここでは、portletDSコンポーネントからサービスビルダーサービスを呼び出します。 新しいエントリーを追加するためのフォームがあるポートレットアプリケーションの例を使用します。 フォームはJavaServer Page(JSP)にあります。 フォームを送信すると、ポートレットがトリガーされ、エントリを作成して永続化するためのサービスが呼び出されます。
ポートレットからサービスを呼び出す
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:7.4.13-u55。
メールアドレス[email protected]_とパスワード_test_を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順を実行します。
サンプルをダウンロードし、解凍してください。
curl https://resources.learn.liferay.com/dxp/latest/ja/building-applications/data-frameworks/service-builder/service-builder-basics/liferay-t2p5.zip -O
unzip liferay-t2p5.zip
サンプルをビルドしてデプロイします。
cd liferay-t2p5
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、モジュールJARをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。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
T2P5ポートレット ウィジェットを [サンプル] カテゴリからウィジェットページに追加します。 T2P5ポートレットが表示されます。
テキストフィールドにエントリ名と説明を入力し、 [Submit] をクリックします。 例:
[Name] :
Trim the Hedges
[Description]:
Use hedge clippers to trim the hedges into a nice shape.
名前と説明を含む新しいエントリーが [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
The t2p5-web
module’s portlet application depends on the T2P5EntryLocalService
class. The web module’s build.gradle
file declares a dependency on the t2p5-api
project.
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;
}
T2P5Portlet
はMVCPortlet
です。 _t2p5EntryLocalService
と呼ばれるT2P5EntryLocalService
フィールドと、addT2P5Entry
と呼ばれるアクション処理メソッドがあります。
_t2p5EntryLocalService
フィールドの@Reference
アノテーションは、T2P5EntryLocalService
コンポーネントインスタンスをフィールドに挿入するようにランタイムフレームワークにシグナルを送信します。
@Reference
アノテーションの使用に関する詳細と、他の方法でサービスにアクセスする詳細については、コアフレームワークの依存性注入を参照してください。
addT2P5Entry
メソッドは、T2P5EntryLocalService
’のaddT2P5Entry
メソッドを呼び出し、ActionRequest
から取得した説明と名前のパラメーターを渡します。
ポートレットのview.jsp
テンプレート(次で説明)は、ActionRequests
をT2P5Portlet
に送信します。
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
が呼び出されます。これは、このメソッドがactionUrl
名addT2P5Entry
にマッピングされるためです。
<aui:form>
は、エントリーの名前と説明のテキストフィールドをレンダリングします。 フォームを送信すると、その値がActionRequest
とともにポートレットメソッドに渡されます。
ポートレットアクションの詳細については、MVCポートレットを使用したアクションの呼び出しを参照してください。
ページの [エントリ] セクションには、すべてのエントリーが一覧表示されます。 T2P5EntryLocalServiceUtil.getT2P5Entries(-1, -1)
を呼び出すことにより、すべてのエントリーを取得します。最小値と最大値の範囲の値-1
は、すべてのエントリーを返すようにメソッドに指示します。
ポートレットアプリケーションからサービスビルダーサービスを呼び出しました。 これらのサービスは、MVCポートレットで簡単に使用できます。
次のステップ
サービスビルダーの基本を理解したので、エンティティの定義を調べて、エンティティ間の関係を作成したり、エンティティをローカライズしたり、クエリをサポートしたりできます。 または、サービスビルダーによるビジネスロジックを学ぶこともできます。