使用Liferay创建的模板无法渲染,报FreeMarker语法错误
问题排查与修复
错误原因
错误提示明确指向第32行的语法问题:在FreeMarker表达式模式(此处为<#assign>的赋值表达式内部)使用了${...}插值语法。${}仅允许在静态文本输出场景使用(比如HTML标签之间、字符串字面量内部),在表达式逻辑中需直接使用变量或方法调用,不能嵌套${}。
同时,该行逻辑本身存在问题:curEntry.${entry.getContent()}${entry.getCreationDateString()}${entry.getCreatorUserName()}()试图将三个方法的返回值拼接成方法名调用curEntry的对应方法,既不符合语法规则,也不符合AssetEntry对象的API逻辑。
修复方案
观察上下文代码,你已经通过curEntry.getAssetRenderer()获取了AssetRenderer实例,直接复用该调用即可,无需错误的字符串拼接。
修正关键代码行
将错误的赋值语句:
<#assign assetRenderer = curEntry.${entry.getContent()}${entry.getCreationDateString()}${entry.getCreatorUserName()}() journalArticle = assetRenderer.getAssetObject()/>
替换为:
<#assign assetRenderer = curEntry.getAssetRenderer() journalArticle = assetRenderer.getAssetObject()/>
完整修正后的模板代码
${request}<#if searchResultsPortletDisplayContext.getDocuments()?has_content> <div class="page-general__products"> <div class="container"> <div class="text"> <h1>¿Lorem Ipsum?</h1> <p>Lorem Ipsum</p> </div> <div class="row"> <#list searchResultsPortletDisplayContext.getDocuments() as entry> <#assign jls = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryService") entryClassPK = entry.getField("entryClassPK").getValue()?number entryClassName = entry.getField("entryClassName").getValue() journalArticle = entry.getField("articleId_String_sortable").getValue() curEntry = jls.getEntry(entryClassName,entryClassPK) /> <#assign fields = curEntry.getAssetRenderer().getDDMFormValuesReader().getDDMFormValues().getDDMFormFieldValues() esGrande = fields[0].getValue().getString(locale) /> <#if esGrande=="true"> <div class="col-md-4 col-lg-3"> <#else> <div class="col-md-8 col-lg-6"> </#if> <#assign assetRenderer = curEntry.getAssetRenderer() journalArticle = assetRenderer.getAssetObject()/> <@liferay_journal["journal-article"] articleId=journalArticle.getArticleId() ddmTemplateKey="76229" groupId=journalArticle.getGroupId()/> </div> </#list> </div> </div> </div> </#if>
额外说明
- 若你原本意图是调用
entry对象的getContent()、getCreationDateString()、getCreatorUserName()方法并输出,应将这些调用放在静态文本区域(比如HTML标签内),而非作为curEntry的方法名。 - 注意变量
journalArticle的重复赋值:第一次赋值是字符串类型的articleId,第二次是JournalArticle对象,需确保后续使用时类型匹配。
内容的提问来源于stack exchange,提问作者Untalrobert
相关产品推荐
相关产品推荐

