Hay ocho diferentes eventos que el exportador REST emite durante todo el proceso de trabajo con una entidad. Estos son:
- BeforeCreateEvent
- AfterCreateEvent
- BeforeSaveEvent
- AfterSaveEvent
- BeforeLinkSaveEvent
- AfterLinkSaveEvent
- BeforeDeleteEvent
- AfterDeleteEvent
package com.juanpabloprado.review; import com.juanpabloprado.user.User; import com.juanpabloprado.user.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.core.annotation.HandleBeforeCreate; import org.springframework.data.rest.core.annotation.RepositoryEventHandler; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @Component @RepositoryEventHandler(Review.class) public class ReviewEventHandler { private final UserRepository users; @Autowired public ReviewEventHandler(UserRepository users) { this.users = users; } @HandleBeforeCreate public void addReviewerBasedOnLoggedInUser(Review review) { String username = SecurityContextHolder.getContext().getAuthentication().getName(); User user = users.findByUsername(username); review.setReviewer(user); } }
Tenemos una clase ReviewEventHandler, con un nombre que explica la intención de la clase i.e. manejar los eventos de la entidad Review.
Para declarar un handler, crea un POJO y ponle la anotación @RepositoryEventHandler. Esto le dice al BeanPostProcessor que esta clase tiene que ser inspeccionada para encontrar métodos handler.
Ahora la anotación @Component es para que la aplicación tome en cuenta esta clase como un componente Spring, y sea recogida por @SpringBootApplication o @ComponentScan el cual escanea el classpath en busca de POJOS con anotaciones Spring dentro del paquete e.g. @Component @Repository, @Service, o @Controller
private final UserRepository users; @Autowired public ReviewEventHandler(UserRepository users) { this.users = users; }
Esta parte no es mas que inyección de dependencias, por medio de un argumento del constructor, para ello es necesario la anotación @Autowired en el constructor de nuestra clase.
Como en todo post llegamos al final… But show me the code!
Echale un vistazo al repo en GitHub. Y si quieres aprender Spring Data REST con Spring Boot hay un excelente curso en Treehouse, en el cual se basa mi código. 😀