Liferay 7中JSP渲染资产条目内容及JournalArticle查询报错问题
你完全没错——Liferay里的「基础Web内容」确实对应JournalArticle实体,这个假设是正确的。你遇到的报错问题,核心原因是对assetEntry.getClassPK()的用途理解偏差,以及JournalArticleLocalService方法参数的误用。
问题根源解析
当你创建Web内容时,对应的AssetEntry中,classPK存储的是Web内容的**articleId**(也就是你创建内容时自定义的文章ID,若为数字形式会被转成long类型存储),而不是JournalArticle表的自增主键id。JournalArticleLocalService.getArticle(long id)这个方法是根据自增主键id来查询的,所以你用assetEntry.getClassPK()(即articleId的数值)去查,自然找不到对应的记录,就会抛出No JournalArticle exists with the primary key XXX的错误。
正确获取Web内容的解决方案
1. 先验证AssetEntry类型
确保当前assetEntry确实对应Web内容:
import com.liferay.journal.model.JournalArticle; // 检查assetEntry是否属于JournalArticle类型 if (JournalArticle.class.getName().equals(assetEntry.getClassName())) { // 后续处理Web内容的逻辑 }
2. 通过groupId和articleId获取文章
利用assetEntry的groupId(站点ID)和classPK(作为articleId)来获取最新版本的Web内容:
import com.liferay.journal.service.JournalArticleLocalServiceUtil; long groupId = assetEntry.getGroupId(); String articleId = String.valueOf(assetEntry.getClassPK()); // 获取最新版本的JournalArticle JournalArticle journalArticle = JournalArticleLocalServiceUtil.getLatestArticle(groupId, articleId);
如果需要获取特定版本的文章,可以使用:
// 指定版本号,例如1.0 double version = 1.0; JournalArticle journalArticle = JournalArticleLocalServiceUtil.getArticle(groupId, articleId, version);
3. 自定义内容渲染
拿到journalArticle后,你就可以完全控制内容的显示了,比如:
// 获取文章标题(适配当前语言环境) String title = journalArticle.getTitle(Locale.getDefault()); // 获取原始XML格式内容 String rawContent = journalArticle.getContent(); // 获取经过模板解析后的HTML内容 String displayContent = com.liferay.journal.util.JournalArticleDisplayUtil.getDisplayContent( journalArticle, null, null, themeDisplay, 0, Locale.getDefault() );
针对Liferay 7.x+的优化提示
如果你使用的是Liferay 7.x及以上版本,官方推荐用依赖注入替代静态Util类,避免静态调用的弊端:
import com.liferay.journal.service.JournalArticleLocalService; import org.osgi.service.component.annotations.Reference; // 注入JournalArticle服务 @Reference private JournalArticleLocalService _journalArticleLocalService; // 使用服务获取文章 JournalArticle journalArticle = _journalArticleLocalService.getLatestArticle(groupId, articleId);
内容的提问来源于stack exchange,提问作者halpdoge
相关产品推荐
相关产品推荐

