2010-02-10 13 views
7
<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> 

यह नमूना वसंत संदर्भ फ़ाइल का हिस्सा है। मैं सहेजने के तरीके पर निष्पादित करने के लिए SampClass के लिए एक लेनदेन सलाह बनाने की कोशिश कर रहा हूं।वसंत लेनदेन - प्रॉक्सी भ्रम

तो मेरी समझ से इसे केवल SampClass के लिए प्रॉक्सी बनाना चाहिए।

मेरे पास SearchDispatchRpcGwtServlet है जो एक webservice क्लाइंट के तर्क के रूप में लेता है जो स्वयं में प्रॉक्सी भी है। यह बीन किसी कारण से प्रॉक्सी हो रहा है जहां यह विफल रहता है क्योंकि यह प्रॉक्सी की प्रॉक्सी नहीं बना सकता है।

मुझे यह जोड़ना होगा कि SearchDispatchRpcGwtServletSampClass का एक उदाहरण बनाता है और सहेजने की विधि को कॉल करता है।

मैं निम्न अपवाद प्राप्त करें:

java.lang.IllegalArgumentException: अंतिम वर्ग वर्ग net.sf.cglib.proxy.Enhancer.generateClass (बढ़ाने जावा में $ Proxy118 उपवर्ग नहीं कर सकता: 446) 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) 
+0

क्या हम स्टैक ट्रेस के अधिक देख सकते हैं? जो आपने हमें दिया है वह वास्तव में पर्याप्त नहीं है। – skaffman

+0

मैं इस मुद्दे को और विस्तार से समझाऊंगा। मेरे पास बीन ए के लिए परिभाषित एक एप पॉइंटकट है। मेरे पास बीन बी को संदर्भ फ़ाइल में बीन ए के बाद परिभाषित किया गया है। जो मैं कल्पना करता हूं उससे केवल बीन एक प्रॉक्सी बनाई जानी चाहिए। लेकिन इस मामले में बीन बी प्रॉक्सी भी बनाई गई है जिसमें एक वेबसाइव क्लाइंट प्रॉक्सी एक बहस के रूप में शामिल है। क्या यह एक वैध व्यवहार है। क्या मैं इससे बचने के लिए कुछ कर सकता हूं। मतलब एओपी केवल निर्दिष्ट बीन प्रॉक्सी होगा। – nagl

+0

मैंने स्टैक ट्रेस – nagl

उत्तर

1

AbstractAutoProxyCreator का एक उपवर्ग एक सेम प्रॉक्सी के लिए कोशिश कर रहा है, लेकिन वह पहले से ही अपने आप में एक सेम CGLIB प्रॉक्सी ऐसे aop:config proxy-target-class="true के रूप में एक और तंत्र का उपयोग कर बनाया है।

इससे बचने के लिए, एक ही बीन के लिए विभिन्न पहलू बुनाई तंत्र (प्रॉक्सीबीन फैक्ट्री और एओपी: कॉन्फ़िगरेशन) को मिलाकर बचना सुनिश्चित करें।

इस मामले में लेनदेन पहलुओं को के माध्यम से @Transactional एनोटेशन के माध्यम से भी बुनाया जा सकता है।

वैकल्पिक रूप से बीन से ऑटोवॉयरिंग/स्कैन को निकालना संभव है और सेटर्स का उपयोग करके एक्सएमएल के माध्यम से निर्भरताओं का इंजेक्शन करना संभव होगा।

एक और विकल्प <context:load-time-weaver/> घोषित करके और जरूरी जार जोड़कर हर समय लोड समय बुनाई का उपयोग करना है।

इस post पर भी एक नज़र डालें, यह सामान्य है कि इस समस्या से बचने के लिए पूरे एप्लिकेशन में पहलुओं को लागू करने का केवल एक ही तरीका उपयोग करना बेहतर होगा।

+2

ऑटोवॉयरिंग कोई प्रॉक्सी नहीं बना रहा है। –

+0

'सार तत्वऑटवायर कैपेबलबीन फैक्ट्री' जो जावाडोक के मुताबिक तारों (ऑटोवॉयरिंग समेत) प्रदान करता है, एक बीन प्रोसेसर के माध्यम से एक सीजीआईएलबी प्रॉक्सी बनाने की कोशिश कर रहा है, यह स्टैकट्रैक –

+3

में नहीं है ... नहीं, * AbstractAutoProxyCreator * का उप-वर्ग * बनाने का प्रयास कर रहा है प्रॉक्सी। यह पोस्ट प्रोसेसर शायद एओपी कॉन्फ़िगरेशन द्वारा पंजीकृत किया जा रहा है। तथ्य यह है कि स्टैक ट्रेस पर * सार तत्वऑटवायर कैपेबलबीन फैक्टरी * समस्या के लिए बहुत अप्रासंगिक है। Autowiring और घटक स्कैन proxying के लिए सुविधाओं का unconnected सेट है। –

संबंधित मुद्दे