spring依赖问题2 (很麻烦的问题)

众所周知, spring是一个你们族, 稍有不慎, 就有人罢工, 里面的模块依赖出现问题html

简单的还好, 复杂的, 真得找半天啊抓狂java

下面说一个, 今天遇到和解决的问题. 吐舌头spring



程序启动出现这样的错误警告:spa

nested exception is java.lang.NoSuchMethodError: org.springframework.aop.config.AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(Lorg/springframework/beans/factory/xml/ParserContext;Ljava/lang/Object;)

通过查看spring4源码, 这个方法确实不存在 (存在同名, 可是参数类型不一样的方法)

可是spring3存在, 已经标明为Deprecatedcode



网上找了半天, 各类方法都试了, 不行xml

就是一个过期的方法啊, 如今好了, 必需要用到这个方法 (当时认为问题在这里)htm


后来发现, 只要在spring配置文件里面 去掉 tx:annotation-driven , 就不会出现这个问题了blog


我首先尝试了 使用 本身编写 aop 的advice 和 pointcut 来解决 :get

源码

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

改成

<tx:advice id="jpaAdvice" transaction-manager="transactionManager" />
	<aop:config>
		<aop:advisor advice-ref="jpaAdvice" pointcut="within(XXX.db.service..*)" />
	</aop:config>


运行报这个问题

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deviceDao': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.transaction.interceptor.TransactionInterceptor.setTransactionManagerBeanName(Ljava/lang/String;)V


我觉得没解决问题, 继续找方法, 仍是没找到



后来尝试黑科技, 直接覆盖spring的这个类 org.springframework.aop.config.AopNamespaceUtils

加上了我须要的方法

registerAutoProxyCreatorIfNecessary(org.springframework.beans.factory.xml.ParserContext, java.lang.Object)
(方法从spring3拷贝而来)

结果运行, 仍是这个错误

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'deviceDao': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.springframework.transaction.interceptor.TransactionInterceptor.setTransactionManagerBeanName(Ljava/lang/String;)V


我就明白了, 错误不在最开始的地方, 而是在这里

我使用IDEA 查找类 :

org.springframework.transaction.interceptor.TransactionInterceptor
结果有两个!!!



这应该高度注意了, 确定是冲突才有两个同一类名的

1 spring-tx 有须要的方法 (在父类)

2 spring-dao 里面, 是没有须要的方法

通过检查, 发现不当心将spring-dao 加进来了, spring-dao 覆盖 spring-tx

删掉spring-dao依赖, 问题解决大哭