問題
- 既存の estructure に新しいフィールドを追加すると、テンプレートでこのフィールドをレンダリングしようとして更新しない限り、記事で
InvalidReferenceException
が生成されます。freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134)
at freemarker.core.UnexpectedTypeException.newDescriptionBuilder(UnexpectedTypeException.java:85)
at freemarker.core.UnexpectedTypeException.<init>(UnexpectedTypeException.java:48)
at freemarker.core.NonHashException.<init>(NonHashException.java:49)
at freemarker.core.Dot._eval(Dot.java:48)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.MethodCall._eval(MethodCall.java:55)
at freemarker.core.Expression.eval(Expression.java:101)
at freemarker.core.Assignment.accept(Assignment.java:134)
at freemarker.core.Environment.visit(Environment.java:331)
at freemarker.core.Environment.visit(Environment.java:337)
at freemarker.core.Environment.visit(Environment.java:337)
at freemarker.core.Environment.process(Environment.java:310)
at freemarker.template.Template.process(Template.java:383)
at com.liferay.portal.template.freemarker.internal.FreeMarkerTemplate.processTemplate(FreeMarkerTemplate.java:154)
at com.liferay.portal.template.BaseTemplate.processTemplate(BaseTemplate.java:163)
at com.liferay.journal.internal.transformer.JournalTransformer.doTransform(JournalTransformer.java:367)
at com.liferay.journal.internal.transformer.JournalTransformer.transform(JournalTransformer.java:103)
環境
- Liferay DXP 7.0
- Liferay DXP 7.1
- Liferay DXP 7.2
- Liferay DXP 7.3
- Liferay DXP 7.4
解像度
- ここでの問題は、構造体にはフィールドがありますが、記事のコンテンツにはありません。そのため、構造体をレンダリングしようとすると、フィールドが null になり、
getData()
メソッドが使用されると null ポインター例外がスローされます。 - この NPE は、テンプレート エンジンによって
InvalidReferenceException
として表示されます。 - 解決策は、この種のフィールドのテンプレートに null チェックを追加して、フィールドが
null
の場合にレンダリングされないようにすることです。 - のようにレンダリングする代わりに
<#assign field = field.getData()>
あなたが使用できる<#if field?? && field.getData()?? > <#assign field = field.getData()>
<#else>
<#assign field = "">
</#if>