Liferay 利弗雷。从ModelListener修改日志文章

Liferay 利弗雷。从ModelListener修改日志文章,liferay,Liferay,我试图修改JournalArticle资产(需要根据文章布局设置类别)。我成功地为JournalArticle实现了ModelListener。在更新()后的方法中,我有日志articleLocalServiceUtil.updateAsset() 在日志中,一切都很好。我在参数中需要类别id,但下次打开文章编辑器时,它不会出现在文章的类别列表中 是否可以从ModelListener以某种方式保存模型中的更改,或者仅用于监视,而我无法从该侦听器修改模型 代码(简化版): package-mypa

我试图修改JournalArticle资产(需要根据文章布局设置类别)。我成功地为JournalArticle实现了ModelListener。在更新()后的方法中,我有日志articleLocalServiceUtil.updateAsset()

在日志中,一切都很好。我在参数中需要类别id,但下次打开文章编辑器时,它不会出现在文章的类别列表中

是否可以从ModelListener以某种方式保存模型中的更改,或者仅用于监视,而我无法从该侦听器修改模型

代码(简化版):

package-mypackage;
//进口
公共类JournalArticleListener实现ModelListener{
私有void更新分类(JournalArticle文章){
试一试{
long[]categoriesArray=getCategories(article);//这很好用
String[]tagsArray=getTags(article);//这也很好用
JournalArticleLocalServiceUtil.updateAsset(article.getUserId(),article,categoriesArray,tagsArray);
}捕获(PortalEx){
//记录器
}捕获(SystemException ex){
//记录器
}
}
@凌驾
public void onBeforeUpdate(对象模型)引发ModelListenerException{
更新分类((JournalArticle)模型);
}
//实现的其他抽象方法中没有任何代码
}
在liferay-hook.xml中


mypackage.JournalArticleListener
com.liferay.portlet.journal.model.journalaarticle

据我所知,您的代码看起来不错,但我可以想到一些您可以尝试的东西。请让我知道这是否对你有效

首先。检查物品是否被批准。如果条款处于草案状态,则在获得批准之前,数据不会反映出来

第二。尝试用钩子覆盖服务,而不是使用模型侦听器


com.liferay.portlet.journal.service.JournalArticleService
com.example.hook.service.impl.JournalArticleServiceImpl
您需要实现它的服务包装器,
JournalArticleServiceWrapper

覆盖更新方法(可能有几个)并调用其父方法,然后执行逻辑。像这样:

public JournalArticle someUpdateArticleMethod(许多参数)SomeException{
JournalArticle JournalArticle=super.someUpdateArticleMethod(参数);
//我的代码在这里。
}

由模型监听器来做肯定更容易。虽然我不确定这是否是实际问题,但可能是使用onAfterUpdate更新模型时出现了问题,因为可能会创建无限循环。

您是否可以发布一些代码?谢谢您的回复,我挂接了JournalArticleLocalService,它对我来说很好。你能解释一下为什么我应该在服务和本地服务类中使用它,而不仅仅是在本地服务中使用它吗?你是对的,我认为调用可以同时指向“远程服务”和“本地服务”。但实际上,远程服务99%的时间都会调用本地服务,
journalaarticle
就是这样。所以挂接
*LocalService
就足够了。@RP.你能帮我解决这个问题吗…因为我无法解决这个问题。。