gpt4 book ai didi

java - Spring Transaction - 代理困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:45 26 4
gpt4 key购买 nike

 <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 创建事务建议以在保存方法上执行。

所以根据我的理解,它应该只为 SampClass 创建一个代理。

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

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

我得到以下异常:

java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy118 at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer .java:446) at net.sf.cglib.transform.TransformingClassGenerator. generateClass(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 中删除 Autowiring /扫描,并使用 setter 通过 XML 注入(inject)依赖项。

另一种选择是通过声明 <context:load-time-weaver/> 在任何地方使用加载时间编织并添加所需的 jar 。

也看看这个 post , 通常最好只使用一种方式在整个应用程序中应用方面,以避免这个问题。

关于java - Spring Transaction - 代理困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com