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

オブジェクトエントリマネージャの使用

オブジェクトエントリデータの読み書きをプログラムで行うには、 自動生成されたヘッドレス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に変更します。

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

  1. X4M2 Service Builder プロジェクト をダウンロードして解凍します

    curl https://resources.learn.liferay.com/examples/liferay-x4m2.zip -O
    
    unzip liferay-x4m2.zip
    
  2. X4M2サンプルには、カスタムオブジェクト定義とエントリをLiferayに読み込むシェルスクリプトが含まれています。 実行するには、ターミナルで liferay-x4m2/curl と入力します。

  3. シェルスクリプトを実行します。

    ./populate_x4m2.sh
    

    このスクリプトは以下のリソースを追加します。

    • オブジェクト定義: 可能
      • オブジェクトエントリ1:
        • 外部参照コード: ABLE_1
        • 名前:エイブル1
      • オブジェクトエントリ2:
        • 外部参照コード: ABLE_2
        • 名前:エイブル2
      • オブジェクトエントリ3:
        • 外部参照コード: ABLE_3
        • 名前:エイブル3
  4. モジュールのルート (liferay-x4m2.zip/) から、サンプルをビルドしてデプロイします。

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

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

  5. 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]
    
  6. ブラウザでhttps://localhost:8080を開きます。

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

    すぐにオブジェクトのエントリ一覧が表示されます。

    オブジェクトがポートレットのビューに表示されます。

  8. X4M2ポートレットを使用してエントリを追加します(例:名前に x4m2 、説明に x4m2 と入力します)。

  9. をクリックして を送信します。

    X4M2 Service Builderのエンティティは、オブジェクトエントリの下に表示されます。

サービスビルダーエンティティと一緒にオブジェクトエントリーをディスプレイするために、ObjectEntryManagerの getObjectEntries方式が呼び出されました。

X4M2オブジェクトコードの理解

ObjectEntryManager に加えて、いくつかのクラスが必要です。

クラス目的
ObjectDefinitionLocalServiceObjectEntryManager メソッドに渡すためのオブジェクト定義を取得します。
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 を使用できます。