jpa 为什么@Transactional也能在aop @Before方法中工作?

b5lpy0ml  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(148)

我的项目中有Product CRUD的ProductService类

@Transactional
public Product registerNewProduct(ProductPayload productPayload) {
 Product product = productPayload.getProduct();
 PriceHistory priceHistory = productPayload.getPriceHistory();
 if(priceHistory == null)
  throw new PriceInfoNotExistException("Price info is needed to register new product.");

在执行方法之前,我尝试使用AOP @Before将API调用日志信息插入到数据库中。

@Before("execution(com.example.demo.entity.Product com.example.demo.service.ProductService.*(..))")
public void beforeBeginTransaction(JoinPoint joinPoint) {
//some code here
productChangeHistoryRepository.saveAndFlush(productChangeHistory);
}

我在不提供价格信息的情况下测试CREATE操作,这样我就可以获得PriceInfoNotExistException。但如果引发PriceInfoNotExistException,则会执行下面的代码,但不会插入数据。

productChangeHistoryRepository.saveAndFlush(productChangeHistory);

我认为这是因为registerNewProduct()方法上的@Transactional注解,因为如果我删除此注解并在没有价格信息的情况下再次测试,日志数据将成功保存到数据库。
有没有什么方法可以在registerNewProduct()上保留@Transactional注解的同时,在AOP @Before方法中保存一些数据?

o3imoua4

o3imoua41#

Spring将创建一个代理方法(其中@Before方面代码的执行将位于第一个位置),并带有初始方法所具有的所有注解。
不确定AOP是否是测试方法的好选择。尝试模拟不同的ProductPayload对象(带或不带priceHistory)并在其上调用您的方法。

相关问题