Liferay. Модифицировать JournalArticle из ModelListener - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь изменить активы JournalArticle (необходимо установить категории в зависимости от родителей макета статьи). Мне удалось реализовать ModelListener для JournalArticle. В методе onAfterUpdate () у меня есть JournalArticleLocalServiceUtil.updateAsset () .

В логах все нормально. Мне нужен идентификатор категории в параметрах, но он не отображается в списке категорий в статье, когда я в следующий раз открываю редактор статьи.

Можно ли каким-либо образом сохранить изменения в модели из 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 Ответ

1 голос
/ 13 января 2012

Насколько я могу судить, ваш код выглядит нормально, но я могу подумать о нескольких вещах, которые вы можете попробовать. Пожалуйста, дайте мне знать, если это сработало для вас.

Во-первых. проверьте, одобрена ли статья. Если статья находится в черновом состоянии, данные не будут отражены, пока не будут утверждены.

Во-вторых. Вместо использования слушателя модели попробуйте переписать сервис с помощью ловушки.

<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 для обновления модели, поскольку может быть создан бесконечный цикл.

...