经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题
来源:jb51  时间:2021/8/4 17:55:41  对本文有异议

Spring JPA 使用@transaction注解时产生CGLIB代理冲突

在使用JPA进行数据库的删除操作时需要使用@Transactional注解来支持事物:

  1. @Modifying
  2. @Transactional
  3. @Query(" delete from FollowerInfo " +
  4. " where crmAuth = :crmAuth and investUserId = :invUserId")
  5. void deleteByCrmAuthAndInvUserId(@Param("crmAuth") String crmAuth, @Param("invUserId") Long invUserId);

但是,在添加了如上方法后,测试服务启动失败。

查看日志报错如下:

  1. Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  2. at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
  3. at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
  4. at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
  5. at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
  6. at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
  7. at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
  8. at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57)
  9. at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:202)
  10. ... 38 more
  11. [2017-02-09 10:56:33 ERROR] [localhost-startStop-1] (org.springframework.web.context.ContextLoader:331) - Context initialization failed
  12. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adviserCommFollowerServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ounersc.ic.adviser.repository.community.AdviserCommFollowerRepository com.ounersc.ic.adviser.service.impl.AdviserCommFollowerServiceImpl.adviserCommFollowerRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adviserCommFollowerRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy52]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  13. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
  14. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1204)
  15. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
  16. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
  17. at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
  18. at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229)
  19. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
  20. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
  21. at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:725)
  22. at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
  23. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
  24. at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
  25. at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
  26. at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
  27. at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4738)
  28. at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
  29. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  30. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
  31. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
  32. at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  33. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  34. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  35. at java.lang.Thread.run(Thread.java:745)
  36. Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ounersc.ic.adviser.repository.community.AdviserCommFollowerRepository com.ounersc.ic.adviser.service.impl.AdviserCommFollowerServiceImpl.adviserCommFollowerRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adviserCommFollowerRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy52]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  37. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:555)
  38. at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
  39. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
  40. ... 22 more
  41. Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adviserCommFollowerRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy52]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  42. at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)
  43. at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1512)
  44. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:313)
  45. at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
  46. at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1081)
  47. at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1006)
  48. at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:904)
  49. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:527)
  50. ... 24 more
  51. Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy52]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  52. at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212)
  53. at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)
  54. at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:445)
  55. at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:331)
  56. at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:291)
  57. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
  58. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1713)
  59. at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:113)
  60. ... 31 more
  61. Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy52
  62. at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
  63. at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
  64. at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
  65. at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
  66. at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
  67. at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
  68. at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57)
  69. at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:202)
  70. ... 38 more
  71. 09-Feb-2017 10:56:33.145 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
  72. 09-Feb-2017 10:56:33.145 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors

org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy52]: Common causes of this problem include using a final class or a non-visible class

对于此异常,这篇帖子中讲到了产生该异常的原因,但是未给出解决办法。

http://stackoverflow.com/questions/20063320/springmvc-proxy-issue

简单来说,原因主要是代理冲突:Spring 早期的版本,要用com.sun.proxy的代理 ,而 jpa如果加了@transaction 注解后 需要用CGLIB的代理

因此产生了冲突

解决办法:

Spring 已经在高版本中修复了该问题,把Spring从4.0升级到4.2.5后,问题解决:

在pom.xml加入:

  1. <properties>
  2. <spring.framework.version>4.2.5.RELEASE</spring.framework.version>
  3. </properties>

Spring 启用CGLIB解决事物代理失败

问题描述:

接口A提供公用的CRUD 操作,抽象类B实现接口A,接口C提供各模型特有的相关数据库操作。

类D继承抽象类B实现接口C如果使用JDK动态代理,Spring会将类D向上转型为接口C,那么在使用中必须注入接口A。

如果注入类D的类型。会报错说代理类型XX无法转换为类D的类型。

解决办法如下:

  1. <bean id="transactionManagerCMS"
  2. class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  3. <property name="sessionFactory" ref="mySessionFactory" />
  4. <property name="dataSource" ref="dataSourceCMS" />
  5. </bean>
  6. <!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean
  7. below) -->
  8. <tx:advice id="txAdvice" transaction-manager="transactionManagerCMS">
  9. <!-- the transactional semantics... -->
  10. <tx:attributes>
  11. <tx:method name="*" />
  12. </tx:attributes>
  13. </tx:advice>
  14. <!-- ensure that the above transactional advice runs for any execution of
  15. an operation defined by the FooService interface -->
  16. <aop:config proxy-target-class="true">
  17. <aop:pointcut id="fooServiceOperation"
  18. expression="execution(* com.harvest.smartHotels.info.dao.serviceContent.interfaces.*.*(..))" />
  19. <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" />
  20. </aop:config>

动态代理使用CGLIB,这样注入类型就可以使类D。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号