aop与spring事务的异常机制

今天在做自己的项目的时候,明明在配置文件中配置了事务管理机制,然后想测试一下事务是否生效,一直不生效

后来发现原来是因为我自己定义的日志切面把异常抓取了,但是没有抛出去

后来就把异常抛出去就行了,最重要的是

 

切面里面抛出的异常必须是spring注解抓取的子类或者等于它,具体的看下代码

@Component
@Aspect
public class LoggingAop{

    private static Logger LOGGER = LoggerFactory.getLogger(LoggingAop.class);

    //拦截所有被该注解修饰的所有类下面的所有方法
    @Around("@within(com.zxc.movie.aop.annotation.Log)")
    public Object before(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        Transactional transactional = null ;
        MethodSignature methodSignature = null;
        Class<?> clazz = null;
       try{
           clazz = proceedingJoinPoint.getTarget().getClass();
           //就是为了获取当前执行的方法,可以忽略不看
           methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();;
           Method method =clazz.getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
           LogIgnore logIgnore = method.getAnnotation(LogIgnore.class);
           transactional = method.getAnnotation(Transactional.class);
           //前置日志
           if(logIgnore == null || logIgnore != null && logIgnore.before()) {
               LOGGER.info(clazz.getName() + " 执行了 " +  methodSignature.getName() + " 方法,参数为{}", Arrays.asList(proceedingJoinPoint.getArgs()));
           }
           Object object = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
           //后置日志
           if(logIgnore == null || logIgnore != null && logIgnore.after()) {
               LOGGER.info(clazz.getName() + " 成功执行了 " +  methodSignature.getName() + " 方法,返回值为{}", object);
           }
       }catch (Throwable throwable) {
           //异常日志 TODO 后期需要通知对应人员进行一个处理
           LOGGER.error(clazz.getName() + " 执行了 " +  methodSignature.getName() + " 方法出错,当时传入的参数为{}", Arrays.asList(proceedingJoinPoint.getArgs()));
           /**
            * 如果用了事务,那么异常要抛回给spring自身去处理
            * 重要!!! -- 只能抛出spring注解处理的异常的子类或本类,不能抛出比它大的异常,否则spring就拿不到了
            */
           if(transactional != null) {
               throw throwable.getClass().newInstance();
           }
       }
        return false;
    }

 
}

 

因为我做这个切面的时候本身也是用的注解,所以便同时可以拿到spring上面的注解,如果有那个注解

把此时的异常抛出去给spring注解即可

 

如果抛出的异常大于spring的异常,那事务将不会被回滚,切记!!

<think>好的,我现在需要帮助用户了解在PyCharm安装Qt详细步骤。首先,我应该先理清楚用户的需求。他们可能想在PyCharm中使用Qt开发图形界面应用程序。Qt通常有两个主要的Python绑定:PyQt和PySide。用户可能不清楚这两者的区别,所以需要解释一下,然后分别给出安装步骤。 首先,我需要考虑用户的环境。安装Qt相关库之前,确保他们已经创建了Python项目,并且配置了虚拟环境,这可能是一个好习惯。所以步骤里应该包括创建或打开项目,检查虚拟环境。 接下来,安装PyQt或PySide。用户可能不知道选择哪个,PyQt是商业许可,而PySide是LGPL,可能更适合开源项目。需要简要说明两者的区别,让用户自行选择。 然后,安装工具PyCharm通常使用pip来安装包,所以需要指导他们如何在PyCharm的终端中使用pip命令。同时,可能需要提醒他们如果遇到权限问题,可能需要使用管理员权限或者用户安装选项。 安装完成后,验证安装是否成功。这部分需要给出简单的测试代码,比如创建一个窗口,确保没有报错。这样用户能够确认安装是否正确。 另外,可能需要提到Qt Designer的集成,因为这是一个可视化设计工具,对开发有帮助。安装PyQt5-tools或PySide6的对应工具,然后在PyCharm中配置外部工具,方便用户直接打开Designer。 在步骤中,需要注意使用正确的包名称,比如PyQt5和PySide6。同时,确保用户了解不同版本的Python可能需要不同的包版本,比如PyQt5对应Python3,而PyQt6可能有不同的安装方式。 还需要注意可能的常见问题,例如网络问题导致安装失败,建议使用镜像源;或者安装过程中缺少依赖库,需要安装系统级的依赖,比如在Linux上可能需要安装Python3-dev等。 最后,总结整个流程,让用户有一个清晰的步骤概览,并确保他们能够按照步骤顺利完成安装。可能还需要提醒他们查阅官方文档,如果遇到更复杂的问题,或者需要更深入的功能配置。</think>在PyCharm中集成Qt开发环境分为以下步骤: --- ### 一、准备工作 1. **创建/打开项目** - 打开PyCharm → `File` → `New Project` 创建新项目 或 `Open` 打开已有项目 2. **配置Python虚拟环境** - 确保已激活虚拟环境:`File` → `Settings` → `Project: <项目名>` → `Python Interpreter` --- ### 二、安装Qt绑定库 #### 方案1:安装PyQt5 1. **通过PyCharm终端安装** ```bash pip install PyQt5 ``` 2. **安装Qt工具包(可选)** ```bash pip install PyQt5-tools ``` #### 方案2:安装PySide6(Qt官方Python绑定) 1. **安装命令** ```bash pip install PySide6 ``` --- ### 三、验证安装 1. **创建测试文件** 新建Python文件(如 `test_qt.py`),输入以下代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget # PyQt5写法 # from PySide6.QtWidgets import QApplication, QWidget # PySide6写法 app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("Qt测试窗口") window.show() sys.exit(app.exec()) ``` 2. **运行代码** 右键运行 → 若弹出空白窗口则安装成功 --- ### 四、集成Qt Designer(可视化界面设计工具) 1. **配置外部工具** - `File` → `Settings` → `Tools` → `External Tools` → 点击 `+` - **名称**:`Qt Designer` - **程序**: - PyQt5路径示例:`$venv/Lib/site-packages/qt5_applications/Qt/bin/designer.exe` - PySide6路径示例:`$venv/Lib/site-packages/PySide6/designer.exe` - **工作目录**:`$ProjectFileDir$` 2. **使用Designer** - 右键项目文件 → `External Tools` → `Qt Designer` → 设计并保存 `.ui` 文件 --- ### 五、常见问题 1. **安装失败** - 使用国内镜像加速:`pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple` 2. **缺少依赖** - Linux系统需安装:`sudo apt-get install python3-dev qt5-default` 3. **版本冲突** - 明确Python版本与Qt库版本对应关系(如PyQt6需Python≥3.6.1) --- ### 六、总结流程 1. 创建项目 → 2. 安装PyQt5/PySide6 → 3. 验证代码 → 4. 集成Qt Designer(可选)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值