我尝试修改JournalArticle资产(需要根据文章布局父项设置类别)。我设法为JournalArticle实现了ModelListener。在方法 onAfterUpdate()中,我有 JournalArticleLocalServiceUtil.updateAsset()。
在日志中一切都很好。我在参数中需要类别ID,但在下次打开文章编辑器时,它不会出现在文章的类别列表中。
是否可以以某种方式从ModelListener中保存模型中的更改,或者仅用于监视,我无法从此侦听器修改模型?
代码(简化版):
package mypackage;
// imports
public class JournalArticleListener implements ModelListener {
private void updateCategories(JournalArticle article) {
try {
long[] categoriesArray = getCategories(article); // this works fine
String[] tagsArray = getTags(article); // this also works fine
JournalArticleLocalServiceUtil.updateAsset(article.getUserId(), article, categoriesArray, tagsArray);
} catch (PortalException ex) {
// logger
} catch (SystemException ex) {
// logger
}
}
@Override
public void onBeforeUpdate(Object model) throws ModelListenerException {
updateCategories((JournalArticle)model);
}
// other abstract method implemented without any code inside
}
在liferay-hook.xml中我有
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.0.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_0_0.dtd">
<hook>
<model-listener>
<model-listener-class>mypackage.JournalArticleListener</model-listener-class>
<model-name>com.liferay.portlet.journal.model.JournalArticle</model-name>
</model-listener>
</hook>
答案 0 :(得分:1)
据我所知,你的代码看起来不错,但我可以想到你可以尝试的一些事情。如果这对您有用,请告诉我。
首先。检查文章是否获得批准。如果文章处于草案状态,则数据将被反映,直到获得批准为止。
二。而不是使用模型侦听器尝试使用钩子覆盖服务。
<service>
<service-type>com.liferay.portlet.journal.service.JournalArticleService</service-type>
<service-impl>com.example.hook.service.impl.JournalArticleServiceImpl</service-impl>
</service>
您需要实现其服务包装器JournalArticleServiceWrapper
。
覆盖更新方法(可能有几个)并调用其父方法然后执行您的逻辑。像这样:
public JournalArticle someUpdateArticleMethod(Many params) SomeExceptions {
JournalArticle journalArticle = super.someUpdateArticleMethod(params);
// my code here.
}
模型监听器的操作肯定更容易。虽然我不确定这是否是实际问题,但是使用onAfterUpdate更新模型可能存在问题,因为可以创建无限循环。