2011-10-07 5 views
5

हमारे पास ऐसी स्थिति है जहां हम अपने स्टैंड-अलोन जावा 6 अनुप्रयोगों को कॉन्फ़िगर करने के लिए जेएसआर-330 आधारित इंजेक्शन का उपयोग करते हैं, जो सभी परतों में कॉन्फ़िगरेशन पैरामीटर प्राप्त करने के लिए बहुत अच्छी तरह से काम करता है ।जावा में जेएक्स-डब्ल्यूएस के साथ गिस 3 का उपयोग करना 6 वेब कंटेनर के बाहर

हमने वेब कंटेनर के अंदर जावा 5 के साथ पहले स्टैंड-अलोन मेट्रो वितरण का उपयोग करके थोड़ी देर के लिए जेएक्स-डब्लूएस वेब सेवाओं का भी उपयोग किया है, लेकिन जावा 6 के साथ हम केवल छोटे पदचिह्न प्राप्त करने के लिए एंडपॉइंट क्लास का उपयोग करते हैं। कोई सर्वलेट कंटेनर (जेट्टी, बिलाव)

  • एक Guice 3 इंजेक्टर सेट अप के रूप में मुझे यह पसंद है -

    तो अब मैं एक स्थिति है जहाँ मैं

    • एक स्टैंड-अलोन जावा 6 आवेदन होता है।
    • एक Endpoint मेरी @javax.jws.WebService एनोटेटेड क्लास को संभालने जो वेब सेवाओं के रूप में मेरी विधियों का खुलासा करता है।

    मैं वेब सेवा विधियों को या तो उनके @ इंजेक्ट फ़ील्ड को पारदर्शी रूप से संभालने के लिए, या इंजेक्टर तक पहुंच प्राप्त करना चाहता हूं। मैं इसे मुख्य विधि से स्थिर क्षेत्र के रूप में पकड़ सकता हूं, लेकिन मुझे क्लीनर समाधान चाहिए।

    कोई सुझाव?

    (मैं JAX-WS and Guice 3 से समझते हैं कि http://jax-ws-commons.java.net/guice/ मॉड्यूल Guice 3 के साथ काम नहीं करता है, और वैकल्पिक हल का सुझाव दिया बिलाव विशिष्ट है)

    JSR-250 @Resource एनोटेशन यहाँ उपयोगी होगा?

  • +0

    यह कार्यान्वयन वस्तु में एक प्रदाता इंजेक्शन लगाने के रूप में मैं करता हूँ द्वारा पता चला कि मैं अब के लिए प्राप्त कर सकते हैं गहरा घोंसला इंजेक्शन की जरूरत नहीं है। बाउंटी ने मुझे यह महसूस करने के लिए सम्मानित किया। –

    उत्तर

    5

    मुझे यकीन नहीं है कि मैं हर सवाल के बारे में समझ गया हूं। यह +500 बक्षीस के लिए बहुत आसान लग रहा है। अगर आप ऐसा नहीं कर रहे हैं तो कृपया कुछ कोड पोस्ट करें।

    वैसे भी

    , एक सरल उपाय है जो निर्भरता इंजेक्शन के साथ एक वेब सेवा बनाता है:

    final Module module = new HelloModule(); 
    final Injector injector = Guice.createInjector(module); 
    final HelloService helloService = injector.getInstance(HelloService.class); 
    
    Endpoint.publish("http://localhost:8080/helloService", helloService); 
    

    classpath स्कैनिंग (Reflections) के साथ एक और अधिक परिष्कृत समाधान नीचे JAX-WS Guice integration से मार्कस एरिकसन के कोड के आधार पर। यह Endpoint.publish() के साथ एक webservice के रूप में @GuiceManaged के साथ एनोटेटेड सभी कक्षाओं को प्रकाशित करता है।

    private void initGuicedWebservices(final String packageNamePrefix) 
         throws Exception { 
        final Reflections reflections = new Reflections(packageNamePrefix); 
        final Set<Class<?>> guiceManaged = 
         reflections.getTypesAnnotatedWith(GuiceManaged.class); 
        for (final Class<?> clazz : guiceManaged) { 
         doGuice(clazz); 
        } 
    } 
    
    private void doGuice(final Class<?> clazz) throws Exception { 
        final GuiceManaged guiceManagedAnnotation = 
         clazz.getAnnotation(GuiceManaged.class); 
    
        final Injector injector = createInjector(guiceManagedAnnotation); 
    
        final Object serviceObject = clazz.newInstance(); 
        injector.injectMembers(serviceObject); 
    
        final String address = guiceManagedAnnotation.address(); 
    
        Endpoint.publish(address, serviceObject); 
    } 
    
    private Injector createInjector(final GuiceManaged guiceManagedAnnotation) 
         throws Exception { 
        final Class<? extends Module>[] moduleClasses = 
         guiceManagedAnnotation.module(); 
    
        final List<Module> moduleInstances = new ArrayList<Module>(); 
        for (final Class<? extends Module> moduleClass : moduleClasses) { 
         moduleInstances.add(moduleClass.newInstance()); 
        } 
    
        return Guice.createInjector(moduleInstances); 
    } 
    

    GuiceManaged एनोटेशन:

    @Retention(RUNTIME) 
    @Target(TYPE) 
    @Documented 
    public @interface GuiceManaged { 
        public Class<? extends Module>[] module(); 
        public String address(); 
    } 
    

    और HelloServiceImpl टुकड़ा:

    @GuiceManaged(module = HelloModule.class, 
        address = "http://localhost:8080/helloService") 
    @WebService 
    public class HelloServiceImpl implements HelloService { 
    
        @Inject // bound in HelloModule 
        public GreetingsService greetingsService; 
    
        @Override 
        @WebMethod 
        public String sayHello(final String name) { 
         return greetingsService.sayHello(name); 
        } 
    } 
    
    +1

    आपके उत्तर पर कुछ चिंतन करने के बाद, मुझे एहसास हुआ कि एंडपॉइंट तंत्र कोई नया नहीं करता है, लेकिन बस @WebMethod एनोटेटेड विधि को कॉल करें। इसका मतलब यह है कि मैं अभी उदाहरण के लिए प्रदाताओं को इंजेक्शन देकर प्राप्त कर सकता हूं। हमेशा के रूप में, कुछ प्रश्न केवल तब तक कठिन होते हैं जब तक आप यह नहीं जानते कि इसे कैसे किया जाए। –

    +1

    इसके अलावा मैं अक्सर एक प्रश्न पर ध्यान आकर्षित करने के लिए 500 बिंदु बक्षीस का उपयोग करता हूं। अगर दूसरों को प्रश्न सरल और उत्तर छोटा लगता है, तो यह मेरे साथ ठीक है। –

    0

    आपको AbstractMultiInstanceResolver एक्सटेंशन बिंदु का उपयोग करने की आवश्यकता है।

    एनोटेशन GuiceManaged एनोटेशन बनाएं; AbstractMultiInstanceResolver

    public class GuiceManagedInstanceResolver extends AbstractMultiInstanceResolver { 
        private T instance=null; 
        public GuiceManagedInstanceResolver(@NotNull Class clazz) 
        { 
         super(clazz); 
        } 
        public T resolve(@NotNull Packet request) { 
         if(instance==null) 
         { 
          instance=create(); 
          Injector injector= Guice.createInjector(new WebServiceModule()); 
          injector.injectMembers(instance); 
         } 
         return instance; 
        } 
    } 
    

    विस्तार अब आपके व्यापार पद्धति पर विधि स्तर डि के लिए @GuiceManaged & उपयोग @Inject के साथ अपने सेवा पर टिप्पणी करें द्वारा

    public class GuiceManagedFeature extends WebServiceFeature { 
        public static final String ID="FEATURE_GuiceManaged"; 
    
        @FeatureConstructor 
        public GuiceManagedFeature() 
        { 
         this.enabled=true; 
        } 
    
        public String getID() { 
         return ID; 
        } 
    } 
    

    लागू InstanceResolver:

    @Retention(RUNTIME) 
    @Target(TYPE) 
    @Documented 
    @WebServiceFeatureAnnotation(id=GuiceManagedFeature.ID, bean=GuiceManagedFeature.class) 
    @InstanceResolverAnnotation(GuiceManagedInstanceResolver.class) 
    public @interface GuiceManaged { 
    } 
    

    GuiceManagedFeature जो WebServiceFeature है लागू ।

    +0

    क्या आप http://developian.blogspot.com/2008/11/google-guice-and-jax-ws.html से प्रेरित थे? –

    +0

    @ ThorbjørnRavnAndersen हां, लंबे समय से, हमें आपकी तरह की समस्या थी और हमने उस ब्लॉग को संदर्भ के रूप में उपयोग करने का प्रयास किया, फिर हमने Guice-Fruit को Guice 2.x के साथ पाया। –

    +0

    क्या इसका मतलब है कि अब आप गिइस-फ्रूट का उपयोग करते हैं और गुइस 2 के साथ रहना है? –

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