Перейти к основному содержимому

События Spring Data REST с @RepositoryEventHandler

· 3 мин. чтения

1. Введение

При работе с сущностью экспортер REST обрабатывает операции по созданию, сохранению и удалению событий. Мы можем использовать ApplicationListener для прослушивания этих событий и выполнения функции при выполнении определенного действия.

В качестве альтернативы мы можем использовать аннотированный обработчик, который фильтрует события по типу домена.

2. Написание аннотированного обработчика

ApplicationListener не различает типы сущностей ; но с помощью аннотированного обработчика мы можем фильтровать события по типу домена .

Мы можем объявить обработчик событий на основе аннотаций, добавив аннотацию @RepositoryEventHandler к POJO. В результате это информирует BeanPostProcessor о том, что POJO необходимо проверить на наличие методов обработчика.

В приведенном ниже примере мы аннотируем класс с помощью RepositoryEventHandler , соответствующего сущности Author , и объявляем методы, относящиеся к различным событиям до и после, соответствующим сущности Author , в классе AuthorEventHandler :

@RepositoryEventHandler(Author.class) 
public class AuthorEventHandler {
Logger logger = Logger.getLogger("Class AuthorEventHandler");

@HandleBeforeCreate
public void handleAuthorBeforeCreate(Author author){
logger.info("Inside Author Before Create....");
String name = author.getName();
}

@HandleAfterCreate
public void handleAuthorAfterCreate(Author author){
logger.info("Inside Author After Create ....");
String name = author.getName();
}

@HandleBeforeDelete
public void handleAuthorBeforeDelete(Author author){
logger.info("Inside Author Before Delete ....");
String name = author.getName();
}

@HandleAfterDelete
public void handleAuthorAfterDelete(Author author){
logger.info("Inside Author After Delete ....");
String name = author.getName();
}
}

Здесь будут вызываться различные методы класса AuthorEventHandler в зависимости от операции, выполняемой над сущностью Author .

Найдя класс с аннотацией @RepositoryEventHandler , Spring перебирает методы в классе, чтобы найти аннотации, соответствующие событиям до и после, упомянутым ниже:

Аннотации до* событий — связаны с тем, что аннотации до вызываются до вызова события.

  • Перед созданием события
  • Перед Удалить Событие
  • Перед сохранением события
  • Перед LinkSaveEvent

`Аннотации событий After*` — связанные с аннотациями after, вызываются после вызова события.

  • Событие AfterLinkSave
  • AfterSaveEvent
  • Афтеркреатеевент
  • AfterDeleteEvent

Мы также можем объявить методы с разными типами сущностей, соответствующими одному и тому же типу события в классе:

@RepositoryEventHandler
public class BookEventHandler {

@HandleBeforeCreate
public void handleBookBeforeCreate(Book book){
// code for before create book event
}

@HandleBeforeCreate
public void handleAuthorBeforeCreate(Author author){
// code for before create author event
}
}

Здесь класс BookEventHandler имеет дело с несколькими объектами. Найдя класс с аннотацией @RepositoryEventHandler , он перебирает методы и вызывает соответствующий объект перед соответствующим событием создания.

Кроме того, нам нужно объявить обработчики событий в классе @Configuration , который будет проверять bean-компонент на наличие обработчиков и сопоставлять их с правильными событиями:

@Configuration
public class RepositoryConfiguration{

public RepositoryConfiguration(){
super();
}

@Bean
AuthorEventHandler authorEventHandler() {
return new AuthorEventHandler();
}

@Bean
BookEventHandler bookEventHandler(){
return new BookEventHandler();
}
}

3. Заключение

В заключение, это служит введением в реализацию и понимание @RepositoryEventHandler.

В этом кратком руководстве мы узнали, как реализовать аннотацию @RepositoryEventHandler для обработки различных событий, соответствующих типу объекта.

И, как всегда, полные примеры кода можно найти на Github .