2010-08-25 9 views
10

से उत्पन्न एक webservice क्लाइंट पर यूआरएल बदलना मैं एक जावा अनुप्रयोग के लिए एक मॉड्यूल लिखने की कोशिश कर रहा हूं जो डब्लूएसडीएल-वर्णित webservice तक पहुंचता है। स्रोत डब्लूएसडीएल को सीधे एएसपी.NET webservice होने के नाते विश्वास से डाउनलोड किया गया था; सेवा यूआरएल एक .asmx एक्सटेंशन में समाप्त होता है, और ब्राउज़र में सेवा यूआरएल देखने से एक लिंक दिखाता है जिसे डब्लूएसडीएल डाउनलोड करने के लिए इस्तेमाल किया जा सकता है।wsimport

मेरे लिए एक महत्वपूर्ण आवश्यकता बिना सेवा के सेवा सेवा को स्विच करने में सक्षम होना है। मुझे दिया गया यूआरएल स्पष्ट रूप से एक टेस्ट सर्वर है और मुझे पता है कि उत्पादन में मुझे उपयोग करने के लिए एक उत्पादन यूआरएल दिया जाएगा। मैं परीक्षण के लिए खुद को एक नकली सर्वर बनाने में सक्षम होना चाहूंगा, और सेवा में स्थानांतरित होने पर पुन: कंपाइल किए बिना भविष्य में एक नया यूआरएल निर्दिष्ट करने की क्षमता बनाए रखूंगा। वास्तव में, मैं विभिन्न यूआरएल पर webservice के एकाधिक उदाहरणों को तत्काल करने में सक्षम होने के लिए हमारे आवेदन की स्थापना करना चाहता हूं।

लेकिन मेरी धारणा मेरे साथ wsimport उपकरण क्या कर रही है के साथ मेल नहीं खाती है। f1sh के जवाब here के बाद, मैं अपने डाउनलोड की डबल्यूएसडीएल से जावा कोड उत्पन्न इस आदेश के साथ:

wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl 

क्या मुझे लगता है कि उत्पन्न कोड मेरा डाउनलोड किया wsdlFile.wsdl है, जो सेवा URL होता है करने के लिए एक हार्डकोडेड संदर्भ है। हमारा एप्लिकेशन इस तरह से चलने वाला नहीं है कि इसे रनटाइम पर WSDL फ़ाइल को संपादित करके कॉन्फ़िगर किया जा सके। मुझे कोड बनाने की आवश्यकता है जो मेरे आवेदन में निर्माण समय पर संकलित है और तत्काल समय पर सेवा यूआरएल सेट हो सकता है।

मुझे पूरी तरह से यकीन नहीं है कि WSDL को रनटाइम पर भी पार्स करने की आवश्यकता क्यों है; यह मेरी समझ थी कि डब्ल्यूएसडीएल कोड उत्पन्न करने के लिए पर्याप्त जानकारी प्रदान करता है जो webservice तक पहुंच सकता है, इसलिए मुझे यकीन नहीं है कि यह सेवा यूआरएल के अलावा जेनरेट कोड को क्या प्रदान कर रहा है, और मुझे यकीन नहीं है कि सेवा यूआरएल क्यों उपलब्ध नहीं है जनरेटेड webservice वर्ग पर एक विधि के माध्यम से एक कन्स्ट्रक्टर या विन्यास योग्य। मेरा कुछ छूट रहा है।

इस परिदृश्य के लिए सामान्य अभ्यास क्या है? क्या अधिकांश लोग प्रत्येक व्यक्तिगत यूआरएल के लिए कोड पुन: उत्पन्न करते हैं जिसका उपयोग वे करने जा रहे हैं? रनटाइम पर कोड उत्पन्न होता है? क्या कोई और डब्लूएसडीएल उपकरण है जिसका उपयोग मैं कर सकता हूं जो कॉन्फ़िगर करने योग्य यूआरएल के साथ क्लाइंट कोड बनाएगा?

उत्तर

3

इस दृष्टिकोण के लिए मुझे एक javax.xml.namespace.QName ऑब्जेक्ट भी प्रदान करने की आवश्यकता है, जिसे मैं अभी तक दूसरी तर्क के रूप में नहीं समझता।

अपने जेनरेट किए गए स्रोत से किसी को कॉपी करें। एक QName एक एक्सएमएल qualified name - एक "अद्वितीय" पहचान है।

मुझे अभी भी समझ में नहीं आता कि रनटाइम पर डब्ल्यूएसडीएल की आवश्यकता क्यों है।

मैं नहीं कह सकता कि मैं निश्चित रूप से जानता हूं, लेकिन डब्लूएसडीएल मूल रूप से एक स्कीमा है। इसे प्रदान करके, मुझे लगता है कि आप जेएक्स-डब्ल्यूएस को एसओएपी प्रतिक्रिया को प्रमाणित करने के लिए एक तंत्र देते हैं। मुझे नहीं लगता कि जेएक्सबी बाइंडिंग ऐसा करने के लिए पर्याप्त हैं।

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

this question for how to set the end-point at runtime देखें।

10

इस उत्तर मुझे कुछ दिनों के लिए eluding गया है, लेकिन किसी भी तरह का प्रश्न लिख का कार्य हमेशा एक जवाब खोजने पर मुझे केंद्रित है, और कुछ और websearches यह की ओर इशारा किया गया है:

http://www.fransvanbuul.net/?p=98

ऐसा लगता है कि wsimport ने एक वर्ग बनाया, com.example.WebService, जो javax.xml.ws.Service को बढ़ाता है। इस वेब सेवा कक्षा में दो रचनाकार हैं। नो-एर्ग कन्स्ट्रक्टर को फाइल के साथ हार्डकोड किया गया है: // यूआरएल से उत्पन्न मूल डब्लूएसडीएल I का उपयोग करने के लिए। (मुझे लगता है कि अगर मैंने wsimport कमांड लाइन पर https: // URL प्रदान किया था, तो वह URL होगा जो हार्डकोड किया गया है।) वैकल्पिक रूप से मैं दो-तर्क कन्स्ट्रक्टर का उपयोग कर सकता हूं और तत्काल समय पर WSDL URL की आपूर्ति कर सकता हूं! इस दृष्टिकोण के लिए मुझे एक javax.xml.namespace.QName ऑब्जेक्ट भी प्रदान करने की आवश्यकता है, जिसे मैं अभी तक समझ नहीं पा रहा हूं, दूसरे तर्क के रूप में।

इस दो-तर्क निर्माता का उपयोग करना शायद मेरी समस्या का समाधान करेगा।

ऐसा लगता है कि wsimport, जिसे मैं जेडीके 1.6 से उपयोग कर रहा हूं, जेएक्स-डब्ल्यूएस पैकेज का हिस्सा है। जेडीके 1.6, हाल के संस्करणों में, जेएक्स-डब्ल्यूएस 2.1 है, और जेएक्स-डब्ल्यूएस 2.2 इस प्रश्न में उठाई गई कठिनाइयों को संबोधित करेगा।

मुझे किसी भी उत्तर को स्वीकार करने में खुशी होगी जो इस स्थिति के कुछ या सभी को बताती है। मुझे अभी भी समझ में नहीं आता कि रनटाइम पर डब्ल्यूएसडीएल की आवश्यकता क्यों है।अधिक व्यावहारिक रूप से, यह मुझे किसी के लिए मुझे दिखाने में मदद करेगा कि दो तर्क वाले कन्स्ट्रक्टर का उपयोग कैसे करें, या जेडीके 1.6 और जेएक्स-डब्ल्यूएस 2.2 के साथ अपना कोड कैसे उत्पन्न करें।

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