2013-03-14 176 views
1

我想將我們的項目從AspectJ切換到Spring AOP。我們使用Spring AOP支持的AspectJ註釋和方法執行點削減。我們在編譯時編織方面沒有問題,但我們試圖擺脫不必要的構建步驟。Spring AOP和ClassNotFoundException:org.springframework.core.convert.converter.ConvertingComparator

我已將 添加到我們的Spring配置文件中,並從我們的pom.xml中刪除了weaver插件。其結果是一個非常奇怪的錯誤,這似乎是唯一的(即谷歌不知道這件事):

19:05:19,213 ERROR [org.springframework.web.context.ContextLoader] (MSC service thread 1-4) Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.config.internalAutoProxyCreator': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/core/convert/converter/ConvertingComparator 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:734) [spring-context-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:457) [spring-context-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) [spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294) [spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [spring-web-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:3392) [jbossweb-7.0.13.Final.jar:] 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:3850) [jbossweb-7.0.13.Final.jar:] 
    at org.jboss.as.web.deployment.WebDeploymentService.start(WebDeploymentService.java:90) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) 
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) [classes.jar:1.6.0_43] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) [classes.jar:1.6.0_43] 
    at java.lang.Thread.run(Thread.java:680) [classes.jar:1.6.0_43] 
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/core/convert/converter/ConvertingComparator 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:162) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    ... 20 more 
Caused by: java.lang.NoClassDefFoundError: org/springframework/core/convert/converter/ConvertingComparator 
    at org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory.<clinit>(ReflectiveAspectJAdvisorFactory.java:74) [spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.<init>(AnnotationAwareAspectJAutoProxyCreator.java:53) [spring-aop-3.2.1.RELEASE.jar:3.2.1.RELEASE] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [classes.jar:1.6.0_43] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [classes.jar:1.6.0_43] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [classes.jar:1.6.0_43] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [classes.jar:1.6.0_43] 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) [spring-beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] 
    ... 22 more 
Caused by: java.lang.ClassNotFoundException: org.springframework.core.convert.converter.ConvertingComparator from [Module "deployment.api-0.1.0-SNAPSHOT.war:main" from Service Module Loader] 
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423) 
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398) 
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120) 
    ... 29 more 

這些都是我們的配置文件:

爲spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <import resource="classpath:spring/*.xml"/> 

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"> 
     <property name="defaultLocale" value="en"/> 
    </bean> 

    <context:annotation-config/> 
    <context:component-scan base-package="xyz.censored"/> 
    <mvc:annotation-driven/> 
</beans> 

彈簧dao.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.springframework.org/schema/beans" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <bean id="propertyPlaceholderConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:spring/jdbc.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driver_class}"/> 
     <property name="url" value="${jdbc.url}?characterEncoding=UTF-8"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
    </bean> 

    <!-- Hibernate is used as JPA vendor --> 
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="generateDdl" value="true"/> 
     <property name="showSql" value="true"/> 
     <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/> 
    </bean> 

    <!-- Entity manager --> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/> 
     <property name="packagesToScan" value="xyz.censored"/> 
    </bean> 

    <!-- Configure transaction management --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/> 

    <jpa:repositories base-package="xyz.censored"/> 
</beans> 

彈簧aspects.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 

     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 

    <context:spring-configured/> 
    <aop:aspectj-autoproxy/> 

    <bean id="stringTranslationInterceptor" class="xyz.censored.aspects.StringTranslationInterceptor"/> 

    <bean id="translationAspect" class="xyz.censored.aspects.TranslationAspect"> 
     <property name="translationInterceptors"> 
      <map key-type="java.lang.String" value-type="xyz.censored.aspects.TranslationInterceptor"> 
       <entry key="java.lang.String" value-ref="stringTranslationInterceptor"/> 
      </map> 
     </property> 
    </bean> 
</beans> 

什麼問題?我卡住了。 :(

編輯:

partlov建議擺脫春季的其他版本的我被明確排除一些依賴這樣做唯一的例外是現在沒有了,但前者的AspectJ方面是由春忽略。我的配置有什麼問題嗎?

+1

看起來你有不同版本的Spring模塊,其中一些是3.1.4和一些3.2.1。在岸上,你在春天的所有部分使用相同的版本。 – partlov 2013-03-14 18:23:50

+0

我已經手動排除了一些3.1.4版本化的依賴關係(很奇怪,具有版本3.2.1的Spring工件取決於具有版本3.1.4的其他工件,但這是另一個故事)。例外消失,但未找到/使用/應用方面。 :(配置文件是否有問題(標籤的順序,錯誤的標籤,缺少的標籤,...)? – 2013-03-14 18:44:00

回答

2

這個錯誤似乎是由於彈簧模塊的不同版本造成的,請確保您在pom.xml中爲不同的彈簧模塊使用了相同的彈簧版本。 spring-web,spring-webmvc,spring-aop應該有相同的spring版本,讓我知道這是否解決了你的問題,否則發佈你的pom.xml文件e進一步分析。

+0

是的,我相信它是問題的根源,無論如何它解決了我的問題。 – 2017-01-27 17:34:00

0

錯誤java.lang.NoClassDefFoundError:org/springframework/core/convert/converter/ConvertingComparator是因爲你的jar中有org.springframework.core.convert.converter.convertingComparator實際上沒有爲它定義類。嘗試下載具有ConvertingComparator並再次運行的那個jar的不同版本