我有一个(简化如下)RestController调用CrudRepository。
@RestController
@RequestMapping({"/carApi"})
public class RestService {
@Autowired
private StorageService storageService;
@PostMapping
public RightTriangle create(@RequestBody DegregatedCar degregatedCar) {
// Some logic
Car car = convert(degregatedCar);
return storageService.save(car);
}
}
public interface StorageService extends CrudRepository<Car, Long> {
}
我想在保存实体(在本例中为汽车)后做一些其他事情。
我尝试使用@RepositoryEventHandler
和AbstractRepositoryEventListener
但是,如此处所述,这些只有在由CrudRepository公开的REST调用时才有效。 这意味着,以编程方式调用时不起作用。
知道如何侦听存储库事件,无论它们是如何调用的吗?
-
如果您使用的是 Mongo(spring-data-mongodb),则可以使用 Mongo 生命周期事件。例如
@Component public class MongoListener extends AbstractMongoEventListener<YourEntity> { @Override public void onAfterSave(AfterSaveEvent<YourEntity> event) { // Your logic here. } } //There are many other methods in AbstractMongoEventListener like onBeforeSave ...... }
-
如果您将任何关系数据库与 spring-data-jpa 一起使用,则可以使用 JPA 生命周期事件,例如
@PrePersist void onPrePersist() {} @PostPersist void onPostPersist() {} .......
您可以在实体类中使用它
使用 AOP 解决了它。例:
@Aspect
@Component
public class SystemLoggerService {
@Around("execution(* com.whatever.StorageService.save(..))")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
// TODO: Handle saving multiple save methods.
// TODO: Log after transaction is finished.
Car car = (Car) joinPoint.getArgs()[0];
boolean isCreated = car.id == null;
joinPoint.proceed();
if (isCreated) {
LOGGER.info("Car created: " + car);
} else {
LOGGER.info("Car saved: " + car);
}
}
}