以编程方式调用时如何侦听实体创建?



我有一个(简化如下)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> {
}

我想在保存实体(在本例中为汽车)后做一些其他事情。

我尝试使用@RepositoryEventHandlerAbstractRepositoryEventListener但是,如此处所述,这些只有在由CrudRepository公开的REST调用时才有效。 这意味着,以编程方式调用时不起作用。

知道如何侦听存储库事件,无论它们是如何调用的吗?

  1. 如果您使用的是 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 ......
    }
    
  2. 如果您将任何关系数据库与 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);
}
}
}

相关内容

  • 没有找到相关文章

最新更新