2016-08-18 11 views
5

मेरे पास दो संसाधन सर्वर हैं: जिनके पास अधिसूचना ईमेल करने के लिए एक एपीआई है और एक निर्धारित कार्य चलाता है। जब एक निर्धारित कार्य शुरू होता है, तो मैं उपयोगकर्ताओं को सूचित करने के लिए ईमेल सेवा पर कॉल करना चाहता हूं कि उनका कार्य शुरू हो रहा है। दोनों सेवाएं प्रमाणीकरण के लिए OAuth2 का उपयोग करती हैं। Get tokenमैं निर्धारित समय में OAuth2RestTemplate का उपयोग कैसे कर सकता हूं?


Call service

इसे पूरा करने के मैं वसंत बूट का उपयोग कर रहा स्प्रिंग सुरक्षा के साथ: निर्धारित कार्य सेवा ग्राहक साख की स्थापना की है, ताकि वह यह पेश करके पहुंच टोकन प्राप्त कर सकते हैं ग्राहक साख है OAuth2। ईमेल सेवा में कॉल करने के लिए कार्य सेवा में OAuth2RestTemplate है। जब निर्धारित कार्य समाप्त हो जाता है और OAuth2RestTemplate का उपयोग करने का प्रयास करता है, तो यह OAuth2ClientContext को एक सैसन-स्कोप्ड बीन के रूप में प्राप्त करने का प्रयास करता है। जाहिर है, यह एक नहीं ढूंढ रहा है क्योंकि मैं अनुरोध थ्रेड में निष्पादित नहीं कर रहा हूं, मैं पृष्ठभूमि कार्य धागे में काम कर रहा हूं।

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
    'scopedTarget.oauth2ClientContext': Scope 'session' is not active for the current thread; 
    consider defining a scoped proxy for this bean if you intend to refer to it 
    from a singleton 

जब से मैं प्रणाली करने वाली प्रणाली प्रमाणीकरण के लिए स्थिर ग्राहक क्रेडेंशियल्स का उपयोग कर रहा हूँ, मैं अपने आप पहुंच टोकन को संभालने के लिए सत्र-दायरे वाले डेटा का उपयोग करने के लिए एक अच्छा कारण नहीं दिख रहा है: मैं इस अपवाद मिलता है। मैं एक सिंगलटन OAuth2ClientContext बीन होना पसंद करूंगा कि कोई भी धागा OAuth2RestTemplate के माध्यम से अनुरोध करने के लिए उपयोग कर सकता है।

मैं इसे कैसे कॉन्फ़िगर कर सकता हूं?

+0

मुझे कुछ ऐसा करने की ज़रूरत है - एक क्वार्ट्ज शेड्यूलर को नौकरी का आह्वान करने की आवश्यकता है जो ओएथ 2 संरक्षित आरईएसटी सेवा तक पहुंच जाएगा। मैं उपयोगकर्ता नाम/पासवर्ड आधारित OAuth2 प्रवाह का उपयोग नहीं कर सकता लेकिन क्लाइंट आईडी आधारित प्रवाह का उपयोग नहीं कर सकता। क्या आप अपना कोड साझा कर सकते हैं? या मदद करें? – sunitkatkar

उत्तर

4

यह बहुत आसान साबित हुआ। मैं एक सिंगलटन सेम चाहता था, इसलिए मैं एक सिंगलटन सेम बनाया:

@Primary 
@Bean 
public OAuth2ClientContext singletonClientContext() { 
    return new DefaultOAuth2ClientContext(); 
} 
कि मेरे @Configuration कक्षा में साथ

, स्प्रिंग मेरी OAuth2RestTemplate करने के लिए यह तार और मेरे अनुसूचित कार्य ईमेल सेवा को कॉल करने में सक्षम थे। अच्छे उपाय के लिए, मैंने यह सुनिश्चित करने के लिए @Primary एनोटेशन जोड़ा है कि इस बीन को स्प्रिंग बूट द्वारा बनाए गए किसी भी चीज़ पर प्राथमिकता दी गई थी (सुनिश्चित नहीं है कि यह आवश्यक है)।

+0

आपको 'प्राथमिक' की आवश्यकता नहीं है। एक "सामान्य" बीन बूट के ऑटो-कॉन्फ़िगर किए गए समकक्ष को बंद करने के लिए पर्याप्त है (इसमें एक होना चाहिए)। –

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

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