我正在尝试对源自教程的一些非常简单的Hibernate代码进行原型设计,并且在cglib2中遇到了我不了解的错误(完整的堆栈跟踪位于本文的结尾)。我可能正在尝试根据我的简单 main() 和bean XML(如下)创建“ productBoProxy” 。
我尝试了许多不同版本的cglib都无济于事。我非常感谢能帮助我找到解决此问题的正确方法的任何人。
App.java :
ApplicationContext appContext = new ClassPathXmlApplicationContext( "resources/config/BeanLocations.xml" ); ... productBo = ( ProductBo ) appContext.getBean( "productBoProxy" ); productBo.save( product, 100 );
Product.xml :
... <!-- This is a proxy factory bean; see App.java --> <bean id="productBoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="productBo" /> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> ...
堆栈跟踪:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: \ Error creating bean with name 'productBoProxy': \ FactoryBean threw exception on object creation; nested exception is java.lang.VerifyError: \ class net.sf.cglib.core.DebuggingClassWriter overrides final method visit. \ (IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102) at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1441) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1093) at com.mkyong.App.main(App.java:41) Caused by: java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter \ overrides final method visit.(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at net.sf.cglib.core.AbstractClassGenerator.<init>(AbstractClassGenerator.java:38) at net.sf.cglib.core.KeyFactory$Generator.<init>(KeyFactory.java:127) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:112) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108) at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104) at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69) at org.springframework.aop.framework.Cglib2AopProxy.createEnhancer(Cglib2AopProxy.java:229) at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:171) at org.springframework.aop.framework.ProxyFactoryBean.getProxy(ProxyFactoryBean.java:362) at org.springframework.aop.framework.ProxyFactoryBean.getSingletonInstance(ProxyFactoryBean.java:316) at org.springframework.aop.framework.ProxyFactoryBean.getObject(ProxyFactoryBean.java:242) at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) ... 6 more
您的cglib和ASM版本不匹配。Stacktrace告诉“ net.sf.cglib.core.DebuggingClassWriter覆盖最终方法访问”,换句话说,net.sf.cglib.core.DebuggingClassWriter扩展了org.objectweb.asm.ClassWriter尝试覆盖最终方法访问,这当然会失败。
例如,cglib 2.2.2的MavenDependendy提取了asm 3.3.1,因此这是值得尝试的一种组合。