2010-08-26 16 views
5

दोनों के रूप में लागू किया गया है, मैं एक मौजूदा जावा प्रोजेक्ट में @ ट्रांस्सेन्शनल एनोटेशन के माध्यम से स्प्रिंग घोषणात्मक लेनदेन जोड़ने की प्रक्रिया में हूं।स्प्रिंग @ ट्रांसेक्शनल को गतिशील जेडीके प्रॉक्सी और एक पहलू पहलू

जब मैं किसी समस्या (इस प्रश्न से संबंधित नहीं) में भाग गया, तो मैंने पूर्ण डीबग लॉगिंग चालू कर दी। मजे की बात है, मैं निम्नलिखित देखा:

 
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 प्रॉक्सी का उपयोग कर लेन-देन समर्थन), डिफ़ॉल्ट लात चाहिए:

उत्तर

8

अजीब, ऐसा लगता है कि आप इस विन्यास है लगता है में (प्रॉक्सी मोड)। लेकिन एनोटेशन ट्रांज़ेक्शनएस्पेक्ट पहलू मोड द्वारा उपयोग किया जाने वाला सटीक पहलू है।

+1

आपका जवाब दिया मुझे यह देखने के लिए मोड = "पहलू" जोड़ने का विचार है कि यह कैसे काम करेगा। ऐसा लगता है कि अब यह अपेक्षा की तरह काम करता है - इसमें कोई गतिशील प्रॉक्सी शामिल नहीं है और पहलू लेनदेन प्रबंधक इंजेक्शन प्राप्त करता है। दिलचस्प। – waxwing

+0

मुझे लगता है कि आपने मुझे दर्द का _lot_ बचाया है। यह मेरे लिए तय है और मैं हमेशा के लिए चारों ओर पोक किया होगा मुझे यह जवाब नहीं मिला था! –

+1

बस इसमें भी भाग गया। उस लॉग स्टेटमेंट के बजाय WARN पर बहुत अच्छा होगा। यदि आप जावा कॉन्फ़िगर का उपयोग करते हैं, तो इसका उपयोग करें: '@EnableTransactionManagement (मोड = AdviceMode.ASPECTJ) ' –

2

जावा कॉन्फ़िगरेशन के साथ काम कर रहे पहलू लेनदेन प्राप्त करने के लिए।

@EnableWebMvc 
@Configuration 
@ComponentScan("com.yourdomain") 
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ) 
public class ApplicationConfig extends WebMvcConfigurerAdapter { 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

     //... 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 

     JpaTransactionManager bean = new JpaTransactionManager(entityManagerFactory().getObject()); 
     return bean ; 
    } 

    @Bean 
    public AnnotationTransactionAspect annotationTransactionAspect() { 

     AnnotationTransactionAspect bean = AnnotationTransactionAspect.aspectOf(); 
     bean.setTransactionManager(transactionManager()); 
     return bean; 
    } 
} 

आप Maven उपयोग कर रहे हैं:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.7</version> 
    <configuration> 
     <aspectLibraries> 
      <aspectLibrary> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <complianceLevel>1.8</complianceLevel> 
     <source>1.8</source> 
     <target>1.8</target> 
     <showWeaveInfo>true</showWeaveInfo> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>compile</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

आप ग्रहण का उपयोग कर रहे हैं, तो यह सुनिश्चित करेंगे कि बुनाई किया जाता है जब ग्रहण अंदर की तैनाती:

http://www.eclipse.org/ajdt/

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