दोनों के रूप में लागू किया गया है, मैं एक मौजूदा जावा प्रोजेक्ट में @ ट्रांस्सेन्शनल एनोटेशन के माध्यम से स्प्रिंग घोषणात्मक लेनदेन जोड़ने की प्रक्रिया में हूं।स्प्रिंग @ ट्रांसेक्शनल को गतिशील जेडीके प्रॉक्सी और एक पहलू पहलू
जब मैं किसी समस्या (इस प्रश्न से संबंधित नहीं) में भाग गया, तो मैंने पूर्ण डीबग लॉगिंग चालू कर दी। मजे की बात है, मैं निम्नलिखित देखा:
17:47:27,834 DEBUG HibernateTransactionManager:437 - Found thread-bound Session [[email protected]] for Hibernate transaction 17:47:27,845 DEBUG HibernateTransactionManager:470 - Participating in existing transaction 17:47:27,865 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'updateUserProfile' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' 17:47:27,875 DEBUG AnnotationTransactionAspect:321 - Skipping transactional joinpoint [se.myservice.UserService.updateUserProfile] because no transaction manager has been configured
कुछ डिबगिंग के बाद, मुझे पता चला है कि पहले तीन लॉग प्रविष्टियों, जहां यह कहना है कि वह एक धागा बाध्य सत्र पाया और कहा कि लेन-देन उपयोग कर रहा है, पर एक JdkDynamicAopProxy द्वारा निर्मित है मेरी उपयोगकर्ता सेवा कक्षा।
अंतिम लॉग संदेश हालांकि खतरनाक लग रहा है। इसे विधि निष्पादन से पहले एक जॉइंटपॉइंट पर बुलाया जाता है। AnnotationTransactionAspect के स्रोत को देखते समय, यह कोई संदेश लेनदेन प्रबंधक सेट होने पर यह संदेश उत्पन्न करता है। इस मामले में, क्योंकि वसंत इस पहलू पर कभी भी निर्भरता इंजेक्शन नहीं करता है।
ऐसा लगता है कि लेनदेन के दो अलग-अलग "शैलियों" दोनों लागू होते हैं: गतिशील प्रॉक्सी, और पहलू। केवल लेन-देन से संबंधित विन्यास मेरे पास है:
<tx:annotation-driven transaction-manager="txManager" />
हम परियोजना में AspectJ उपयोग कर रहे हैं, लेकिन कोई AnnotationTransactionAspect मेरी aop.xml में पंजीकृत पहलू है। हम वसंत 3.0.2.RELEASE का उपयोग कर रहे हैं।
क्या मुझे इससे चिंतित होना चाहिए? क्या वसंत मेरे लिए इस पहलू को पंजीकृत करता है? क्या मुझे AspectJ का उपयोग करते समय annotation-driven
का उपयोग नहीं करना चाहिए?
<tx:annotation-driven
transaction-manager="transactionManager" mode="aspectj" />
के बाद से अपने config एक विधा विशेषता नहीं है (AspectJ, नहीं JDK प्रॉक्सी का उपयोग कर लेन-देन समर्थन), डिफ़ॉल्ट लात चाहिए:
आपका जवाब दिया मुझे यह देखने के लिए मोड = "पहलू" जोड़ने का विचार है कि यह कैसे काम करेगा। ऐसा लगता है कि अब यह अपेक्षा की तरह काम करता है - इसमें कोई गतिशील प्रॉक्सी शामिल नहीं है और पहलू लेनदेन प्रबंधक इंजेक्शन प्राप्त करता है। दिलचस्प। – waxwing
मुझे लगता है कि आपने मुझे दर्द का _lot_ बचाया है। यह मेरे लिए तय है और मैं हमेशा के लिए चारों ओर पोक किया होगा मुझे यह जवाब नहीं मिला था! –
बस इसमें भी भाग गया। उस लॉग स्टेटमेंट के बजाय WARN पर बहुत अच्छा होगा। यदि आप जावा कॉन्फ़िगर का उपयोग करते हैं, तो इसका उपयोग करें: '@EnableTransactionManagement (मोड = AdviceMode.ASPECTJ) ' –