spring boot 自定义事务注解
前言
在开发中,需要在controller中添加事务,但@Transactional只能添加在service中,加在controller中无效
原因
springboot项目启动时,会在spring容器中,查找使用@Transactional的Bean,但是controller在spring mvc容器中。spring容器中,找不到spring mvc容器的Bean,因此在controller中,无法使用@Transactional
解决方案
新建自定义事务注解,在controller中使用自定义事务注解
新建 @ControllerTransaction
package com.lsb.aspect.annotation;
import java.lang.annotation.*;
/**
* @author liushengbing
* @ClassName ControllerTransaction
* @Description Controller 事务
* @createTime 2022/11/11 18:29
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ControllerTransaction {
}
新建 ControllerTransactionAspect
package com.lsb.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
* @author liushengbing
* @ClassName ControllerTransactionAspect
* @Description Controller 事务 aop
* @createTime 2022/11/11 18:32
*/
@Aspect
@Component
public class ControllerTransactionAspect {
@Autowired
private PlatformTransactionManager transactionManager;
@Pointcut("@annotation(com.moshu.aspect.annotation.ControllerTransaction)")
public void controllerTransactionPointcut(){
}
@Around("controllerTransactionPointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 开启事务
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);
try{
// 执行方法
Object result = point.proceed();
// 执行成功 提交事务
transactionManager.commit(status);
// 返回执行结果
return result;
}catch (Throwable throwable){
// 执行方法出错,回滚事务
transactionManager.rollback(status);
// 重新抛出这个错误
throw throwable;
}
}
}
正文到此结束
- 本文标签: Spring Boot
- 版权声明: 本站原创文章,于2022年11月13日由丙火发布,转载请注明出处