Liferay的。从ModelListener修改JournalArticle

时间:2012-01-12 11:32:03

标签: liferay

我尝试修改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>

1 个答案:

答案 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更新模型可能存在问题,因为可以创建无限循环。