Spring Jersey Mybatis Aop transaction事务失效解决方案SpringManagedTransaction will not be managed by Spring
2018-01-03 22:14
781 查看
整个项目的框架是Spring + Jersey + Mybatis, 事务是用Aop做的,不是用注解的形式,一直报这样的错误:
在网上找了很多方案,发现都没解决我的事务问题:
http://www.codingpedia.org/ama/restful-web-services-example-in-java-with-jersey-spring-and-mybatis/
http://powertech.iteye.com/blog/2312452
https://www.cnblogs.com/dingchenghong/p/4858552.html
上面的资料都试过了,用注解的形式,单独跑过第一个项目是可以的,但是我现在是维护原来的项目,如果把以前的项目都改成注解的形式,工作量也是够大,所以还是要用Aop事务来处理,我的项目大致结构是:
service 接口
serviceImpl 接口实现类,实现接口,所有类上都加有@Servcie和@Path的注解
dao 接口
application.xml文件扫描所有的类
spring-mybatis.xml 数据源事务配置
刚开始配置文件是这样的,发现不管怎么试都不可以,还用
这个排除怀疑是service的重复扫描问题,还试了说是必须用@Component不能用@Service,来源:https://stackoverflow.com/questions/21104567/springjersey-transactional-annotation/24554236#24554236
但还是没有解决问题,还看来mybatis-spring的源码:
SpringManagedTransaction.java:
DataSourceUtils.java:
TransactionSynchronizationManager.java
发现通过Key,没有找到value
后来仔细看以前的配置文件,发现所有的事务都绑定在接口上了,我这里的事务要绑定在接口实现类上面,于是改成:
测试之后发现,还是不行,按照上面的思路,另外单独试验一个项目,就是把所有serviceImpl的实现接口的接口继承关系去掉,就是只有实现类serviceImpl,尽然发现奇迹成功了,于是想到之前有接触过proxy-target-class这个属性,当时记不太清,就是接口或者类的代理吧,于是查看资料,发现:
proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。首先说明下proxy-target-class=”true”和proxy-target-class=”false”的区别,为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用,proxy-target-class在spring事务、aop、缓存这几块都有设置,其作用都是一样的
茅塞顿开,于是把配置文件改成:
居然大功告成了,先总结到,会继续补齐解决方案!
事务信息如下:
DEBUG: org.mybatis.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionHandle{url=jdbc:postgresql://localhost/mypro, user=mypro, debugHandle=null, lastResetAgoInSec=92, lastUsedAgoInSec=92, creationTimeAgoInSec=92}] will not be managed by Spring
在网上找了很多方案,发现都没解决我的事务问题:
http://www.codingpedia.org/ama/restful-web-services-example-in-java-with-jersey-spring-and-mybatis/
http://powertech.iteye.com/blog/2312452
https://www.cnblogs.com/dingchenghong/p/4858552.html
上面的资料都试过了,用注解的形式,单独跑过第一个项目是可以的,但是我现在是维护原来的项目,如果把以前的项目都改成注解的形式,工作量也是够大,所以还是要用Aop事务来处理,我的项目大致结构是:
service 接口
serviceImpl 接口实现类,实现接口,所有类上都加有@Servcie和@Path的注解
dao 接口
application.xml文件扫描所有的类
spring-mybatis.xml 数据源事务配置
<aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.*.*(..))" /> </aop:config>
刚开始配置文件是这样的,发现不管怎么试都不可以,还用
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
这个排除怀疑是service的重复扫描问题,还试了说是必须用@Component不能用@Service,来源:https://stackoverflow.com/questions/21104567/springjersey-transactional-annotation/24554236#24554236
但还是没有解决问题,还看来mybatis-spring的源码:
SpringManagedTransaction.java:
private void openConnection() throws SQLException { this.connection = DataSourceUtils.getConnection(this.dataSource); this.autoCommit = this.connection.getAutoCommit(); this.isConnectionTransactional = isConnectionTransactional(this.connection, this.dataSource); if (this.logger.isDebugEnabled()) { this.logger.debug( "JDBC Connection [" + this.connection + "] will" + (this.isConnectionTransactional ? " " : " not ") + "be managed by Spring"); } }
DataSourceUtils.java:
public static boolean isConnectionTransactional(Connection con, DataSource dataSource) { if (dataSource == null) { return false; } ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); return (conHolder != null && connectionEquals(conHolder, con)); }
TransactionSynchronizationManager.java
public static Object getResource(Object key) { Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key); Object value = doGetResource(actualKey); if (value != null && logger.isTraceEnabled()) { logger.trace("Retrieved value [" + value + "] for key [" + actualKey + "] bound to thread [" + Thread.currentThread().getName() + "]"); } return value; }
发现通过Key,没有找到value
后来仔细看以前的配置文件,发现所有的事务都绑定在接口上了,我这里的事务要绑定在接口实现类上面,于是改成:
<aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.impl.*.*(..))" /> </aop:config>
测试之后发现,还是不行,按照上面的思路,另外单独试验一个项目,就是把所有serviceImpl的实现接口的接口继承关系去掉,就是只有实现类serviceImpl,尽然发现奇迹成功了,于是想到之前有接触过proxy-target-class这个属性,当时记不太清,就是接口或者类的代理吧,于是查看资料,发现:
proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。首先说明下proxy-target-class=”true”和proxy-target-class=”false”的区别,为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用,proxy-target-class在spring事务、aop、缓存这几块都有设置,其作用都是一样的
茅塞顿开,于是把配置文件改成:
<aop:config proxy-target-class="true"> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.xxxx.xx.service.impl.*.*(..))" /> </aop:config>
居然大功告成了,先总结到,会继续补齐解决方案!
事务信息如下:
2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization> 2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization> 2018-01-03 22:12:12,144 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40]> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40]> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCommit synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering beforeCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b]> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Initiating transaction commit> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7]> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7]> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4]> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4]> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,145 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Committing JDBC transaction on Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b]> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCommit synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,146 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Triggering afterCompletion synchronization> 2018-01-03 22:12:12,209 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40] after transaction> 2018-01-03 22:12:12,209 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@930981891 wrapping com.mysql.jdbc.JDBC4Connection@6d8a1a40] after transaction> 2018-01-03 22:12:12,219 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4] after transaction> 2018-01-03 22:12:12,219 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1974184653 wrapping com.mysql.jdbc.JDBC4Connection@5c2d12c4] after transaction> 2018-01-03 22:12:12,223 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7] after transaction> 2018-01-03 22:12:12,223 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1092608611 wrapping com.mysql.jdbc.JDBC4Connection@615fb0b7] after transaction> 2018-01-03 22:12:12,225 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b] after transaction> 2018-01-03 22:12:12,225 DEBUG [org.springframework.jdbc.datasource.DataSourceTransactionManager] - <Releasing JDBC Connection [HikariProxyConnection@1838470215 wrapping com.mysql.jdbc.JDBC4Connection@2cb7107b] after transaction>
相关文章推荐
- mybatis+spring JDBC Connection will not be managed by Spring
- will not be managed by Spring 和was not registered for synchronization because synchronization is not
- XXX will not be managed by spring
- spring管理hibernate事务报异常--Transaction not successfully started解决方法
- process will not be tolerated by
- Auto property synthesis will not synthesize property ‘delegate’;it will be implemented by its superc
- MyBatis报错-org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer
- Auto property synthesis will not synthesizeproterty;it will be implemented by its superclass, use@dy
- 报错原因:Auto property synthesis will not synthesize property 'title'; it will be implemented by its sup
- org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;错误解决:
- org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer
- Core file limit is 0; core dumps will be not be written for server crashes 解决方案
- mybatis-spring整合过程错误:org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang
- Auto property synthesis will not synthesize property ‘delegate’;it will be implemented by its superc
- 解决方案---git add .时 警告warning: LF will be replaced by CRLF
- auto property synthesis will not synthesize proterty ;it will be implementedby its superclass, use @
- 关于spring boot整合mybatis使用oracle数据库出现could not load:oracle.jdbc.driver.OracleDriver问题的终极解决方案
- 使用Spring(13)Spring与MyBatis整合(二)DataSourceTransactionManage把事务控制在Service层
- windows下使用git出现 warning: LF will be replaced by CRLF in git/.gitignore. 解决方案
- Springboot+Mybatis+Maven+Oracle+Cassandra+事务(Aop)+定时任务实现