Spring Data REST Events with @RepositoryEventHandler

June 01, 2018 0 Comments

1. Introduction


While working with an entity, the REST exporter handles operations for creating, saving, and deleting events. We can use an ApplicationListener to listen to these events and execute a function when the particular action is performed.


Alternatively, we can use annotated handler which filters events based on domain type.


2. Writing an Annotated Handler


The ApplicationListener doesn’t distinguish between entity types; but with the annotated handler, we can filter events based on domain type.


We can declare an annotation based event handler by adding @RepositoryEventHandler annotation on a POJO. As a result, this informs the BeanPostProcessor that the POJO needs to be inspected for handler methods.



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();
}
}

Here, different methods of the AuthorEventHandler class will be invoked based on the operation performed on Author entity.


On finding the class with @RepositoryEventHandler annotation, Spring iterates over the methods in the class to find annotations corresponding to the before and after events mentioned below:


Before* Event Annotations – associated with before annotations are called before the event is called.



  • BeforeCreateEvent

  • BeforeDeleteEvent

  • BeforeSaveEvent

  • BeforeLinkSaveEvent


After* Event Annotations – associated with after annotations are called after the event is called.



  • AfterLinkSaveEvent

  • AfterSaveEvent

  • AfterCreateEvent

  • AfterDeleteEvent


We can also declare methods with different entity type corresponding to the same event type in a class:


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

Here, the BookEventHandler class deals with more than one entity. On finding the class with @RepositoryEventHandler annotation, it iterates over the methods and calls the respective entity before the respective create event.


Also, we need to declare the event handlers in the @Configuration class which will inspect the bean for handlers and matches them with the right events:


@Configuration
public class RepositoryConfiguration{

public RepositoryConfiguration(){
super();
}

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

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

3. Conclusion


In conclusion, this serves as an introduction to implementing and understanding @RepositoryEventHandler.


In this quick tutorial, we learned how to implement @RepositoryEventHandler annotation to handle various events corresponding to entity type.


And, as always, find the complete code samples over on Github.




Source: Java Baeldung

Unknown

Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard. Google

0 comments:

Hot-product

Best Watch Store

Popular Posts

Contact Form

Name

Email *

Message *