legacy-knowledge-base
公開されました Sep. 10, 2025

アップグレード時に、重複した要素名を持つ構造体がDDM検証に失敗する。

written-by

Justin Choi

How To articles are not official guidelines or officially supported documentation. They are community-contributed content and may not always reflect the latest updates to Liferay DXP. We welcome your feedback to improve How To articles!

While we make every effort to ensure this Knowledge Base is accurate, it may not always reflect the most recent updates or official guidelines.We appreciate your understanding and encourage you to reach out with any feedback or concerns.

legacy-article

learn-legacy-article-disclaimer-text

この記事は、Liferay Portal 6.1 から Liferay Portal 6.2 または Liferay Digital Experience Platform 7.0 または 7.1 へのアップグレード時に、重複する要素名を持つ構造が Dynamic Data Mapping (DDM) 検証に失敗する既知の問題を説明しています。

Liferayプラットフォームをアップグレードされるお客様で、要素名が重複するWeb Content Structuresがある場合、いくつかの問題が発生します。 これは、Liferay Portal 6.1では、 、Web Content Structuresで重複する要素名を使用することが可能でしたが、現在は不可能になっていることに起因します。

例えば、Liferay Portal 6.1では、以下のようになります:

  • 母親の名前(テキスト):
    • 年齢 (テキスト):
  • 父親の名前(テキスト):
    • 年齢 (テキスト):

しかし、Liferay Portal 6.2-SP6以降では-この構造の設定はできなくなりました。 したがって、Liferay DXPにアップグレードする際、この構造体が存在すると、新しいDDMの検証処理が破綻し、スタックトレースにエラーが表示されます。 ベストプラクティスは、 アップグレードの前に、 という重複した名前の構造体をすべて修正することです。

次のような短縮されたスタックトレースが表示されることがあります:

20:36:51,758 INFO  [main][VerifyProcess:64] Verifying com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess
INFO - Verifying com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess
20:36:51,759 INFO  [main][LoggingTimer:70] Starting com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess#verifyStructures
INFO - Starting com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess#verifyStructures
20:36:52,120 INFO  [main][LoggingTimer:38] Completed com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess#verifyStructures in 361 ms
INFO - Completed com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess#verifyStructures in 361 ms
20:36:52,121 INFO  [main][VerifyProcess:79] Completed verification process com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess in 363ms
INFO - Completed verification process com.liferay.dynamic.data.mapping.verify.DDMServiceVerifyProcess in 363ms
20:36:52,123 ERROR [main][VerifyProcessTracker:221] com.liferay.portal.verify.VerifyException: com.liferay.dynamic.data.mapping.validator.DDMFormValidationException$MustNotDuplicateFieldName: The field name age cannot be defined more than once
com.liferay.portal.verify.VerifyException: com.liferay.dynamic.data.mapping.validator.DDMFormValidationException$MustNotDuplicateFieldName: The field name age cannot be defined more than once
        at com.liferay.portal.verify.VerifyProcess.verify(VerifyProcess.java:73)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker.executeVerifyProcesses(VerifyProcessTracker.java:218)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker$1.run(VerifyProcessTracker.java:270)
        at com.liferay.portal.output.stream.container.OutputStreamContainerFactoryTracker.runWithSwappedLog(OutputStreamContainerFactoryTracker.java:100)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker.executeVerifyProcesses(VerifyProcessTracker.java:265)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker.execute(VerifyProcessTracker.java:73)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker$VerifyServiceTrackerMapListener.keyEmitted(VerifyProcessTracker.java:374)
        at com.liferay.portal.verify.extender.internal.VerifyProcessTracker$VerifyServiceTrackerMapListener.keyEmitted(VerifyProcessTracker.java:363)
        at com.liferay.osgi.service.tracker.collections.internal.map.ServiceTrackerMapImpl$DefaultEmitter.emit(ServiceTrackerMapImpl.java:222)
        at com.liferay.osgi.service.tracker.collections.map.PropertyServiceReferenceMapper.map(PropertyServiceReferenceMapper.java:43)
        

Liferay Portal 6.2 SP6以降にアップグレードされるお客様へ

重複した名前が存在する場合、この次のエラーがログに表示され、アップグレード処理が停止します。

WARN [VerifyDynamicDataMapping:XXX] Structure with class name ID XXXXX and structure
key = XXXXX contains more than one element that is identified by the same name either within itself or within
any of its parent structures. The duplicate element names are: XXX, XXX
ERROR [DBUpgrader:XXX] Unable to execute verify process:
com.liferay.portal.verify.VerifyException: com.liferay.portal.verify.VerifyException: Duplicate element name found in structures
com.liferay.portal.verify.VerifyException: com.liferay.portal.verify.VerifyException: com.liferay.portal.verify.VerifyException:
Duplicate element name found in structures
Stopping the server due to unexpected startup errors

Liferay DXP 7.0、7.1へアップグレードされるお客様へ

19:29:35,298 ERROR [main][VerifyProcessTrackerOSGiCommands:221] com.liferay.portal.verify.VerifyException: com.liferay.dynamic.data.mapping.validator.DDMFormValidationException$MustNotDuplicateFieldName: The field name page cannot be defined more than once
com.liferay.portal.verify.VerifyException: com.liferay.dynamic.data.mapping.validator.DDMFormValidationException$MustNotDuplicateFieldName: The field name page cannot be defined more than once

解像度

Liferay DXPへのアップグレードのためのチェックリスト を確認する際、ユーザーは重複する構造名が存在するかどうかを判断し、 アップグレードスクリプトを実行する前に、それらの名前をすべて変更する必要があります。 先ほどの例で考えると、2つのフィールドの名前を、 母親の年齢父親の年齢のように、それぞれ固有の名前に変更することが最適な解決策となります。

  • 母親の名前(テキスト):
    • 母年齢 (テキスト):
  • 父親の名前(テキスト):
    • 父年齢 (テキスト):

Liferay プラットフォームでは、 コントロールパネル > サーバー管理 タブで実行できる Groovy スクリプトを提供しています。 このスクリプトは、修正が必要な重複した構造要素名を特定し、自動的に変更を処理するのに役立ちます。 レガシーなLiferay Portal 6.1に特化しています。

ユーザーは、このスクリプトを実行する前に、自分の条件を反映するように設定する必要があります。.

必要な変更がすべて完了したら、スクリプトを再度実行し、重複する名前がないことを確認します。

DDMを利用したWebコンテンツやその他の資産を用意するため:

  1. データベースとドキュメントライブラリのバックアップを作成します。
  2. コントロールパネル > サーバー管理 > スクリプトに移動します。
  3. 言語としてドロップダウンからGroovyを選択し、テキストエリアにスクリプトの内容を配置します。
  4. スクリプトを一度実行すると、影響を受ける構造、テンプレート、ウェブコンテンツを特定し、自動的に処理することができます。
  5. 影響を受けるテンプレートを分析し、構造体内の要素への参照があるかどうかを判断する。
  6. 変更内容を確認後、スクリプトを修正し、変数 _safeModefalse に設定する(大文字・小文字を区別する)。
  7. 2回目のスクリプトを実行する。
  8. スクリプトが実行されたら、影響を受けるテンプレートを手動で修正します(ステップ5で決定した、必要な場合のみ)。
  9. Webコンテンツが利用可能で、正しく表示されることを確認する。
  10. 追加のポータル検証の実行に進みます。

追加情報

スクリプト の使用には、 英語(米国) のローカライズが必要です。 ポータルが他のローカライゼーションである場合は、以下を実行してください:

  • ポータルのローカライズを 英語(米国)に設定します。
  • groovyスクリプトを実行する。
  • ローカライズを元に戻す。

スクリプトには、その他の設定変数が含まれています:

  • _allLog: trueに設定すると、スクリプトは処理中に追加のログ情報を印刷します。 デフォルトでは、falseに設定されています。
  • DUPLICATE_FIELD_SUFFIX: 重複するフィールド名が発生するたびに、その末尾に追加される文字列を指定します。 デフォルトでは、 Revに設定されています。

スクリプトが実行されたら(数分かかることもあります)、サーバーのログファイルから NormalizeDuplicateFields のトレースを確認し、結果を確認してください。 ログが最後にこのように表示される場合:

INFO  [NormalizeDuplicateFields:?] *** RESULTS ***
INFO  [NormalizeDuplicateFields:?] *** There are no structures with duplicate fields. You can proceed with the upgrade ***
これは、スクリプトがフィールド名が重複する構造体を検出しなかったことを意味します。 アップグレードは通常通り進めることができます。

フィールド名が重複している構造を検出した場合、スクリプトは次のような表示をします:

INFO  [NormalizeDuplicateFields] *** RESULTS ***
INFO  [NormalizeDuplicateFields] *** 12 structures with duplicate fields ***
INFO  [NormalizeDuplicateFields] *** 40 templates to modify manually ***
INFO  [NormalizeDuplicateFields] *** 5695 web contents automatically processed ***
INFO  [NormalizeDuplicateFields] *** 79 web contents can not be processed since they were out of sync prior to execute this script ***
INFO  [NormalizeDuplicateFields] *** 3 DDM Structures with duplicate fields automatically processed ***
INFO  [NormalizeDuplicateFields] Finishing NormalizeDuplicateFields process

このような場合は、フィールド名が重複している別のオブジェクトの修正に進みます。

スクリプトは対象外です:

  1. このスクリプトを実行する前に、構造的にずれていたウェブコンテンツを修正する。
  2. ウェブコンテンツテンプレートの修正。 テンプレートコンテンツはあらかじめ定義されたパターンに従っていないため、手動で実行する必要があります。 この作業を支援するために、ログ内で テンプレートID という文字列を検索して、修正が必要なテンプレートを特定してください。

例えば、スクリプトは、更新された構造体とそれに関連するテンプレートIDを出力する:

INFO  [NormalizeDuplicateFields] Checking Structure with ID 2274237 and Structure ID 2274236 and name Companies from group ID 2270225
INFO  [NormalizeDuplicateFields] Field name will be replaced by nameRev1
INFO  [NormalizeDuplicateFields] Field content will be replaced by contentRev1
INFO  [NormalizeDuplicateFields] This structure contains duplicate field names
INFO  [NormalizeDuplicateFields] The following associated templates have to be manually modified:
INFO  [NormalizeDuplicateFields] - Template ID 2274340 from Group ID 2270225
INFO  [NormalizeDuplicateFields] - Template ID 2274400 from Group ID 2270225

この出力を読むと、影響を受ける構造体には、 namecontentという2つの重複したフィールドが含まれていたことになります。 このスクリプトは、2番目に出現する namecontent を、それぞれ nameRev1contentRev1 に置き換えて、重複するフィールド名を修正します。

また、このスクリプトは、新しく変更された構造を利用したテンプレートを特定します。 この例では、グループID 2270225のテンプレートID 2774340と2274400が、構造体ID 2274237を使用しています。

この時点で、該当するテンプレートを確認し、該当するフィールド名 name; および content がテンプレートコード内で使用されているかどうかを確認してください。 これらのフィールド名をテンプレートコード内で使用していた場合、新たに変更された要素名 nameRev1 および contentRev1 を正しく参照し、構造内の正しい要素を対象とするよう、テンプレートコードを更新してください。 要するに、更新されたフィールドの新しい名前を考慮して、テンプレートを修正する必要があるのです。

また、テンプレートコード内で elementname キーワードを使用していない場合は、テンプレートの修正が必要ない可能性が高いことをご留意ください。

ポータルのバージョンに応じて、さまざまなスクリプトが用意されています:

Liferay Portal 6.2 EE へのアップグレードもご参照ください。

詳細については、 ヘルプセンターチケットを作成し、Liferay Subscription Services にお問い合わせください。

did-this-article-resolve-your-issue

legacy-knowledge-base