Spring Boot 使用AOP切换多数据源时,被@Transactional注解的方法会抛异常
2017-06-26 00:00
1561 查看
如题,根据 https://my.oschina.net/yejunxi/blog/916555 配置多数据源后,使用AOP切换数据源
在service层使用注解@Transactional后,调用该方法会抛异常
原因是没有在事务前切换到对应数据源,使用Order注解,提高优先级
然而并没有用。
在http://blog.csdn.net/catoop/article/details/50575038 的回复中看到问题所在
如果我没猜错的话,你用的是SpringMVC。你仔细DEBUG一下,你是不是 aop:aspectj-autoproxy 和 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 都配置了。
aop:aspectj-autoproxy 实际上使用的是 AnnotationAwareAspectJAutoProxyCreator ,导致同一个类被代理了2次。而 DefaultAdvisorAutoProxyCreator 在前,所以会出现开启事务在切换数据源之前。解决这个问题就可以了。
原来只是之前集成shiro时候会配置DefaultAdvisorAutoProxyCreator,造成二次代理。
把shiro中该配置删除即可。。。
在service层使用注解@Transactional后,调用该方法会抛异常
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx数据库.xx表' doesn't exist
原因是没有在事务前切换到对应数据源,使用Order注解,提高优先级
@Order(-10)
然而并没有用。
在http://blog.csdn.net/catoop/article/details/50575038 的回复中看到问题所在
如果我没猜错的话,你用的是SpringMVC。你仔细DEBUG一下,你是不是 aop:aspectj-autoproxy 和 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 都配置了。
aop:aspectj-autoproxy 实际上使用的是 AnnotationAwareAspectJAutoProxyCreator ,导致同一个类被代理了2次。而 DefaultAdvisorAutoProxyCreator 在前,所以会出现开启事务在切换数据源之前。解决这个问题就可以了。
原来只是之前集成shiro时候会配置DefaultAdvisorAutoProxyCreator,造成二次代理。
@Bean public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator daap = new DefaultAdvisorAutoProxyCreator(); daap.setProxyTargetClass(true); return daap; }
把shiro中该配置删除即可。。。
相关文章推荐
- Spring Boot中使用AOP统一处理web层异常的方法
- SpringBoot AOP方式实现多数据源切换的方法
- spring 使用aop注解版会抛出奇怪的异常的解决方法
- 在程序内部利用注解对一些方法做动态数据源切换(所有数据源已交给spring)
- (十一)Spring Boot整合Mybatis使用druid实现多数据源自动切换
- Spring Boot 中使用 @Transactional 注解配置事务管理
- 使用Spring AOP结合自定义Java注解实现动态数据源设置
- spring-boot+aop实现多数据源切换
- spring boot 基础之使用AOP统一处理请求日志使用方法
- Spring AOP 使用注解的方式实现用户日志的两种方法
- SpringBoot开发详解(六)-- 异常统一管理以及AOP的使用
- 使用Spring Boot的AOP处理自定义注解
- springboot Aop 方法拦截、注解拦截
- 让spring3.0可以使用aop注解的方法是导入两个jar包aspectjrt.jar aspectjweaver.jar
- SpringBoot项目中使用AOP的方法
- java基于spring注解AOP的异常处理的方法
- 使用Spring注解AOP(基于自定义注解和包下拦截方法)
- 使用注解自动切换Spring不同数据源
- spring boot 注解方式配置多数据源与使用
- Spring boot(20) Spring /Spring boot使用AOP、强制使用cglib(以记录方法耗时为例子)