我的项目中有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方法中保存一些数据?
1条答案
按热度按时间o3imoua41#
Spring将创建一个代理方法(其中@Before方面代码的执行将位于第一个位置),并带有初始方法所具有的所有注解。
不确定AOP是否是测试方法的好选择。尝试模拟不同的ProductPayload对象(带或不带priceHistory)并在其上调用您的方法。