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

Liferay 7 如何通过代码为JournalArticle应用DDMTemplate?

问题分析与解决方案

嘿,我懂你遇到的困扰了——你以为切换DDMTemplateKey后调用getContent()就能拿到新模板渲染的内容,但实际上完全没生效对吧?这是因为getContent()方法并不会自动触发模板重新渲染,它只是返回当前对象里已经存储好的内容,和你设置的模板键没有直接关联。

核心原因

articleDisplay.setDDMTemplateKey()只是修改了对象上的模板标识属性,但Liferay并不会自动根据这个属性重新渲染内容。要得到新模板渲染后的结果,你需要手动调用DDM模板的渲染API,把文章的数据传入模板进行处理。

修正后的代码示例

下面是调整后的代码,通过调用Liferay的模板渲染服务来生成你想要的内容:

String prevDDMTemplate = articleDisplay.getDDMTemplateKey();
try {
    // 根据模板键获取对应的DDMTemplate实例
    DDMTemplate targetTemplate = DDMTemplateLocalServiceUtil.getDDMTemplate(
        PortalUtil.getDefaultCompanyId(),
        JournalArticle.class.getName(),
        MY_SIMPLE_TEMPLATE
    );

    // 准备渲染上下文,把文章相关数据传入模板
    Map<String, Object> renderContext = new HashMap<>();
    renderContext.put("journalArticle", articleDisplay);
    renderContext.put("title", articleDisplay.getTitle());
    // 可以根据模板需要,添加更多文章字段到上下文中

    // 调用模板渲染方法,生成新内容
    String renderedContent = DDMTemplateRendererUtil.render(
        targetTemplate,
        renderContext,
        Locale.getDefault() // 根据你的需求设置对应的语言环境
    );

    // 这里就是用MY_SIMPLE_TEMPLATE渲染后的内容
    System.out.println(renderedContent);
} catch (PortalException e) {
    // 处理模板获取或渲染时的异常
    e.printStackTrace();
} finally {
    // 恢复原模板键
    articleDisplay.setDDMTemplateKey(prevDDMTemplate);
}

关键说明

  1. 获取模板实例:必须先通过DDMTemplateLocalServiceUtil拿到对应的DDMTemplate对象,这是渲染的核心依赖。
  2. 构建渲染上下文:模板里需要用到的文章数据(比如字段、标题等)都要放到上下文Map里,这样模板才能正确读取这些数据进行渲染。
  3. 调用渲染API:DDMTemplateRendererUtil.render()方法会根据模板和上下文生成最终的渲染内容,这一步才是真正让模板生效的关键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:38:53