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); }
关键说明
- 获取模板实例:必须先通过
DDMTemplateLocalServiceUtil拿到对应的DDMTemplate对象,这是渲染的核心依赖。 - 构建渲染上下文:模板里需要用到的文章数据(比如字段、标题等)都要放到上下文Map里,这样模板才能正确读取这些数据进行渲染。
- 调用渲染API:
DDMTemplateRendererUtil.render()方法会根据模板和上下文生成最终的渲染内容,这一步才是真正让模板生效的关键。
内容的提问来源于stack exchange,提问作者Alessandra
相关产品推荐
相关产品推荐

