2011-03-01 16 views
41

मैं अपने JAXWS क्लाइंट का उपयोग कर रहे पते को गतिशील रूप से कैसे बदल सकता हूं? यह क्लाइंट wsimport द्वारा उत्पन्न किया गया था।JAXWS - एंडपॉइंट पता कैसे बदलें

+0

http://stackoverflow.com/questions/649019/how-do-i-specify-host-and-port-when-accessing- देखें ए-वेब-सर्विस-से-जैक्स-डब्ल्यूएस-जेनरेट –

+0

* गतिशील * मतलब * रनटाइम * पर * है? –

+1

देखें http://stackoverflow.com/questions/3569075/jaxws-service-client – McDowell

उत्तर

9

अपाचे सीएक्सएफ का उपयोग कर समस्या हल हो गई।

कोड की केवल दो पंक्तियों के साथ! यहां स्निपेट है:

URL url_wsdl = new URL("http://myserver/myservice?wsdl"); 
Service service = Service.create(url_wsdl, new QName("http://myaddress...", "ServiceName")); 
return service.getPort(MyJAXWSPortClass.class); 
+0

का उपयोग नहीं कर सकता/यह काम करना चाहिए, हालांकि इस तरह की एक नई सेवा वस्तु का निर्माण करना एक अच्छा समाधान नहीं है। यह डब्ल्यूएसडीएल को नए एंडपॉइंट से फिर से पार्स करने का कारण बनता है और यह करना बहुत महंगा है। @ मैकडॉवेल का संदर्भित पोस्ट यह पूछने का सबसे अच्छा तरीका है कि यह पूछा जा रहा है: http://stackoverflow.com/questions/3569075/jaxws-service-client –

+0

@ हेल्टरस्सेलर: सहमत है, लेकिन कुछ स्थितियों में यह कीमत उपेक्षित है, उदाहरण के लिए जब एक एप्लिकेशन को स्टार्टअप पर केवल एक बार इस पोर्ट को मैप करना होगा। –

+0

यह केवल तभी काम करता है जब सर्वर "http: // myserver/myservice? Wsdl" ऑनलाइन हो। यदि आपके पास कई एप्लिकेशन हैं, तो इसका मतलब है कि उन्हें सीधे परिभाषित क्रम में तैनात करना, यह एक समस्या हो सकती है (और चक्रीय निर्भरताओं के मामले में भी असंभव) – GKislin

0

मुझे यकीन नहीं है कि अगर आप wsimport का उपयोग करते हैं तो यह कैसे करें। मेरे पास एक ही समस्या थी, इसलिए मैंने मेरे लिए क्लाइंट कोड बनाने के लिए इंटेलिज आईडीईए (संस्करण 9) का उपयोग किया। यह एक सेवा एंडपॉइंट कन्स्ट्रक्टर प्रदान करता है जो wsdl url में लेता है।

+0

मैं wsimport का उपयोग कर समाधान ढूंढ रहा हूं। Intellij IDEA –

82

आप बाइंडिंगप्रोवाइडर इंटरफ़ेस का उपयोग करके इसे प्राप्त कर सकते हैं।

JAX-WS custom endpoint

/** 
* The following snippets shows how to set a custom endpoint for a JAX-WS generated WebClient on runtime 
*/ 

// Get the service and the port 
SampleService service = new SampleService(); 
Sample port = service.getESamplePort(); 

// Use the BindingProvider's context to set the endpoint 
BindingProvider bp = (BindingProvider)port; 
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://www.aviramsegal.com/ws/sample"); 

/* Optional credentials */ 
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "user"); 
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "password"); 
port.callSampleMethod(); 
+0

क्या संपूर्ण सेवा के लिए एंडपॉइंट पता सेट करना संभव है, न कि प्रत्येक विधि के लिए अलग-अलग? – T3rm1

+1

सेवा के लिए यह परिवर्तन, पोर्ट ऑब्जेक्ट को कैश करें और जितनी बार चाहें उतनी बार इसका उपयोग करें –

+0

यह वही है जो मुझे पसंद है जैसे कभी-कभी wsdl सर्वर पक्ष पर उपलब्ध नहीं है। – havexz

0

मैं पेपैल एकीकरण के लिए नया हूँ, मैं अनुकूली भुगतान एपीआई के बारे में निश्चित नहीं हूँ। लेकिन हमें यह जांचने का विशेषाधिकार है कि क्या विशिष्ट ईमेल आईडी पेपैल में खाता है या का उपयोग नहीं कर रहा है GetVerifiedStatus विधि।

ईमेल को सत्यापित करने के लिए नीचे दिए गए सैंडबॉक्स wsdl URL का उपयोग करें

यूआरएल: https://svcs.sandbox.paypal.com/AdaptiveAccounts?wsdl

प्रतिक्रिया की तरह नीचे

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ns2:GetVerifiedStatusResponse xmlns:ns2="http://svcs.paypal.com/types/aa"> 
     <responseEnvelope> 
      <timestamp>2015-07-20T23:42:46.661-07:00</timestamp> 
      <ack>Success</ack> 
      <correlationId>5cea9a8575ab9</correlationId> 
      <build>17345626</build> 
     </responseEnvelope> 
     <accountStatus>UNVERIFIED</accountStatus> 
     <countryCode>IN</countryCode> 
     <userInfo> 
      <emailAddress>[email protected]</emailAddress> 
      <accountType>PERSONAL</accountType> 
      <accountId>6KD7EVWM2E2AQW</accountId> 
      <name> 
       <salutation/> 
       <firstName>anand</firstName> 
       <middleName/> 
       <lastName>anand</lastName> 
       <suffix/> 
      </name> 
      <businessName/> 
     </userInfo> 
     </ns2:GetVerifiedStatusResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

नोट होगा: जबकि ठूंठ बनाने के रूप में नीचे अंत बिंदु सेट करने के लिए भूल गया नहीं है । अगर हम इसे सेट नहीं कर रहे हैं, तो हमें अपेक्षित आउटपुट नहीं मिल सकता है। जोड़ने के लिए विधि नीचे

String endpointURL = "https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus"; 

उपयोग endpoint

private static void addEndPoint(AdaptiveAccountsPortType port, 
      String endpointURL) { 
     BindingProvider bp = (BindingProvider)port; 
     bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); 

     /*List hchain = bp.getBinding().getHandlerChain(); 
     if (hchain == null) { 
      hchain = new ArrayList(); 
     } 
     hchain.add(new HTTPUserAgentHandler()); 
     bp.getBinding().setHandlerChain(hchain);*/ 
    } 
संबंधित मुद्दे