在搭建SSM環境的時候配置了注解事務
<!-- 事務管理器 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
然后啟動項目出現 NoSuchMethod錯誤。根據給出的類路徑找了一下發現有org.springframework.aop.config.AopNamespaceUtils.registerAutoProxyCreatorIfNecessary這個方法在Spring-tx包中。查看調用這個方法出錯的地方是在Spring dao包中的類AnnotationDrivenBeanDefinitionParser。再找這個AnnotationDrivenBeanDefinitionParser類發現有兩個同樣的類定義,一個在Spring-tx里面,一個在Spring-dao里面。
接下來嘗試把Spring-dao包從maven依賴里面注釋掉,啟動成功。這下大概明白是這兩個包沖突了,繼續深入查看源碼發現在TxNamespaceHandler(在Spring tx包里面)中有如下代碼
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
我想是classloader把來自來自Spring dao包中的AnnotationDrivenBeanDefinitionParser給實例化了,從而導致的錯誤。
最后解決辦法,去掉Spring-dao的maven依賴。