モデルリスナーの作成

モデルリスナーは、ModelListenerインターフェイスを実装します。 これらは、モデル上の永続イベントをリッスンし、何らかの応答を行う(イベントの前後のいずれか)ために使用されます。

モデルリスナーは、エンティティのデータベーステーブルまたはマッピングテーブル(users_rolesなど)の作成削除、または更新の試行に応答して軽量アクションを実行するように設計されています。サポートされている使用例を以下に示します。

  • 監査リスナー:個別のデータベースに、エンティティのデータベーステーブルの更新に関する情報を記録します。
  • キャッシュクリアリスナー:カスタムコードのパフォーマンスを向上させるために追加されたキャッシュをクリアします。
  • 検証リスナー:モデルの属性値がデータベースに永続化される前に、追加の検証を実行します。
  • エンティティ更新リスナー:エンティティテーブルが更新されたときに、追加の処理を実行します。たとえば、アカウントに変更が加えられたときにユーザーに通知します。

また、予測できない破損や悩みの種になる可能性があるため推奨されない使用例もあります。

  • onBeforeUpdate呼び出しにおけるモデル属性の設定。モデルリスナーが呼び出される前に、他のデータベーステーブルの値がすでに更新されている場合、データベースは同期しなくなります。エンティティの属性の設定方法を変更するには、代わりにサービスラッパーの使用を検討してください。
  • モデルのラッピング。データベースからレコードを取得する際、モデルリスナーは呼び出されません。
  • 並列処理を行うワーカースレッドを作成し、リスナーを介して更新したデータにクエリを行う。モデルリスナーは、データベーストランザクションが完了する前 に呼び出されるため(onAfter...メソッドでも)、データベーストランザクションが完了する前にクエリを実行できます。

モデルに既存のリスナーがない場合、あなたのモデルリスナーのみが実行されます。ただし、単一のモデルに複数のリスナーが存在する可能性があり、リスナーの実行順序を制御することはできません。

次の2つの簡単な操作を行うことで、モジュール内にモデルリスナーを作成できます。

  • ModelListenerを実装する
  • LiferayのOSGiランタイムにサービスを登録する

モデルリスナークラスの作成

BaseModelListenerクラスを拡張する-ModelListener クラスを作成します。

package ...;

import ...;

public class CustomEntityListener extends BaseModelListener<CustomEntity> {

// Override one or more methods from the ModelListener interface.

}

クラスの本体で、ModelListenerインターフェイスのメソッドをオーバーライドします。 使用可能なメソッドについては、この記事の最後にリスト化して説明しています。

モデルリスナークラスでは、パラメーター化された型(たとえば、上記スニペットではCustomEntity)は、リスナーを登録するモデルクラスをリスナーのServiceTrackerCustomizerに伝えます。

モデルリスナーサービスの登録

LiferayのOSGiランタイムにサービスを登録して、すぐにアクティベートします。Declarative Servicesを使用する場合は、コンポーネントでservice= ModelListener.classおよびimmediate=trueを設定します。

@Component(
immediate = true,
service = ModelListener.class
)

モデルリスナーの準備については以上です。次に、応答できるモデルイベントについて学習します。

永続イベントのリスニング

ModelListenerインターフェイスは、モデルのイベントをリッスンする多くの機会を提供します。

  • onAfterAddAssociation:2つのモデル間に関連がある場合(マッピングテーブルがある場合)、関連レコードを追加した後でこのメソッドを使用して操作を実行します。
  • onAfterCreate:永続レイヤーのcreateメソッドを呼び出した後で、このメソッドを使用して操作を実行します。
  • onAfterRemove: 永続レイヤーのremoveメソッドを呼び出した後で、このメソッドを使用して操作を実行します。
  • onAfterRemoveAssociation:2つのモデル間に関連がある場合(マッピングテーブルがある場合)、関連レコードを削除した後で操作を実行します。
  • onAfterUpdate:永続レイヤーのupdateメソッドを呼び出した後で、このメソッドを使用して操作を実行します。
  • onBeforeAddAssociation:2つのモデル間に関連がある場合(マッピングテーブルがある場合)、マッピングテーブルを追加する前に操作を実行します。
  • onBeforeCreate:永続レイヤーのcreateメソッドを呼び出す前に、このメソッドを使用して操作を実行します。
  • onBeforeRemove:永続レイヤーのremoveメソッドを呼び出す前に、このメソッドを使用して操作を実行します。
  • onBeforeRemoveAssociation:2つのモデル間に関連がある場合(マッピングテーブルがある場合)、マッピングテーブルから削除する前に操作を実行します。
  • onBeforeUpdate:永続レイヤーのupdateメソッドを呼び出す前に、このメソッドを使用して操作を実行します。

特にremoveおよびupdateメソッドにおいて、Liferayのソースファイルportal-kernel/src/com/liferay/portal/kernel/service/persistence/impl/BasePersistenceImpl.javaを見てみると、モデルの永続イベントの前(onBefore...ケース)と後(onAfter...ケース)でモデルリスナーがどのように考慮されているかがわかります。

モデルリスナーの作成方法を理解したところで、モデルリスナーがスタンドアロンプロジェクトとして、またはアプリケーションの内部で有用であることに留意してください。ユーザーがLiferayに追加されるたびにアプリケーションが何らかの処理(カスタムエンティティの追加など)を行う必要がある場合は、アプリケーションの内部にモデルリスナーを含めることができます。

関連トピック

Upgrading Model Listener Hooks

Service Builder

Service Builder Persistence

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています