Spring Transaction - 代理混淆

2024-03-25

 <tx:advice id="txAdvice" transaction-manager="jtaTxManager">
  <tx:attributes>
   <tx:method name="*" />
  </tx:attributes>
 </tx:advice>

 <aop:config proxy-target-class="true">
  <aop:pointcut id="fooServiceOperation"
   expression="execution(* x.y.SampClass.save(..))" />
  <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation" />
 </aop:config>

 <bean id="Samp1" class=" x.y.SampClass"></bean>

        <bean id="SearchDispatchRpcGwtServlet" class="x.y.server.SearchDispatchRpcGwtServlet">
  <constructor-arg>
       <list>
         <ref bean="webServiceClient"/>                          
       </list>
  </constructor-arg>      
 </bean>

 <!-- Service Clients --> 
 <bean id="webServiceClient" class="x.y.KSBClientProxyFactoryBean">
  <property name="serviceEndpointInterface" value="x.y.service.WebService" />
  <property name="serviceQName" value="{http://x.y.org/wsdl/organization}WebService" />
 </bean>

这是示例 spring 上下文文件的一部分。我正在尝试创建交易建议SampClass在 save 方法上执行。

所以根据我的理解,它应该创建一个代理SampClass only.

我有一个SearchDispatchRpcGwtServlet它以 Web 服务客户端作为参数,该客户端本身也是一个代理。由于某种原因,该 bean 也会被代理,但由于无法创建代理的代理而失败。

我必须补充一点SearchDispatchRpcGwtServlet创建一个实例SampClass并调用保存方法。

我得到以下异常:

java.lang.IllegalArgumentException: 无法子类化最终类 $Proxy118 在 net.sf.cglib.proxy.Enhancer.generateClass(增强器 .java:446) 在 net.sf.cglib.transform.TransformingClassGenerator。 生成类(TransformingClassGenerator.java:33)

我不明白为什么SearchDispatchRpcGwtServlet正在创建代理。有人可以解释一下吗。

添加堆栈跟踪

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class $Proxy117]: 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 $Proxy117
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:473)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:348)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:309)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.postProcessObjectFromFactoryBean(AbstractAutowireCapableBeanFactory.java:1427)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport$1.run(FactoryBeanRegistrySupport.java:139)
    ... 85 more
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy117
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)

的一个子类AbstractAutoProxyCreator正在尝试代理一个 bean,但该 bean 本身已经是使用另一种机制创建的 CGLIB 代理,例如aop:config proxy-target-class="true.

为了避免这种情况,请确保避免为同一个 bean 混合不同的方面编织机制(ProxyBeanFactory 和 aop:config )。

在这种情况下,交易方面也可以通过<tx:annotation:driven/>通过@Transactional注解。

或者,可以从 bean 中删除自动装配/扫描,并使用 setter 通过 XML 注入依赖项。

另一种选择是通过声明在各处使用加载时编织<context:load-time-weaver/>并添加所需的罐子。

也看看这个post http://forum.spring.io/forum/spring-projects/aop/54520-mixing-jdk-and-cglib-proxies,通常最好在整个应用程序中仅使用一种应用方面的方式,以避免出现此问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Transaction - 代理混淆 的相关文章

随机推荐