2012-12-31 10 views
9

मैंने here वर्णित गुइस विधि-स्तर लेनदेन का उपयोग करना शुरू कर दिया है। मेरे पासGuice @Transactional एक लेनदेन शुरू नहीं करता है

@Inject 
private EntityManager entityManager; 

@Transactional 
public UserSession createSession(User user, String browser) { 
    UserSession session = new UserSession(user, browser); 
    entityManager.persist(session); 
} 

संक्षिप्त विवरण से मुझे लगता है कि बुद्धि पर्याप्त होना चाहिए। लेकिन मुझे एक त्रुटि मिलती है क्योंकि कोई लेनदेन शुरू नहीं हुआ है। यह केवल तभी काम करता है जब मैं इसे अपने आप शुरू करता हूं और प्रतिबद्ध करता हूं।

ऑब्जेक्ट को प्रारंभिक में मेरे एप्लिकेशन के प्रारंभ पर गुइस द्वारा बनाया गया है। प्रत्येक अनुरोध के लिए एक ही इंस्टेंस का उपयोग किया जाता है।

यह क्यों काम नहीं कर रहा है?

उत्तर

6

@Transactional विधि एनोटेशन AOP के माध्यम से काम करते हैं, जिसमें Guice एक प्रॉक्सी उद्देश्य यह है कि उन एनोटेट विधि कॉल को बीच में रोक और (वैकल्पिक) उन्हें वास्तविक वस्तु को यहां पर अग्रेषित बनाकर Foo के लिए एक अनुरोध को पूरा। सुनिश्चित करें कि निम्न सत्य हैं करें:

  1. आप Guice के माध्यम से @Transactional विधि के साथ वस्तु बनाया है, के बाद से Guice अन्यथा बजाय प्रॉक्सी प्रदान करने के लिए कोई मौका नहीं होगा।

  2. न तो कक्षा और न ही विधि final चिह्नित है, क्योंकि एओपी उन आसानी से ओवरराइड नहीं कर सकता है।

  3. आपने JpaPersistModule, या PersistModule के किसी अन्य रूप को स्थापित किया है। उस स्रोत कोड से नोट करें कि यह मॉड्यूल वास्तव में MethodInterceptor को @Transactional एनोटेशन से जोड़ता है।

यदि यह वास्तव में अपनी आवश्यकताओं फिट नहीं करता है, याद है कि आप हमेशा अपनी खुद की विधि इंटरसेप्टर लिखने के AOP documentation साथ जा सकते हैं। सौभाग्य!

+0

"न तो ऑब्जेक्ट और न ही विधि को अंतिम रूप दिया गया है" यह नहीं होना चाहिए "न तो * कक्षा * और न ही विधि को अंतिम चिह्नित किया गया है"? –

+0

यूप, दिमाग की पर्ची। फिक्स्ड। –

2

सबकुछ फिर से जांचने के बाद यह काम नहीं किया। मजाकिया हिस्सा यह है कि यह बीच में काम करता है, लेकिन केवल हर सौ बार।

कुछ अतिरिक्त परीक्षणों के बाद मुझे पता चला कि मुझे प्रत्येक अनुरोध पर कक्षाओं को फिर से बनाने की आवश्यकता है। इससे पहले कि मैंने उन्हें एप्लिकेशन शुरू करने से पहले बनाया था। अब यह पूरी तरह से काम करता प्रतीत होता है।

युक्तियों के लिए धन्यवाद ने मुझे इसकी जांच करने में मदद की।

0

मैं निम्नलिखित स्थिति में इस समस्या थी, तो मैं, सोचा था कि मैं यहाँ मेरी समाधान पोस्ट होता भी: MyDao, जो मैं सैद्धांतिक रूप से guice से मिल सकता है, और किसी अन्य वस्तु:

BusinessLogic दो निर्माता तर्क की आवश्यकता है कि मैं गुना से प्राप्त कर सकता था।
इसलिए मैंने BusinessLogicProvider (extends AbstactProvider) बनाया, लेकिन इसका उपयोग bind(BusinessLogic.class).toProvider(BusinessLogicProvider) के साथ नहीं किया जाता है)। अब मैं सिर्फ BusinessLogicProvider किसी भी guice पाओ के प्रकार की तरह बाँध: bind(BusinessLogicProvider.class);

मेरी BusinessLogicProvider वर्ग के अंदर मैं अब, एक private Provider<MyDao> daoProvider;

बाद में @Inject उपयोग कर सकते हैं BusinessLogicProvider के public BusinessLogic get() विधि में, मैं तो BusinessLogic कॉल कर सकते हैं दो तर्कों के साथ कन्स्ट्रक्टर आवश्यक: daoProvider.get() और अन्य ऑब्जेक्ट मैं गुइस से नहीं प्राप्त कर सकता।

ख़तरा : जब @Inject एड मेरी BusinessLogicProvider की private Provider<MyDao> daoProvider; के प्रकार Provider<MyDao> नहीं है (लेकिन प्रकार MyDao की simpy), यह काम नहीं करेगा।
भले ही @Inject एड MyDao गुना से आए हैं, तो हर बार जब आप BusinessLogic को तत्काल बनाते हैं तो आपको एक नया निर्माण करने की आवश्यकता होती है।

1

मुझे आपकी तरह की समस्या थी और इसे @ javax.transaction से स्विच करके हल किया गया था। @ Com.google.inject.persistrransalal.ransactional। स्पष्ट रूप से Guice-Persist Java Transaction API से @Transactional एनोटेशन का समर्थन नहीं करता है।

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