オブジェクトエントリマネージャの使用
オブジェクトエントリデータの読み書きをプログラムで行うには、 自動生成されたヘッドレスAPIを使用するのが最適です。 ただし、従来のOSGi拡張ポイントを使用する場合や、レガシーサービスビルダーアプリケーションを保守する場合は、JavaからHTTP呼び出しを行うオーバーヘッドを回避するために、ネイティブJava APIを使用してオブジェクトエントリにアクセスできます。
ObjectEntryLocalService を使用することは、決して正しいアプローチではありません。 その代わりに、Liferay は ObjectEntryManagerを提供しており、これにはいくつかの利点があります。
- オブジェクト定義で定義されたアクションと検証を実行します。
- ワークフローが有効になっているオブジェクト定義の場合、エントリはワークフローを通して送信されます。
- オブジェクト定義の状態マネージャから状態管理ロジックを処理します。
- エントリへのアクセスまたは変更に関するユーザー権限を確認します。
- これにより、関係の永続化が簡素化されます。関係IDを手動で取得してマッピングテーブルを管理する代わりに、入力マップ内の関係キーを使用して関連するエントリをリンクできます。
この例では、サービスビルダーに基づくシンプルな CRUD アプリケーションが ObjectEntryManager を使用してカスタム オブジェクトを消費し、そのエントリを JSP に表示します。
X4M2サービスビルダーアプリケーションコードをデプロイする
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、以下の手順に従います。
-
X4M2 Service Builder プロジェクト をダウンロードして解凍します 。
curl https://resources.learn.liferay.com/examples/liferay-x4m2.zip -Ounzip liferay-x4m2.zip -
X4M2サンプルには、カスタムオブジェクト定義とエントリをLiferayに読み込むシェルスクリプトが含まれています。 実行するには、ターミナルで
liferay-x4m2/curlと入力します。 -
シェルスクリプトを実行します。
./populate_x4m2.shこのスクリプトは以下のリソースを追加します。
- オブジェクト定義: 可能
- オブジェクトエントリ1:
- 外部参照コード: ABLE_1
- 名前:エイブル1
- オブジェクトエントリ2:
- 外部参照コード: ABLE_2
- 名前:エイブル2
- オブジェクトエントリ3:
- 外部参照コード: ABLE_3
- 名前:エイブル3
- オブジェクトエントリ1:
- オブジェクト定義: 可能
-
モジュールのルート (
liferay-x4m2.zip/) から、サンプルをビルドしてデプロイします。./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされた jar ファイルを Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.x4m2.api_1.0.0 [1433] STARTED com.acme.x4m2.service_1.0.0 [1434] STARTED com.acme.x4m2.web_1.0.0 [1435] -
ブラウザで
https://localhost:8080を開きます。 -
X4M2ポートレットをページに追加する。 サンプルポートレットは、サンプルウィジェットの下にあります。
すぐにオブジェクトのエントリ一覧が表示されます。

-
X4M2ポートレットを使用してエントリを追加します(例:名前に
x4m2、説明にx4m2と入力します)。 -
をクリックしてを送信します。
サービスビルダーエンティティと一緒にオブジェクトエントリーをディスプレイするために、ObjectEntryManagerの getObjectEntries方式が呼び出されました。
X4M2オブジェクトコードの理解
ObjectEntryManager に加えて、いくつかのクラスが必要です。
| クラス | 目的 |
|---|---|
ObjectDefinitionLocalService | ObjectEntryManager メソッドに渡すためのオブジェクト定義を取得します。 |
DTOConverterRegistry | これを DTOConverterContext コンストラクタに渡すと、システムは内部データベース モデルを要求されている特定の DTO ( ObjectEntryなど) に変換するために使用する適切なコンバータを決定できます。 |
DefaultDTOConverterContext | データベース モデルを DTO に変換するために必要なコンテキスト (現在のユーザー、受け入れられる言語、含めるフィールドなど) を提供するために、これを ObjectEntryManager に渡します。 |
ObjectEntryManager | オブジェクトエントリに対するCRUD操作を実行したり、オブジェクト内で定義されたロジック(検証やアクションなど)を調整したりするには、そのメソッドを呼び出します。 |
以下は、オブジェクトエントリを取得するために ObjectEntrtyManager を呼び出すポートレットクラスのメソッド全体です。
}
catch (Exception exception) {
throw new PortletException(exception);
}
}
private Collection<ObjectEntry> _getObjectEntries(
long companyId, String externalReferenceCode, User user)
throws Exception {
Page<ObjectEntry> page = _objectEntryManager.getObjectEntries(
companyId,
_objectDefinitionLocalService.
getObjectDefinitionByExternalReferenceCode(
externalReferenceCode, companyId),
String.valueOf(companyId), null,
new DefaultDTOConverterContext(
取得されたエントリは、 render メソッドでレンダリング要求に追加されます。
@Override
public void render(
RenderRequest renderRequest, RenderResponse renderResponse)
throws PortletException {
try {
ThemeDisplay themeDisplay =
(ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
renderRequest.setAttribute(
"objectEntries",
_getObjectEntries(
themeDisplay.getCompanyId(), "C_ABLE",
themeDisplay.getUser()));
renderRequest.setAttribute(
"x4m2Entries",
_x4m2EntryLocalService.getX4M2Entries(
QueryUtil.ALL_POS, QueryUtil.ALL_POS));
JSPは、オブジェクトエントリを含むエンティティのレンダリングを担当します。
<c:when test="${not empty objectEntries}">
<table>
<tbody>
<c:forEach items="${objectEntries}" var="objectEntry">
<tr>
<td>${objectEntry}</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:when>
<c:otherwise>
<em>There are no object entries.</em>
</c:otherwise>
</c:choose>
<h5>X4M2 Entries</h5>
<c:choose>
<c:when test="${not empty x4m2Entries}">
<table>
<tbody>
<c:forEach items="${x4m2Entries}" var="x4m2Entry">
<tr>
<td>${x4m2Entry}</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:when>
<c:otherwise>
<em>There are no X4M2 entries.</em>
</c:otherwise>
</c:choose>
ほとんどの場合、カスタムオブジェクトデータにアクセスするには、ヘッドレスAPIを使用する必要があります。 ただし、Liferay で Java からオブジェクト サービスにアクセスする必要がある場合は、 ObjectEntrymanager を使用できます。