モデルリスナーの作成
モデルリスナーは、指定されたモデルへの変更を通知する永続メソッドの呼び出しをリッスンします( update
または add
メソッドなど)。 モデルリスナーが使用するメソッドのほとんどは、DXPの BasePersistenceImpl
クラスから呼び出されます。 すぐに使えるエンティティ( JournalArticle
または AssetEntry
)、または独自のエンティティのモデルリスナーを定義できます。
モデルリスナーを追加するには、 ModelListener
インターフェイスを実装します。
実行中のモデルリスナーを調べる
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.75-ga75。
http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順で JournalArticle
モデルのモデルリスナーの例をデプロイします:
Acme Model Listener
をダウンロードし、解凍する。curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/extending-liferay/liferay-n4g6.zip -O
unzip liferay-n4g6.zip
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.n4g6.impl_1.0.0
追加されたログメッセージを表示して、サンプルモデルリスナーが追加されたことを確認します。 ブラウザーで
http://localhost/8080
を開き、[サイト]メニュー→ [コンテンツ & データ] → [Webコンテンツ] へ行きます。追加ボタンをクリックして、
[基本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のモデルクラスは、 サービスビルダーによって生成されます 。 モデルインターフェイスは、任意のアプリケーションの -api
モジュールにあります。 例えば、掲示板メッセージのモデルインターフェースを見つけるには、Liferay DXPのソースコードで modules/apps/message-boards/message-boards-api
プロジェクトを探してください。
このルールの例外はコアモデルです。 User
などのコアクラスのモデルリスナーを作成する場合、そのインターフェイスはLiferay DXPのソースコードの portal-kernel
フォルダにあります。
作成するモデルリスナーは、掲示板メッセージ用です。 メッセージが削除されると、レポートをログに出力するメッセージをトリガーします。 可能なイベントのリストについては、 BaseModelListener のJavadocを参照してください。
モデルリスナーの動作
モデルリスナーは、特定のエンティティに対して ModelListener
インターフェイスを実装します。 モデルリスナーには、エンティティが作成、更新、または削除される前または後に実行するコードを含めることができます。 これらのメソッドはすべて、 BasePersistenceImpl
クラスから呼び出されます。作成または更新されたエンティティのコードは BasePersistenceImpl
の update
メソッドから呼び出され、削除されたエンティティのコードは BasePersistenceImpl``remove
メソッドから呼び出されます。
モデルリスナーには、他の種類の関連エンティティが追加または削除される前または後に実行するコードを含めることもできます。 これらのメソッドは、 TableMapperImpl
の_addTableMapping
メソッドから呼び出されます。
次に、プロジェクトを変更して、プロジェクトが MBMessage
クラスと onBeforeRemove
イベントで動作するようにします。
モデルを宣言する
テキストエディターまたはIDEで
N4G6ModelListener
クラスを開きます。クラス宣言を見つけます。
@Component(service = ModelListener.class) public class N4G6ModelListener extends BaseModelListener<JournalArticle> {
BaseModelListener
拡張する場合、リスナーがイベントをリッスンするモデルクラスを定義します(この例ではJournalArticle
)。モデルクラスを
MBMessage
に変更します。@Component(service = ModelListener.class) public class N4G6ModelListener extends BaseModelListener<MBMessage> {
このモデルリスナーは登録されると、定義されたモデルのイベントをリッスンします。 モデルは、標準のエンティティまたはカスタムエンティティにすることができます。
BaseModelListener
クラスを拡張すると、ModelListener
のメソッドごとにデフォルトの空の実装が提供されるため、コードはクリーンなままで、必要なイベントのみのオーバーライドが含まれます。
イベントを宣言する
次に、必要なイベントの実装をオーバーライドします。
onAfterCreate
メソッドを見つけます。public void onAfterCreate(JournalArticle journalArticle)
メソッドを変更して、
onBeforeRemove
をオーバーライドし、MBMessage
をmodel
と呼ばれるパラメーターとして渡します。public void onBeforeRemove(MBMessage model)
ビジネスロジックを実装する
特定のアクションをトリガーすることは、特定のモデルイベントをリッスンする典型的な理由です。 この例では、物事をシンプルに保ちます。掲示板のメッセージが削除された場合、メッセージの件名をログに報告します。
新しい
onBeforeRemove
メソッドで、if
ステートメントを次のステートメントに置き換えます。if (_log.isWarnEnabled()) { _log.warn("Warning! Message " + model.getSubject() + " was just removed."); }
MBMessage
の新しいインポートをファイルの上部にあるインポートセクションに追加します。import com.liferay.message.boards.model.MBMessage;
JournalArticle
の未使用のインポートを削除します。新しいモデルリスナーを保存します。
デプロイとテスト
上記と同じように、モデルリスナーをビルドしてデプロイできます。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
掲示板のメッセージを追加してから削除して、リスナーをテストします。
[プロダクトメニュー] → [コンテンツ & データ] → [掲示板] に移動します。
追加
ボタンをクリックし、件名と本文を入力して、[公開]をクリックします。
メニューから[掲示板]をもう一度クリックして、メッセージを表示します。 アクション
ボタンをクリックし、 削除 を選択します。 メッセージはリサイクルされただけなので、まだログにメッセージが表示されていないことに注意してください。
[プロダクトメニュー]から[ゴミ箱]をクリックすると、メッセージが表示されます。
アクション
ボタンをクリックし、[削除]を選択します。 削除を確認します。
ログを確認してください。 メッセージが表示されます:
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に新しいモデルリスナーを追加しました。