Liferay JournalArticles ModelListener无法获取标题与内容求助
解决Liferay JournalArticle ModelListener获取标题和内容为空/异常的问题
问题原因
- 多语言本地化字段未指定Locale:JournalArticle的标题是多语言存储的,无参
getTitle()方法可能无法匹配正确的语言环境,导致返回空值。 - getContent()方法的误解:
getContent()返回的是Web Content的XML结构(包含DDM字段定义和内容),直接打印可能显示异常值;静态工具类的使用也可能导致数据加载不完整。 - 静态Util类的局限性:使用
JournalArticleLocalServiceUtil而非OSGI依赖注入,可能无法获取到最新的持久化数据。
修正后的代码
package webcontenthandler; import com.liferay.journal.model.JournalArticle; import com.liferay.journal.service.JournalArticleLocalService; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.BaseModelListener; import com.liferay.portal.kernel.model.ModelListener; import com.liferay.portal.kernel.util.LocaleUtil; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; @Component( immediate = true, service = ModelListener.class ) public class WebContentHandler extends BaseModelListener<JournalArticle> { @Reference private JournalArticleLocalService _journalArticleLocalService; @Override public void onAfterCreate(JournalArticle article) { try { // 获取包含完整本地化数据的最新文章实例 JournalArticle latestArticle = _journalArticleLocalService.getLatestArticle( article.getGroupId(), article.getArticleId()); // 指定Locale获取标题(可替换为业务需求的特定Locale) String title = latestArticle.getTitle(LocaleUtil.getDefault()); // 获取完整的内容XML结构 String contentXml = latestArticle.getContent(); System.out.println("文章标题: " + title); System.out.println("文章内容XML: " + contentXml); // 若需提取实际内容(以默认Web Content结构为例),可通过DDM API解析XML中对应字段 } catch (PortalException e) { throw new RuntimeException(e); } } @Override public Class<JournalArticle> getModelClass() { return JournalArticle.class; } }
关键修改点
- 依赖注入替代静态Util:用
@Reference注入JournalArticleLocalService,避免静态工具类的加载问题。 - 获取最新文章实例:调用
getLatestArticle()确保拿到包含完整本地化数据的对象。 - 指定Locale获取标题:通过
getTitle(Locale)明确语言环境,获取正确的本地化标题。 - 正确处理内容XML:
getContent()返回的是XML结构,若需提取实际内容,需使用Liferay的DDM API解析对应字段节点。
内容的提问来源于stack exchange,提问作者alpa
相关产品推荐
相关产品推荐

