2011-02-04 15 views
5

मेरे कस्टम प्रमाणीकरण प्रदाता में, मैं अपने सेवा एपीआई के माध्यम से डोमेन ऑब्जेक्ट प्राप्त करने में सक्षम था, लेकिन जब मैं एक डोमेन ऑब्जेक्ट से दूसरे डोमेन में क्रॉल करता था ताकि अतिरिक्त चेक करने के लिए कुछ मूल्य प्राप्त हो सके, वसंत शिकायत हाइबरनेट सत्र मौजूद नहीं है: -लेनदेन के साथ वसंत सुरक्षा कस्टम प्रमाणीकरण प्रदाता लपेटना

domain.getAnotherDomain().getProperty(); // epic FAIL 

मैं निम्नलिखित AOP लेन-देन लेन-देन के साथ सभी अपने प्रोजेक्ट एपीआई रैप करने के लिए है, और मुझे यकीन है कि मेरे कस्टम प्रमाणीकरण प्रदाता निम्नलिखित पैटर्न में गिर जाता है कर रहा हूँ: -

<tx:advice id="txAdvice"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:advisor pointcut="execution(* my.project..*.*(..))" advice-ref="txAdvice" /> 
</aop:config> 

मेरे पास OpenSessionInView फ़िल्टर भी कॉन्फ़िगर किया गया है, लेकिन मुझे नहीं लगता कि वसंत सुरक्षा पर लागू होता है।

मुझे लगता है कि मैं सभी आवश्यक चेक करने के लिए एक विशिष्ट सेवा API बना सकता हूं, लेकिन मुझे उत्सुकता है कि मैं अपने कस्टम प्रमाणीकरण प्रदाता को उचित लेनदेन के साथ क्यों लपेट नहीं पा रहा हूं।

कोई स्पष्टीकरण? धन्यवाद।

उत्तर

2

मेरा वर्कअराउंड समाधान मेरे कस्टम प्रमाणीकरण प्रदाता में आलसी लोडिंग त्रुटियों से बचने के लिए चेक करने के लिए एक सेवा API बनाने के लिए है।

1

स्प्रिंग शिकायत हाइबरनेट सत्र मौजूद नहीं है

नहीं काफी यकीन है कि मैं अपने सभी सवाल का पालन करें, लेकिन मैं ऊपर बयान अपने मुख्य समस्या है, है ना का प्रतिनिधित्व करता है लगता है? आप किसी भी स्टैकट्रेस प्रदान नहीं किया है, लेकिन मुझे लगता है इस कुख्यात "कोई सत्र या सत्र बंद कर दिया", परिदृश्य के विशिष्ट तुम सिर्फ वर्णित है:।

domain.getAnotherDomain() getProperty(); // महाकाव्य विफल

शायद मैं कुछ याद कर रहा हूँ, लेकिन मुझे लगता है कि ठेठ जवाब यहाँ भी लागू होता है: fetch=FetchType.EAGER के साथ अपने संबंधों के नक्शे, ताकि आप आलसी लोड यह की जरूरत नहीं है जब सत्र पहले से ही है बन्द है।

+0

अपवाद संदेश 'भूमिका के संग्रह को आलसी रूप से शुरू करने में विफल रहा है: ss.domain, कोई सत्र या सत्र बंद नहीं था'। मैं पूर्ण रूप से आवश्यक होने तक उत्सुक fetching प्रदर्शन नहीं करना पसंद करता हूं ... यानी, अगर मैं कस्टम प्रमाणीकरण प्रदाता कक्षा को लपेटने के लिए लेनदेन प्राप्त करता हूं। – limc

+0

ठीक है, अगर आपने एक सत्र में 'डोमेन' लोड किया है, तो आप किसी अन्य सत्र में 'डोमेन' से आलसी रूप से 'किसी अन्य डोमेन' को लोड नहीं कर पाएंगे। मुझे यकीन नहीं है कि यह आपका मामला होगा, हालांकि (यह आपके प्रश्न से मुझे स्पष्ट नहीं है)। लेकिन अगर आप हमेशा उत्सुक लोडिंग नहीं करना चाहते हैं, तो आप Fetch प्रोफाइल का उपयोग करने पर विचार कर सकते हैं, लेकिन आप जानते हैं कि कभी-कभी आपको आवश्यकता होती है। – jpkrohling

0

मैं इस मुद्दे पर भाग गया, और कारण यह था कि मेरे पास OpenSessionInView वेब.xml फ़ाइल में फ़िल्टर से पहले घोषित स्प्रिंग सिक्योरिटी का फ़िल्टर था। एक बार मैंने उन्हें बदल दिया, समस्या दूर चली गई।

इसका कारण यह है कि OpenSessionInView फ़िल्टर द्वारा हाइबरनेट सत्र खोले जाने से पहले वसंत सुरक्षा को बुलाया जा रहा है, और इसलिए कोई सत्र खोला नहीं गया था।

0

आपने कोई कोड नहीं पोस्ट किया है जो हमें कोई सार्थक सुझाव देने देगा।

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

उदाहरण retreiveUser से AbstractUserDetailsAuthenticationProvider लिए

। इस विधि को उदाहरण के भीतर से बुलाया जाता है (विधि प्रमाणीकृत करें) और इसलिए एओपी प्रॉक्सी तंत्र के माध्यम से लेनदेन को प्रारंभ नहीं किया जा सकता है।अधिक जानकारी के लिए @Transactional method calling another method without @Transactional anotation?

वसंत घोषणात्मक लेनदेन मॉडल एओपी प्रॉक्सी का उपयोग करता है। इसलिए एओपी प्रॉक्सी लेनदेन के निर्माण के लिए ज़िम्मेदार है। एओपी प्रॉक्सी केवल तभी सक्रिय होगी जब उदाहरण के साथ विधियों को उदाहरण के बाहर से बुलाया जाता है।

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