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

Liferay 7 GA4中Freemarker模板仅搜索访问触发异常问题咨询

解决Liferay 7 GA4 + Freemarker搜索访问触发错误模板的问题

你遇到的这个场景我之前也碰到过——同一FTL模板的页面,从搜索链接进就触发错误模板,其他入口却正常,核心原因是搜索上下文和常规页面访问的上下文变量、参数传递逻辑不一样,导致模板里的代码在搜索场景下触发了异常。

先看你给出的模板开头代码,这里第一个风险点就是直接取reserved-article-id的.data属性:

<#assign journalArticleId = .vars['reserved-article-id'].data> 
<#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.journal.service.JournalArticleResourceLocalServiceUtil"]> 
<#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil"]>

当从搜索结果点击访问时,Liferay的搜索Portlet传递的上下文里,reserved-article-id这个变量可能根本没被注入,或者取值为null,这时调用.data就会抛出空指针异常,直接触发错误模板。

下面给你几个针对性的解决方案:

  • 先做变量存在性校验,避免空指针
    修改模板开头的赋值逻辑,先判断变量是否存在再取值,同时兼容搜索场景的参数传递:

    <#-- 先检查常规场景的reserved-article-id -->
    <#if .vars?contains_key('reserved-article-id') && .vars['reserved-article-id']?has_content>
        <#assign journalArticleId = .vars['reserved-article-id'].data>
    <#else>
        <#-- 搜索场景下尝试从请求参数获取articleId -->
        <#assign journalArticleId = request.getParameter('articleId')!>
        <#if journalArticleId?trim?isEmpty>
            <#-- 兜底处理,避免触发错误模板 -->
            <div class="alert alert-warning">内容暂时无法加载,请稍后重试</div>
            <#return>
        </#if>
    </#if>
    
  • 改用更可靠的方式获取当前文章
    尽量不要依赖reserved-article-id这种上下文敏感的变量,而是通过themeDisplay来获取当前JournalArticle,兼容性更强:

    <#assign currentArticle = themeDisplay.getJournalArticle() />
    <#if currentArticle?has_content>
        <#assign journalArticleId = currentArticle.getArticleId() />
    <#else>
        <#-- 兜底逻辑 -->
        <div>无法获取文章内容</div>
        <#return>
    </#if>
    
  • 检查搜索结果的URL配置
    有时候搜索Portlet生成的结果链接参数和常规页面不一致,比如少传了groupId或者参数名不对。可以进入搜索Portlet的配置页面,检查"结果显示"相关的设置,确保链接传递的参数和常规访问页面一致。

另外给你个调试小技巧,在模板里加个仅管理员可见的调试块,能直观看到不同场景下的变量差异:

<#-- 仅开发/管理员环境启用 -->
<#if themeDisplay.isSignedIn() && themeDisplay.getUser().isAdmin()>
    <div style="border:1px solid #ff4444; padding:10px; margin:10px 0;">
        <strong>Debug Info:</strong><br>
        reserved-article-id 存在吗?${.vars?contains_key('reserved-article-id')}<br>
        reserved-article-id 值:${.vars['reserved-article-id']?default('null')}<br>
        请求参数列表:${request.getParameterMap()}
    </div>
</#if>

内容的提问来源于stack exchange,提问作者Kala Siber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:47