文档章节

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

architect刘源源
 architect刘源源
发布于 2018/01/22 13:24
字数 548
阅读 33
收藏 0

拦截器配置顺序影响事务正常运行,以下是可以正常运行的
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();
    }
}    

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 200
博文 589
码字总数 965480
作品 0
浦东
程序员
私信 提问
Spring Boot中使用Swagger2构建强大的RESTful(最新全,无坑)

1:说明 网上这类文章 太多, 一搜一大把 ,但是要不是知识太过于老旧,就是配置没有说名清楚,你的项目按照他的配置却不能正常运行: 所以本文的目的: 配置swagger 2 那swagger 1 不说一下吗,我觉...

---dgw博客
2019/12/01
0
0
事务失效为哪般?

最近生产环境发现一个很奇怪的问题,之前用的好好的Spring事务配置在一个接口上突然失效了,其余接口正常。原因究竟是什么呢?且听我慢慢道来。:-) 问题描述: 注:问题的描述是在demo工程中...

zjg23
2016/06/11
107
0
Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0
2018/05/18
619
0
Spring 拦截器机制研究与扩展

Spring 拦截器配置有以下三种 第一种 mvc:interceptors </mvc:interceptors> 第二种 mvc:interceptors </mvc:interceptors> 第三种 对指定HandlerMapping加拦截器 <bean class="org.springf......

alex.tong
2012/12/20
917
0
spring和plupload整合问题

将Spring和Plupload上传组件整合的时候,上传文件multipartResolver冲突; 1.当配置文件配置multipartResolver解析器时,plupload上传文件到后台后: 部分代码: FileItemFactory factory = ...

dgtery
2014/05/07
495
0

没有更多内容

加载失败,请刷新页面

加载更多

如何为MVC-3转换为4应用程序添加对System.Web.Optimization的引用

我正在最近从MVC 3转换为MVC 4 beta的项目中尝试使用新的捆绑功能。 它需要global.asax中的一行代码, BundleTable.Bundles.RegisterTemplateBundles(); ,这需要using System.Web.Optimiza...

技术盛宴
今天
61
0
Kettle自定义jar包供javascript使用

我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法。所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用。 本篇文章有参考自:https://www...

CREATE_17
昨天
106
0
处理CSV文件中的逗号

我正在寻找有关如何处理正在创建的csv文件的建议,然后由我们的客户上传,并且该值可能带有逗号(例如公司名称)。 我们正在研究的一些想法是:带引号的标识符(值“,”值“,”等)或使用|...

javail
昨天
79
0
计算一个数的数位之和

计算一个数的数位之和 例如:128 :1+2+8 = 11 public int numSum(int num) { int sum = 0; do { sum += num % 10; } while ((num = num / 10) > 0); return sum;......

SongAlone
昨天
128
0
为什么图片反复压缩后普遍会变绿,而不是其他颜色?

作者:Lion Yang 链接:https://www.zhihu.com/question/29355920/answer/119088684 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 业余版概要:安卓的...

shzwork
昨天
85
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部