为什么80%的码农都做不了架构师?>>>   

拦截器配置顺序影响事务正常运行,以下是可以正常运行的
order的值越大就越靠近被代理的方法;

<!-- 事务配置 -->
    <tx:advice id="callcenter.databaseTxAdvice" transaction-manager="springTransactionManager">
        <tx:attributes>
            <tx:method name="get*" propagation="SUPPORTS"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="*" propagation="REQUIRED"  rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>

<aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(public * com.hy.callcenter.service.database..*.*(..))"  id="pc"  />
        <aop:advisor pointcut-ref="pc" advice-ref="callcenter.databaseTxAdvice" order="2" />
        <aop:aspect ref="aspectServiceDatabase" order="1">
            <aop:around method="round" pointcut-ref="pc" />
        </aop:aspect>
    </aop:config>
    
    <bean  id="aspectServiceDatabase" class="com.hy.callcenter.service.database.aspect.AspectServiceDatabase"/>
    
以上配置代码执行过程
假如被代理的方法叫做save

aspectServiceDatabase 进入
callcenter.databaseTxAdvice 进入
save 
callcenter.databaseTxAdvice 出来
aspectServiceDatabase 出来

如果order 顺序对调如下:
    <!-- 事务配置 -->
    <tx:advice id="callcenter.databaseTxAdvice" transaction-manager="springTransactionManager">
        <tx:attributes>
            <tx:method name="get*" propagation="SUPPORTS"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="*" propagation="REQUIRED"  rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>

<aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(public * com.hy.callcenter.service.database..*.*(..))"  id="pc"  />
        <aop:advisor pointcut-ref="pc" advice-ref="callcenter.databaseTxAdvice" order="1" />
        <aop:aspect ref="aspectServiceDatabase" order="2">
            <aop:around method="round" pointcut-ref="pc" />
        </aop:aspect>
    </aop:config>
    
    <bean  id="aspectServiceDatabase" class="com.hy.callcenter.service.database.aspect.AspectServiceDatabase"/>

以上配置代码执行过程
假如被代理的方法叫做save

callcenter.databaseTxAdvice 进入
aspectServiceDatabase 进入
save 
aspectServiceDatabase 出来
callcenter.databaseTxAdvice 出来

这样的执行顺序会导致事务不起作用
因为com.hy.callcenter.service.database.aspect.AspectServiceDatabase.round把异常吞没了,
这样外层代理callcenter.databaseTxAdvice 就感知不到异常会导致事务不起作用

public class AspectServiceDatabase {
    
    private static SfbestLogger logger = SfbestLogger.getInstance(AspectServiceDatabase.class);
    //通过异常code获取消息
    @Autowired
    MsgService msgService;
    
    public Object round(final ProceedingJoinPoint pjp) throws Throwable {
        Object returnVal = null;
        try {
            long startTime = System.currentTimeMillis();
            returnVal = pjp.proceed();
            long endTime = System.currentTimeMillis();
            long cost = endTime - startTime;
            logger.info(">>>>>>>>>>业务处理方法:" + pjp.getThis().getClass().getName() + "|" + pjp.getSignature().getName() +"【"+ cost +"】");
            logger.info(">>>>>>>>>>业务处理参数:" + toString(pjp.getArgs()));
            logger.info(">>>>>>>>>>业务处理时长:" + cost+"毫秒");
//            logger.info(">>>>>>>>>>业务处理结果:" + returnVal);
        } catch (BusinessException e) {
            logger.error("系统错误", e);
            logger.info("业务处理方法:" + pjp.getThis().getClass().getName() + "|" + pjp.getSignature().getName());
            logger.info("业务处理参数:" + toString(pjp.getArgs()));
            DataResult dto = new DataResult();
            int errorCode = Integer.parseInt(e.getMessage());
            dto.setCode(errorCode);
            //获取异常code,并获取异常信息
            dto.setMsg("".equals(msgService.getMsg(errorCode))?OrderContant.DEFAULT_MSG:msgService.getMsg(errorCode));
            returnVal = dto;
            logger.info(returnVal.toString());
        }catch (Exception e) {
            logger.error("系统错误", e);
            logger.info("业务处理方法:" + pjp.getThis().getClass().getName() + "|" + pjp.getSignature().getName());
            logger.info("业务处理参数:" + toString(pjp.getArgs()));
            DataResult dto = new DataResult();
            dto.setCode(-1);
            dto.setMsg("未知错误");
            returnVal = dto;
        }
        return returnVal;
    }
    
    
    private String toString(Object[] args) {
        StringBuilder sb = new StringBuilder();
        for(Object arg : args) {
            sb.append(arg).append(",");
        }
        return sb.toString();
    }
}

转载于:https://my.oschina.net/huangy/blog/719412

sping拦截器配置顺序影响事务正常运行相关推荐

  1. Spring拦截器配置详解(如何定义一个拦截器)

    一.前言 Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤 ...

  2. SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景

    一.拦截器简介 1.拦截器定义 拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 拦截器主要用来按照指定规则拒绝请求. 2.拦截器中应用 Token令牌 ...

  3. springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题

    背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看request 中是否包含指定的信息,而自然就想到了使用拦截器就可以轻松实现 编写拦截器,获取请求头信息中的test,并打印出来 @C ...

  4. 拦截器原理多个拦截器执行顺序

    拦截器原理多个拦截器执行顺序 1.根据当前请求,找到**HandlerExecutionChain[可以处理请求的handler以及handler的所有 拦截器] 2.先来顺序执行 所有拦截器的 pr ...

  5. Spring mvc 拦截器 配置心得

    session超过时间自动跳转到登录页面.要求请求的每个url都要进行拦截,当然,js,css这些东西除外. spring-mvc.xml Xml代码   <!-- 拦截器配置 --> & ...

  6. SpringBoot拦截器配置

    SpringBoot拦截器配置 自定义拦截器: com.example.mybatis2018.interceptor.MyInterCeptor package com.example.mybati ...

  7. java 拦截器顺序_Springmvc拦截器执行顺序及各方法作用详解

    实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInt ...

  8. vue 请求拦截器配置

    按如下步骤进行 1.request.js内容:http request请求拦截器和http response服务器响应拦截器配置 请求拦截器有一个Authorization认证,判断登录状态之后再决定 ...

  9. Spring 拦截器流程及多个拦截器的顺序

    拦截器是 Spring MVC 中的组件,它可以在进入请求方法前做一些操作,也可以在请求方法后和渲染视图后做一些事情. 拦截器的定义 SpringMVC 的拦截器只需要实现 HandlerInterc ...

最新文章

  1. linux 脚本给设备节点权限,[Linux] I2C设备读写及文件节点创建
  2. 20145309信息安全系统设计基础第3周学习总结
  3. Codeforces Round #267 Div2 C George and Job --DP
  4. 雅虎将于4月底关闭自助式广告测试
  5. myelcipse和maven搭建项目
  6. filezilla 共享多个目录_filezilla设置中文,3步搞定filezilla中文设置
  7. 双向板受力特点_弹性减震球形钢支座/双向弹簧铰支座特性
  8. while和do-while的区别
  9. ROS2暑期学校 ROS2 Summer School 2022-转-
  10. [ 常用工具篇 ] burpsuite_pro 安装配置详解(附安装包)
  11. pycharm中.ui文件跨包路径转.py文件
  12. 图解Blash数集题解
  13. php跨站刷票,解析PHP跨站刷票的实现代码
  14. 171204之条件查询总结
  15. PXIe背板 全混合8槽 4 Link架构 系统带宽14GB/s 单槽4GB/s
  16. 接线端子名PH,XH,ZH的区别
  17. 教你用友T+如何恢复数据的3种方法
  18. 纵横网络靶场社区-Modbus协议
  19. 前端uniApp设置手机日历提醒
  20. 用了 AppiumDriver 后,WebDriverWait 中无法使用 AppiumDriver 特有的方法

热门文章

  1. python编程输入标准-青少年Python编程能力标准等级模拟考试
  2. 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
  3. NVIDIA Jetson Xavier NX设备上使用jtop监控GPU、CPU、内存等的使用
  4. 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
  5. mysql基础sql语句_SQL基础语句汇总
  6. 用git提交代码时,由于进程加锁,突然崩溃,未来得及解锁,导致其他进程访问不了...
  7. log4j.xml 简介
  8. MyEclipse 设置字体
  9. Unix 时间表示方式与windows时间表示方式相互转换的解决办法
  10. 如何做一个好的互联网老板(二)