2011-12-21 43 views
9

में एक बंडल से ओएसजीआई सेवाएं प्राप्त करना मैं दिन सीक्यू का उपयोग कर रहा हूं। मैं फ़ेलिक्स कंसोल में उपलब्ध कनेक्शन पूल का उपयोग करके SQL सर्वर डीबी में कुछ डेटा स्टोर करना चाहता हूं। मैं एक JSP से ऐसा कर सकते हैं, प्रकार SlingScriptHelper defineObjects में परिभाषित की "गोफन" वस्तु का उपयोग करके को टैगस्लिंग/सीक्यू

sling.getService(DataSourcePool.class). 

हालांकि, मैं ग्राहक से अनुरोधों को हैंडल करने एक सर्वलेट एक OSGi बंडल में बनाया का उपयोग करना चाहते। सर्वलेट में defineObjects टैग नहीं है, इसलिए "स्लिंग" ऑब्जेक्ट परिभाषित नहीं किया गया है। मुझे अपने सर्वलेट में एक वैध स्लिंगस्क्रिप्टहेल्पर ऑब्जेक्ट बनाने का कोई तरीका नहीं दिख रहा है, लेकिन ऐसा लगता है कि यह संभव होना चाहिए।

क्या कोई तरीका है?

उत्तर

17

जावा ओएसजीआई घटक से सेवा प्राप्त करने के लिए आपको स्लिंगस्क्रिप्टहेल्पर की आवश्यकता नहीं है, तो आप या तो BundleContext.getService (...) विधि का उपयोग कर सकते हैं या एससीआर एनोटेशन का उपयोग एससीआर को आपके घटक में सेवा इंजेक्ट करने के लिए कर सकते हैं।

एक उदाहरण के लिए, आप उदाहरण के लिए ConfirmedOrdersObserver class इस तरह से SlingRepository हो जाता है कैसे स्लिंग के Slingbucks sample उपयोग एससीआर एनोटेशन में कुछ घटकों पर देख सकते हैं, के रूप में:

@Reference 
    private SlingRepository repository; 

कि इन टिप्पणियों को संभालती Maven प्लगइन के लिए http://felix.apache.org/site/apache-felix-maven-scr-plugin.html देखें ।

+0

मैं एससीआर एनोटेशन दृष्टिकोण का उपयोग करने में सक्षम था। हालांकि, मुझे बंडल कॉन्टेक्स्ट का उदाहरण कैसे मिलेगा? वह कुछ था जिसे मैं समझने में सक्षम नहीं था। – joelt

+0

मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह सक्रिय() या शायद बाइंड() विधियों का उपयोग करके किया जा सकता है। – joelt

+2

सक्रिय (..) में और निष्क्रिय (..) एक osgi घटक कॉन्टेक्स्ट ऑब्जेक्ट ले लो। इस ओबीजे से आप बंडल कॉन्टेक्स्ट प्राप्त कर सकते हैं। बर्ट्रैंड संकेत के रूप में आपको बंडल संदर्भ वस्तु की आवश्यकता नहीं होनी चाहिए; आपको बस अपने ऑब्जेक्ट में डीसीएस को अपनी ऑब्जेक्ट्स को तुरंत चालू करने की आवश्यकता है (जो स्लिंग सेवा है)। – empire29

7

आप #getServiceReference और #getService विधियों का उपयोग करके सेवा प्राप्त करने के लिए BundleContext का उपयोग कर सकते हैं। उदाहरण के लिए, यदि आप ResourceResolverFactory में रुचि रखते थे, तो आप यह इतना की तरह हो सकता है:

BundleContext bundleContext = FrameworkUtil.getBundle(MyClass.class).getBundleContext(); 
ServiceReference factoryRef = bundleContext.getServiceReference(ResourceResolverFactory.class.getName()); 
ResourceResolverFactory resolverFactory = (ResourceResolverFactory) bundleContext.getService(factoryRef); 
+0

मैंने अपने बंडल घटक में सेवाओं को जोड़ने के लिए @ रेफरेंस एनोटेशन का उपयोग करने का प्रयास किया। किसी कारण से संदर्भ शून्य थे। स्पष्ट रूप से सेवाओं को प्राप्त करने के लिए, मेरे बंडल के निर्माता में उपरोक्त इस कोड का उपयोग करके, चाल चल रही थी। धन्यवाद :) –

+0

धन्यवाद! @ संदर्भ ने मुझे "संसाधन संशोधित त्रुटि नहीं" फेंक दिया। यह काम किया! – Jakolcz

0

YourClass obj = this.getSlingScriptHelper() getService (yourclass.class);।

obj.whatever();