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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:57:02