sping拦截器配置顺序影响事务正常运行
为什么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拦截器配置顺序影响事务正常运行相关推荐
- Spring拦截器配置详解(如何定义一个拦截器)
一.前言 Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤 ...
- SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景
一.拦截器简介 1.拦截器定义 拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 拦截器主要用来按照指定规则拒绝请求. 2.拦截器中应用 Token令牌 ...
- springboot 添加拦截器之后中文乱码_spring boot 2.x 添加拦截器配置未生效的问题
背景: 今天有一个需求需要拦截除登录相关请求以外的所有请求,并查看request 中是否包含指定的信息,而自然就想到了使用拦截器就可以轻松实现 编写拦截器,获取请求头信息中的test,并打印出来 @C ...
- 拦截器原理多个拦截器执行顺序
拦截器原理多个拦截器执行顺序 1.根据当前请求,找到**HandlerExecutionChain[可以处理请求的handler以及handler的所有 拦截器] 2.先来顺序执行 所有拦截器的 pr ...
- Spring mvc 拦截器 配置心得
session超过时间自动跳转到登录页面.要求请求的每个url都要进行拦截,当然,js,css这些东西除外. spring-mvc.xml Xml代码 <!-- 拦截器配置 --> & ...
- SpringBoot拦截器配置
SpringBoot拦截器配置 自定义拦截器: com.example.mybatis2018.interceptor.MyInterCeptor package com.example.mybati ...
- java 拦截器顺序_Springmvc拦截器执行顺序及各方法作用详解
实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInt ...
- vue 请求拦截器配置
按如下步骤进行 1.request.js内容:http request请求拦截器和http response服务器响应拦截器配置 请求拦截器有一个Authorization认证,判断登录状态之后再决定 ...
- Spring 拦截器流程及多个拦截器的顺序
拦截器是 Spring MVC 中的组件,它可以在进入请求方法前做一些操作,也可以在请求方法后和渲染视图后做一些事情. 拦截器的定义 SpringMVC 的拦截器只需要实现 HandlerInterc ...
最新文章
- linux 脚本给设备节点权限,[Linux] I2C设备读写及文件节点创建
- 20145309信息安全系统设计基础第3周学习总结
- Codeforces Round #267 Div2 C George and Job --DP
- 雅虎将于4月底关闭自助式广告测试
- myelcipse和maven搭建项目
- filezilla 共享多个目录_filezilla设置中文,3步搞定filezilla中文设置
- 双向板受力特点_弹性减震球形钢支座/双向弹簧铰支座特性
- while和do-while的区别
- ROS2暑期学校 ROS2 Summer School 2022-转-
- [ 常用工具篇 ] burpsuite_pro 安装配置详解(附安装包)
- pycharm中.ui文件跨包路径转.py文件
- 图解Blash数集题解
- php跨站刷票,解析PHP跨站刷票的实现代码
- 171204之条件查询总结
- PXIe背板 全混合8槽 4 Link架构 系统带宽14GB/s 单槽4GB/s
- 接线端子名PH,XH,ZH的区别
- 教你用友T+如何恢复数据的3种方法
- 纵横网络靶场社区-Modbus协议
- 前端uniApp设置手机日历提醒
- 用了 AppiumDriver 后,WebDriverWait 中无法使用 AppiumDriver 特有的方法
热门文章
- python编程输入标准-青少年Python编程能力标准等级模拟考试
- 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
- NVIDIA Jetson Xavier NX设备上使用jtop监控GPU、CPU、内存等的使用
- 导入torchvision出现:AttributeError: module ‘torch.jit‘ has no attribute ‘unused‘错误
- mysql基础sql语句_SQL基础语句汇总
- 用git提交代码时,由于进程加锁,突然崩溃,未来得及解锁,导致其他进程访问不了...
- log4j.xml 简介
- MyEclipse 设置字体
- Unix 时间表示方式与windows时间表示方式相互转换的解决办法
- 如何做一个好的互联网老板(二)