2014-09-08 7 views
6

मैं एक ऐसे वर्ग का एक सिंगलटन उदाहरण बनाना चाहता हूं जो जर्सी में संसाधन या सेवा के रूप में शामिल नहीं है और फिर भी इसकी निर्भरता जर्सी सर्विसलोकेटर से इंजेक्शन दी जाएगी।जर्सी 2.12 में HK2 ServiceLocator कैसे प्राप्त करें?

मैं अपने ResourceConfig निर्माता में मैन्युअल रूप से इस वर्ग के रजिस्टर कर सकते हैं, ResourceConfig तो में ग्रिजली कारखाने विधि के लिए इतना की तरह पारित कर दिया है:

ResourceConfig resourceConfig = new DeviceServiceApplication(); 

LOGGER.info("Starting grizzly2..."); 
return GrizzlyHttpServerFactory.createHttpServer(BASE_URI, 
               resourceConfig, mServiceLocator); 

समस्या यह है कि रहता है कैसे जर्सी ServiceLocator के लिए एक संदर्भ पाने के लिए है इसलिए मैं अपनी ऑब्जेक्ट को इंजेक्शन वाले इंजेक्शन के साथ बनाने के लिए createAndInitialize() को कॉल कर सकता हूं। मैं पिछले जर्सी संस्करणों में देखता हूं वहां कन्स्ट्रक्टर वेरिएंट थे जो एक एप्लीकेशन हैंडलर की अपेक्षा करते हैं, जो निश्चित रूप से सेवा लोकेटर तक पहुंच प्रदान करता है (मैं कैसे शुरू करता हूं कि यह एक और मामला है)। आप यह भी देख सकते हैं कि मैंने अभिभावक सेवा लोकेटर में गुजरने का प्रयास किया है, लेकिन निश्चित रूप से संकल्प बच्चे -> अभिभावक लोकेटर से होता है और दूसरी दिशा में नहीं होता है, इसलिए मेरे ऑब्जेक्ट के लिए माता-पिता से पूछना विफल रहता है क्योंकि जर्सी @ कंट्रैक्ट और @ सेवा प्रकार नहीं हैं यहां दिखाई दे रहा है।

क्या मुझे GrizzlyHttpServerFactory के अलावा कुछ और उपयोग करने की आवश्यकता है? क्या मैं अपनी सिंगलटन की निर्भरताओं को छोड़ देता हूं और मैन्युअल रूप से तार करता हूं?

उत्तर

12

मैं ContainerLifecycleListener पंजीकृत करके ServiceLocator का संदर्भ प्राप्त करने में सक्षम था।

onStartup(Container container) विधि में, container.getApplicationHandler().getServiceLocator() पर कॉल करें।

यह उदाहरण संदर्भ को ResourceConfig के सदस्य चर के रूप में संग्रहीत करता है जिसे आप किसी अन्य एक्सेसर के माध्यम से उपयोग कर सकते हैं।

class MyResourceConfig extends ResourceConfig 
{ 
    // won't be initialized until onStartup() 
    ServiceLocator serviceLocator; 

    public MyResourceConfig() 
    { 
     register(new ContainerLifecycleListener() 
     { 
      public void onStartup(Container container) 
      { 
       // access the ServiceLocator here 
       serviceLocator = container.getApplicationHandler().getServiceLocator(); 

       // ... do what you need with ServiceLocator ... 
       MyService service = serviceLocator.createAndInitialize(MyService.class); 
      } 

      public void onReload(Container container) {/*...*/} 
      public void onShutdown(Container container) {/*...*/} 
     }); 
    } 

    public ServiceLocator getServiceLocator() 
    { 
     return serviceLocator; 
    } 
} 

तो कहीं:

MyService service 
    = myResourceConfig.getServiceLocator().createAndInitialize(MyService.class); 
+0

इस एक ही रास्ता है? क्या कोई और तरीका है ? कंटेनर लाइफसाइकिल तक पहुंचना एक ओवरकिल की तरह लगता है। धन्यवाद – Architucas

+0

एक अन्य वैकल्पिक समाधान है: https://stackoverflow.com/questions/21149161/jersey-and-hk2-servicelocator/21998307#21998307 – ozhan

+0

संसाधन कॉन्फ़िगरेशन क्या है? और 'myResourceConfig.getServiceLocator() 'को छोड़कर इस वर्ग को कब बुलाया जा रहा है? –

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