您的位置:首页 > 编程语言 > Java开发

Spring Boot 使用AOP切换多数据源时,被@Transactional注解的方法会抛异常

2017-06-26 00:00 1561 查看
如题,根据 https://my.oschina.net/yejunxi/blog/916555 配置多数据源后,使用AOP切换数据源

在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