この記事は、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コンテンツやその他の資産を用意するため:
- データベースとドキュメントライブラリのバックアップを作成します。
- コントロールパネル > サーバー管理 > スクリプトに移動します。
- 言語としてドロップダウンからGroovyを選択し、テキストエリアにスクリプトの内容を配置します。
- スクリプトを一度実行すると、影響を受ける構造、テンプレート、ウェブコンテンツを特定し、自動的に処理することができます。
- 影響を受けるテンプレートを分析し、構造体内の要素への参照があるかどうかを判断する。
- 変更内容を確認後、スクリプトを修正し、変数
_safeModeをfalseに設定する(大文字・小文字を区別する)。 - 2回目のスクリプトを実行する。
- スクリプトが実行されたら、影響を受けるテンプレートを手動で修正します(ステップ5で決定した、必要な場合のみ)。
- Webコンテンツが利用可能で、正しく表示されることを確認する。
- 追加のポータル検証の実行に進みます。
追加情報
スクリプト の使用には、 英語(米国) のローカライズが必要です。 ポータルが他のローカライゼーションである場合は、以下を実行してください:
- ポータルのローカライズを 英語(米国)に設定します。
- 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
このような場合は、フィールド名が重複している別のオブジェクトの修正に進みます。
スクリプトは対象外です:
- このスクリプトを実行する前に、構造的にずれていたウェブコンテンツを修正する。
- ウェブコンテンツテンプレートの修正。 テンプレートコンテンツはあらかじめ定義されたパターンに従っていないため、手動で実行する必要があります。 この作業を支援するために、ログ内で
テンプレート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
この出力を読むと、影響を受ける構造体には、 name 、 contentという2つの重複したフィールドが含まれていたことになります。 このスクリプトは、2番目に出現する name と content を、それぞれ nameRev1 と contentRev1 に置き換えて、重複するフィールド名を修正します。
また、このスクリプトは、新しく変更された構造を利用したテンプレートを特定します。 この例では、グループID 2270225のテンプレートID 2774340と2274400が、構造体ID 2274237を使用しています。
この時点で、該当するテンプレートを確認し、該当するフィールド名 name; および content がテンプレートコード内で使用されているかどうかを確認してください。 これらのフィールド名をテンプレートコード内で使用していた場合、新たに変更された要素名 nameRev1 および contentRev1 を正しく参照し、構造内の正しい要素を対象とするよう、テンプレートコードを更新してください。 要するに、更新されたフィールドの新しい名前を考慮して、テンプレートを修正する必要があるのです。
また、テンプレートコード内で elementname キーワードを使用していない場合は、テンプレートの修正が必要ない可能性が高いことをご留意ください。
ポータルのバージョンに応じて、さまざまなスクリプトが用意されています:
- Liferay 6.2.x: NormalizeDuplicateFields-6.2.x.grooy (DDMStructuresをチェックするものです)
- Liferay 6.1.x: NormalizeDuplicateFields-6.1.x.groovy (JournalStructuresとDDMStructuresの両方の修正を含みます)
- Liferay 6.0.x: NormalizeDuplicateFields-6.0.x.groovy
- Liferay 5.x以下の場合: Liferay Portal 6.0.12 にアップグレードし、スクリプトを実行した後、Portal 6.2 にアップグレードしてください。
Liferay Portal 6.2 EE へのアップグレードもご参照ください。
詳細については、 ヘルプセンターチケットを作成し、Liferay Subscription Services にお問い合わせください。