イベント
REST エクスポータは、エンティティを操作するプロセス全体で 8 つの異なるイベントを発行します。
ApplicationListener
を書く
これらの種類のイベントをリッスンし、イベント型に基づいて適切なメソッドを呼び出す抽象クラスをサブクラス化できます。これを行うには、次のように、問題のイベントのメソッドをオーバーライドします。
public class BeforeSaveEventListener extends AbstractRepositoryEventListener {
@Override
public void onBeforeSave(Object entity) {
... logic to handle inspecting the entity before the Repository saves it
}
@Override
public void onAfterDelete(Object entity) {
... send a message that this entity has been deleted
}
}
ただし、このアプローチで注意すべきことの 1 つは、エンティティの型に基づいて区別がないことです。それを自分でインスペクションしなければなりません。
アノテーション付きハンドラーの作成
別のアプローチは、ドメイン型に基づいてイベントをフィルタリングするアノテーション付きハンドラーを使用することです。
ハンドラーを宣言するには、POJO を作成し、それに @RepositoryEventHandler
アノテーションを付けます。これは、このクラスがハンドラーメソッドについてインスペクションされる必要があることを BeanPostProcessor
に通知します。
BeanPostProcessor
は、このアノテーションが付いた Bean を見つけると、公開されたメソッドを繰り返し処理し、問題のイベントに対応するアノテーションを探します。例: さまざまな種類のドメイン型のアノテーション付き POJO で BeforeSaveEvent
インスタンスを処理するには、クラスを次のように定義できます。
@RepositoryEventHandler (1)
public class PersonEventHandler {
@HandleBeforeSave
public void handlePersonSave(Person p) {
// … you can now deal with Person in a type-safe way
}
@HandleBeforeSave
public void handleProfileSave(Profile p) {
// … you can now deal with Profile in a type-safe way
}
}
1 | (たとえば) @RepositoryEventHandler(Person.class) を使用して、このハンドラーが適用される型を絞り込むことができます。 |
関心のあるイベントのドメイン型は、アノテーション付きメソッドの最初のパラメーターの型から決定されます。
イベントハンドラーを登録するには、Spring の @Component
ステレオタイプの 1 つでクラスをマークするか(@SpringBootApplication
または @ComponentScan
で取得できるようにするため)、ApplicationContext
でアノテーション付き Bean のインスタンスを宣言します。次に、RepositoryRestMvcConfiguration
で作成された BeanPostProcessor
は、Bean のハンドラーをインスペクションし、正しいイベントに接続します。次の例は、Person
クラスのイベントハンドラーを作成する方法を示しています。
@Configuration
public class RepositoryConfiguration {
@Bean
PersonEventHandler personEventHandler() {
return new PersonEventHandler();
}
}
Spring Data REST イベントはカスタマイズされた Spring アプリケーションイベントです。デフォルトでは、Spring イベントは、境界を越えて再パブリッシュされない限り同期です (WebSocket イベントの発行やスレッドへの移行など)。 |