You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:21:12