テンプレート処理中にエラーが発生しました。
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@2ad66ae2"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: navigationJSONObject = jsonFactoryUti...  [in template "17855804202317#32484267#LEARN-ARTICLE-NAV" at line 4, column 9]
----
1<#assign 
2	groupFriendlyURL = themeDisplay.getScopeGroup().getFriendlyURL() 
3	groupPathFriendlyURLPublic = themeDisplay.getPathFriendlyURLPublic() + groupFriendlyURL 
4	navigationJSONObject = jsonFactoryUtil.createJSONObject(navigation.getData()) 
5	navigationMenuItems = 
6
7			"Analytics Cloud": { 
8				"image": "/documents/d${groupFriendlyURL}/analytics_c-svg", 
9				"title": "Analytics Cloud", 
10				"url": "analytics-cloud" 
11			}, 
12			"Commerce": { 
13				"image": "/documents/d${groupFriendlyURL}/commerce_product-svg", 
14				"title": "Commerce", 
15				"url": "commerce" 
16			}, 
17			"DXP": { 
18				"image": "/documents/d${groupFriendlyURL}/dxp_p-svg", 
19				"title": "DXP / Portal", 
20				"url": "dxp" 
21			}, 
22			"Liferay Cloud": { 
23				"image": "/documents/d${groupFriendlyURL}/dxp_c-svg", 
24				"title": "Liferay Cloud", 
25				"url": "liferay-cloud" 
26			}, 
27			"Reference": { 
28				"image": "/documents/d${groupFriendlyURL}/reference-svg", 
29				"title": "Reference", 
30				"url": "reference" 
31
32
33 
34	breadcrumbJSONArray = navigationJSONObject.getJSONArray("breadcrumb") 
35	childrenJSONArray = navigationJSONObject.getJSONArray("children") 
36	parentJSONObject = navigationJSONObject.getJSONObject("parent") 
37	productJSONObject = breadcrumbJSONArray.getJSONObject(breadcrumbJSONArray.length()-1)!navigationJSONObject.getJSONObject("self") 
38	siblingsJSONArray = navigationJSONObject.getJSONArray("siblings") 
39/> 
40 
41<div class="learn-article-nav"> 
42	<#if productJSONObject?has_content && productJSONObject.getString("title")?has_content && navigationMenuItems[productJSONObject.getString("title")]?has_content && navigationMenuItems[productJSONObject.getString("title")].title?has_content> 
43		<div 
44			class="dropdown learn-article-nav-root learn-dropdown" 
45
46			<div class="learn-article-nav-item"> 
47				<div class="d-flex"> 
48					<div class="learn-article-nav-image"> 
49						<img 
50							class="lexicon-icon lexicon-icon-caret-bottom product-icon" 
51							role="presentation" 
52							src='${navigationMenuItems[productJSONObject.getString("title")].image}' 
53							viewBox="0 0 512 512" 
54						/> 
55					</div> 
56 
57					<span class="learn-article-nav-text">${navigationMenuItems[productJSONObject.getString("title")].title}</span> 
58				</div> 
59 
60				<div id="dropdown-icon"> 
61					<svg 
62						class="lexicon-icon lexicon-icon-caret-bottom" 
63						role="presentation" 
64						viewBox="0 0 512 512" 
65
66						<use xlink:href="/o/admin-theme/images/clay/icons.svg#caret-bottom"></use> 
67					</svg> 
68				</div> 
69			</div> 
70 
71			<ul class="dropdown-menu learn-dropdown-menu"> 
72				<#list navigationMenuItems as key, value> 
73					<li> 
74						<a 
75							class="dropdown-item learn-article-nav-item" 
76							href="/w/${navigationMenuItems[key].url}/index" 
77							tabindex="4" 
78
79							<span class="d-flex"> 
80								<span class="learn-article-nav-image"> 
81									<img 
82										class="lexicon-icon lexicon-icon-caret-bottom product-icon mt-0 mr-2" 
83										role="presentation" 
84										src="${value.image}"height: 25px; margin-left: 5px; max-width: none; width: 25px; 
85										viewBox="0 0 512 512" 
86									/> 
87								</span> 
88								<span class="learn-article-nav-text">${value.title}</span> 
89							</span> 
90 
91							<#if navigationMenuItems[productJSONObject.getString("title")].url == value.url> 
92								<span> 
93									<@clay["icon"] symbol="check" /> 
94								</span> 
95							</#if> 
96						</a> 
97					</li> 
98				</#list> 
99			</ul> 
100		</div> 
101	</#if> 
102 
103	<div class="learn-article-nav-content"> 
104		<#if parentJSONObject?has_content && parentJSONObject.getString("url")?has_content> 
105			<div class="learn-article-nav-item learn-article-nav-parent liferay-nav-item p-2"> 
106				<div class="mr-2"> 
107					<a 
108						href='${parentJSONObject.getString("url")}' 
109
110						<svg 
111							class="lexicon-icon lexicon-icon-angle-left" 
112							role="presentation" 
113							viewBox="0 0 512 512" 
114
115							<use xlink:href="/o/admin-theme/images/clay/icons.svg#angle-left"></use> 
116						</svg> 
117					</a> 
118				</div> 
119 
120				<span>${parentJSONObject.getString("title")}</span> 
121			</div> 
122		</#if> 
123 
124		<#if childrenJSONArray.length() gt 0> 
125			<ul class="m-0 p-2"> 
126				<#list 0..childrenJSONArray.length()-1 as i> 
127					<li class="learn-article-nav-item"> 
128						<a 
129							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == childrenJSONArray.getJSONObject(i).url)?then("selected", "")}' 
130							href="${childrenJSONArray.getJSONObject(i).url}" 
131
132							<span>${childrenJSONArray.getJSONObject(i).getString("title")}</span> 
133						</a> 
134					</li> 
135				</#list> 
136			</ul> 
137		<#elseif siblingsJSONArray.length() gt 0> 
138			<ul class="m-0 p-2"> 
139				<#list 0..siblingsJSONArray.length()-1 as i> 
140					<li class="learn-article-nav-item"> 
141						<a 
142							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == siblingsJSONArray.getJSONObject(i).url)?then("selected", "")}' 
143							href="${siblingsJSONArray.getJSONObject(i).url}" 
144
145							<span>${siblingsJSONArray.getJSONObject(i).getString("title")}</span> 
146						</a> 
147					</li> 
148				</#list> 
149			</ul> 
150		</#if> 
151	</div> 
152</div> 

バックアップページからのデータの復元

カイルは、サイトのデータに影響を与える可能性のある変更のテストを始めたいと考えている。

ここでは、テスト中に失われたデータを復元するために、手動バックアップを復元します。

本番環境からの手動バックアップの作成

データの損失や不安定性を引き起こす可能性のある変更をテストする前に、Liferayインスタンスがバックアップされていることを常に確認する必要があります。

テストを開始する前に、手動でバックアップを作成してください。

  1. Liferay Cloud コンソールで本番環境に移動します。

  2. 画面左側の Backups をクリックします。

  3. Backup Now をクリックして手動バックアップを作成します。

この練習には手動バックアップを使用する。

バックアップサービスが利用できず、バックアップが完了するまでページ上のボタンが無効になります。

バックアップをUATにリストアする

本番環境からのバックアップが終了したら、UAT環境にリストアする。

  1. リストの一番上にある手動バックアップの横にある アクション( Actions icon ) をクリックし、 リストア先… をクリックします。

    必要なバックアップを選択し、Restore to...をクリックします。

  2. Select Environment]ドロップダウンメニューから、UAT環境を選択します。

  3. チェックボックスをクリックして、バックアップリストアの影響を確認します。

    バックアップ・リストアの影響を確認すると、「環境にリストア」ボタンが表示されます。

  4. Restore to Environment をクリックする。

バックアップがリストアされる間、UAT環境のサービスは一時的に利用できなくなります。

災害をシミュレートする

UATのLiferayインスタンスからデフォルトのホームページを削除して災害をシミュレートします。

  1. UAT環境に移動します。

  2. ページ上部の Visit Site をクリックし、UAT Liferay インスタンスにアクセスします。 以前にログインしてセッションの有効期限が切れている場合は、 、プロジェクトの認証情報( )を使用して認証します。

  3. 管理者アカウントの概要 としてログインする。

  4. 画面左側のナビゲーション・メニューで、 Site BuilderPages をクリックします。

  5. ホームページの横にある「アクション」メニュー( Actions icon )を開き、 削除 をクリックします。

    ページメニューからホームページを削除する。

    削除を確認するポップアップダイアログが表示されます。

  6. ページメニューからホームページを削除する。

ホームページは削除され、削除を取り消すことはできない。 ホームページがなくなったため、画面右上の「Home」ボタンも消える。

バックアップを復元する

カイルはページを削除した後、削除すべきではなかったことに気づく。 カイルがLiferayインスタンスにアクセスする前に取ったバックアップを復元することで、UATのデータを回復できるようにします。

  1. Liferay Cloud コンソールで本番環境に移動します。

  2. バックアップ をクリックする。

  3. 手動バックアップの横にある「アクション」メニュー( Actions icon )をクリックし、「Restore to…」をクリックします。

  4. Select environment ドロップダウンメニューから、UAT環境を選択します。

  5. 表示されるチェックボックスをクリックして、バックアップのリストアの影響を確認します。

  6. Restore to Environment をクリックする。

バックアップを復元している間、UAT Liferayサービスが一時的に利用できません。 終了後、再度サイトにアクセスすると、ホームページが復元されていることを確認できる。

Next: Liferay Cloud コンソールのシェル を使って直接 Liferay データベースに問い合わせます。

関連コンセプト