Extending Liferay
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

モデルリスナーの作成

モデルリスナーは、指定されたモデルへの変更を通知する永続メソッドの呼び出しをリッスンします( update または add メソッドなど)。 モデル リスナーが使用するメソッドのほとんどは、DXP の BasePersistenceImpl クラスから呼び出されます。 すぐに使えるエンティティ( JournalArticle または AssetEntry)、または独自のエンティティのモデルリスナーを定義できます。

モデル リスナーを追加するには、 ModelListener インターフェイスを実装します。

実行中のモデルリスナーを調べる

新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132

http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。

次に、次の手順に従って、 JournalArticle モデルのサンプル モデル リスナーをデプロイします。

  1. Acme Model Listenerをダウンロードして解凍します

    curl https://resources.learn.liferay.com/examples/liferay-n4g6.zip -O
    
    unzip liferay-n4g6.zip
    
  2. サンプルをビルドしてデプロイします。

    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    このコマンドは、デプロイされたjarをDockerコンテナ上の /opt/liferay/osgi/modules にコピーするのと同じです。

  3. Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.n4g6.impl_1.0.0
    
  4. 追加されたログメッセージを表示して、サンプルモデルリスナーが追加されたことを確認します。 ブラウザーで http://localhost/8080 を開き、[サイト]メニュー→ [コンテンツ & データ][Webコンテンツ]へ行きます。

    Webコンテンツ管理ページは、Webコンテンツを作成するためのインターフェースです。

    追加 Add ボタンをクリックし、次に 基本的な Web コンテンツ をクリックして新しい記事を追加します。 タイトルとコンテンツを入力してください。次に、[ Publish]をクリックします。 コンソールに警告メッセージが表示されます。

    2020-03-17 23:14:56.301 WARN  [http-nio-8080-exec-5][N4G6ModelListener:23] Added journal article 20478.
    

これで、 ModelListenerを実装する新しいモデルリスナーが正常に構築され、デプロイされました。

ご覧のとおり、モデルリスナーは特定の モデルイベント をリッスンします。 このリスナーの場合、イベントは onAfterCreateです。 コンテンツが作成されると、リスナーがイベントを「聞き取り」、イベントが発生するとアクションが発生します。

ここで、別のイベントをリッスンするように例を変更します。

モデルクラスとイベントを特定する

Liferay DXPのモデルクラスは、 Service Builderによって生成されます。 モデルインターフェイスは、任意のアプリケーションの -api モジュールにあります。 たとえば、Message Boards メッセージのモデルインターフェースを見つけるには、Liferay DXP のソースコード内の modules/apps/message-boards/message-boards-api プロジェクトを調べます。

このルールの例外はコアモデルです。 Userなどのコアクラスのモデルリスナーを作成する場合、そのインターフェースはLiferay DXPのソースコードの portal-kernel フォルダーにあります。

モデル リスナーは、メッセージ ボード メッセージ用です。 メッセージが削除されたときにログにレポートを出力するメッセージをトリガーします。 可能なイベントのリストについては、 BaseModelListenerの Javadoc を参照してください。

モデルリスナーの動作

モデル リスナーは、特定のエンティティに対して ModelListener インターフェイスを実装します。 モデルリスナーには、エンティティが作成、更新、または削除される前または後に実行するコードを含めることができます。 これらのメソッドはすべて、 BasePersistenceImpl クラスから呼び出されます。作成または更新されたエンティティのコードは BasePersistenceImplupdate メソッドから呼び出され、削除されたエンティティのコードは BasePersistenceImplremove メソッドから呼び出されます。

モデルリスナーには、他の種類の関連エンティティが追加または削除される前または後に実行するコードを含めることもできます。 これらのメソッドは、 _addTableMapping メソッド ( TableMapperImpl内) から呼び出されます。

ここで、プロジェクトを変更して、 MBMessage クラスと onBeforeRemove イベントで動作するようにしてみましょう。

モデルを宣言する

  1. テキストエディターまたはIDEで N4G6ModelListener クラスを開きます。

  2. クラス宣言を見つけます。

    @Component(service = ModelListener.class)
    public class N4G6ModelListener extends BaseModelListener<JournalArticle> {
    

    BaseModelListener拡張する場合、リスナーがイベントをリッスンするモデルクラスを定義します(この例では JournalArticle)。

  3. モデルクラスを MBMessageに変更します。

    @Component(service = ModelListener.class)
    public class N4G6ModelListener extends BaseModelListener<MBMessage> {
    

    このモデルリスナーは登録されると、定義されたモデルのイベントをリッスンします。 モデルは、標準のエンティティまたはカスタムエンティティにすることができます。 BaseModelListener クラスを拡張すると、 ModelListenerのメソッドごとにデフォルトの空の実装が提供されるため、コードはクリーンなままで、必要なイベントのみのオーバーライドが含まれます。

イベントを宣言する

次に、必要なイベントの実装をオーバーライドします。

  1. onAfterCreate メソッドを見つけます。

    public void onAfterCreate(JournalArticle journalArticle)
    
  2. メソッドを変更して、onBeforeRemoveをオーバーライドし、MBMessagemodelと呼ばれるパラメーターとして渡します。

    public void onBeforeRemove(MBMessage model)
    

ビジネスロジックを実装する

特定のアクションをトリガーすることは、特定のモデルイベントをリッスンする典型的な理由です。 この例では、物事をシンプルに保ちます。掲示板のメッセージが削除された場合、メッセージの件名をログに報告します。

  1. 新しい onBeforeRemove メソッドで、 if ステートメントを次のステートメントに置き換えます。

    if (_log.isWarnEnabled()) {
        _log.warn("Warning! Message " + model.getSubject() + " was just removed.");
    }
    
  2. MBMessage の新しいインポートをファイルの上部にあるインポートセクションに追加します。

    import com.liferay.message.boards.model.MBMessage;
    

    JournalArticleの未使用のインポートを削除します。

  3. 新しいモデルリスナーを保存します。

デプロイとテスト

上記と同じように、モデルリスナーをビルドしてデプロイできます。

./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)

掲示板のメッセージを追加してから削除して、リスナーをテストします。

  1. 製品メニューコンテンツ & データメッセージボードに移動します。

  2. 追加 Addをクリックし、件名と本文を入力して、 公開をクリックします。

  3. メニューから[ 掲示板 ]をもう一度クリックして、メッセージを表示します。 [アクション] (Actions) をクリックし、[ 削除] を選択します。 メッセージはリサイクルされただけなので、まだログにメッセージが表示されていないことに注意してください。

  4. メッセージを表示するには、製品メニューから ごみ箱 をクリックします。

  5. アクション (Actions) をクリックし、 削除を選択します。 削除を確認します。

  6. ログを確認してください。 メッセージが表示されます:

    2020-04-17 21:10:31.080 WARN  [http-nio-8080-exec-5][N4G6ModelListener:19] Warning! Message This is a Test Message was just removed.
    

さいごに

  ModelListener インターフェースを実装する方法を理解し、Liferay DXPに新しいモデルリスナーを追加しました。