我是 Liferay 的新手,正在从事网络内容文章(期刊文章)的模型作家工作。创建后保留标题和内容很重要。我为此编写了一个简单的脚本。然而,输出的标题为空,内容为零。
文章对象本身不包含标题或内容的键。不幸的是,我不知道该怎么办,希望有人已经有这方面的经验。
package webcontenthandler;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.service.JournalArticleLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.BaseModelListener;
import com.liferay.portal.kernel.model.ModelListener;
import org.osgi.service.component.annotations.Component;
import java.util.List;
@Component(
immediate = true,
service = ModelListener.class
)
public class WebContentHandler extends BaseModelListener<JournalArticle> {
@Override
public void onAfterCreate(JournalArticle article) {
try {
JournalArticle myarticle = JournalArticleLocalServiceUtil.getArticle(article.getGroupId(), article.getArticleId(), article.getVersion());
System.out.println("article: " + myarticle);
System.out.println("article content: " + myarticle.getContent());
System.out.println("article title: " + myarticle.getTitle());
System.out.println("article title: " + myarticle.getTitleCurrentValue());
} catch (PortalException e) {
throw new RuntimeException(e);
}
}
@Override
public Class<JournalArticle> getModelClass() {
return JournalArticle.class;
}
}
我已经很长时间没有编写 ModelListeners 了,但是我发现有几个问题需要调查。有些候选人寻找这个问题的根本原因,有些只是风格:
#1,您正在实现一个 OSGi 组件,这意味着您不应该使用
JournalArticleLocalServiceUtil
,而应该实现一个成员 @Reference JournalArticleLocalService jals;
。
#2:该方法的签名是
public void onAfterCreate(JournalArticle article)
,您要做的第一件事就是从数据库中检索文章。根据您的描述,我假设事务尚未提交 - 例如数据库中尚未提供该文章。但无论如何,从参数到这个方法,你都手头有它——为什么还要从数据库中检索它呢?
#3:如果您更愿意实现 ServiceWrapper 而不是 ModelListener,那么它通常更接近业务层
第 1 项将通过实施第 2 项和/或第 3 项而被推翻(例如不必要),但在其他情况下值得记住该技术。