2012-01-12 5 views
0

JournalArticleのアセットを変更しようとしています(記事のレイアウトの親に応じてカテゴリを設定する必要があります)。私はJournalArticleのModelListenerを実装することができました。メソッドonAfterUpdate()私はJournalArticleLocalServiceUtil.updateAsset()を持っています。Liferay。 ModelListenerからJournalArticleを変更する

ログには問題ありません。私はパラメータでカテゴリIDが必要でしたが、次回に記事エディタを開くと、記事のカテゴリリストに表示されません。

モデルの変更を何とかModelListenerから保存することは可能ですか、それとも監視するだけで、このリスナーからモデルを変更できませんか?

コード(縮小版):Liferayの-hook.xmlで

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 
} 

私は私の知る限り、あなたのコードは、罰金

<?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

コードを投稿することはできますか? –

+0

コードが投稿されました – SquAreRoot

答えて

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を使用してモデルを更新する際に問題が発生する可能性があります。

+0

返信いただきありがとうございます、私はJournalArticleLocalServiceをフックし、それは私のために正常に動作します。なぜあなたはLocalServiceだけでなく、ServiceおよびLocalServiceクラスに対してもそれを持たなければならない理由を説明できますか? – SquAreRoot

+0

あなたはそうです、私は、コールが "リモートサービス"と "ローカルサービス"の両方に行くことができると考えていました。しかし、実際には、リモートサービスはローカルサービスを99%の時間で呼び出すでしょう。それは 'JournalArticle'の場合です。したがって、 '* LocalService'をフックするだけで十分です。 –

+0

@RP。私はこの質問に私を助けることができます...私はこれについての解決策を得ることができません.http://stackoverflow.com/questions/9747253/adding-custom-methods-in-hook-environment/9753001#comment12407650_9753001 –

関連する問題