How to Convert Jpa to Spring Events
Learn how to convert JPA to Spring events. This is normally used in observer pattern when you want to do something after an operation has be...
Learn how to convert JPA to Spring events. This is normally used in observer pattern when you want to do something after an operation has been done on an entity. For example, you want to send an email or initiate an HTTP request after an entity has been created.
1. Introduction
To demonstrate this functionality a Spring Boot project will be created that will have one entity Book. Entity create, update, and delete operations will be observed.
*Lombok will be used to automatically generates getters and setters.
2. Entity Listener, Entity, and Repository
Entity Listener - this component is responsible for listening to JPA events and converting it to Spring. Notice the use of ApplicationEventPublisher.
@Component public class JpaToSpringEvent { @Autowired private ApplicationEventPublisher applicationEventPublisher; @PrePersist public void created(Object e) { applicationEventPublisher.publishEvent(new CreatedJpaEvent(e)); } @PreUpdate public void updated(Object e) { applicationEventPublisher.publishEvent(new UpdatedJpaEvent(e)); } @PreRemove public void removed(Object e) { applicationEventPublisher.publishEvent(new RemovedJpaEvent(e)); } }Book Entity - this is a classic book entity example. Note that I'm using Lombok to generate getters and setters
@Entity @Data @EntityListeners(JpaToSpringEvent.class) public class Book { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; }Book Repository - again nothing extraordinary here
@Repository public interface BookRepository extends JpaRepository<Book, Long> { }
3. Event Objects
The event objects can be defined based on requirements. Here, 3 events are created for create, update, and remove.
Let's see an example for create:
@Data @EqualsAndHashCode(callSuper = false) public class JpaEvent extends ApplicationEvent { private static final long serialVersionUID = -5409982028671451419L; public final String eventType; public JpaEvent(Object source, String eventType) { super(source); this.eventType = eventType; } @Override public String toString() { return eventType + " " + source; } } public class CreatedJpaEvent extends JpaEvent { private static final long serialVersionUID = -8923264580035968707L; public CreatedJpaEvent(Object source) { super(source, "CREATED"); } }
4. Spring Event Listener
SpringEventListener - This class listens to Spring events. One can argue, why not just put these codes in the entity listener? In some cases that is enough. For example, if you just want to set a field in the entity during an update like updateAt. But it's not recommended for cases wherein the observer needs to perform complex tasks and depends on several components.
@Component public class SpringEventListener { @EventListener public void onJpaEntityCreated(CreatedJpaEvent e) { System.out.println("create jpa event received " + e); } @EventListener public void onJpaEntityUpdated(UpdatedJpaEvent e) { System.out.println("update jpa event received " + e); } @EventListener public void onJpaEntityRemoved(RemovedJpaEvent e) { System.out.println("remove jpa event received " + e); } }
5. Testing the Application
To test the events, a test class is created to perform create, update, and remove entity database operations.
@SpringBootTest class JpaToSpringEventsApplicationTests { @Autowired private BookRepository bookRepository; @Test void contextLoads() { } @Test public void whenCreateUpdateRemoveBook_thenOk() { Book book = new Book(); book.setName("Mahouka Koukou"); bookRepository.save(book); book.setName("Gate Jietai"); bookRepository.save(book); bookRepository.delete(book); } }
To run the test, navigate to the project's base directory and execute: mvn test.
Post a Comment