«1. Введение

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

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

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

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

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

In the example below, we annotate the class with RepositoryEventHandler corresponding to the entity Author – and declare methods pertaining to different before and after events corresponding to the Author entity in the AuthorEventHandler class:

@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 перебирает методы в классе, чтобы найти аннотации, соответствующие событиям до и после, упомянутым ниже: событие называется.

BeforeCreateEvent BeforeDeleteEvent BeforeSaveEvent BeforeLinkSaveEvent

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

AfterLinkSaveEvent AfterSaveEvent AfterCreateEvent AfterDeleteEvent

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

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

@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
    }
}

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

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

@Configuration
public class RepositoryConfiguration{
    
    public RepositoryConfiguration(){
        super();
    }

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

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

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

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

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

«