जब मैं CXF से wsdl2java (जो wsimport के समान कुछ उत्पन्न करता है) का उपयोग करके एक webservice क्लाइंट उत्पन्न करता हूं, मावेन के माध्यम से, मेरी सेवाएं इस तरह कोड के साथ शुरू होती हैं:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
हार्डकॉस्ट निरपेक्ष पथ वास्तव में बेकार है। उत्पन्न वर्ग मेरा के अलावा किसी अन्य कंप्यूटर में काम नहीं करेगा।
पहला विचार WSDL फ़ाइल (प्लस सब कुछ जो आयात करता है, अन्य WSDLs और XSDs) को कहीं-कहीं जार-फ़ाइल में डालना और इसे वर्गपाठ करना है। लेकिन हम इससे बचना चाहते हैं। चूंकि डब्ल्यूएसडीएल और एक्सएसडीएस में स्थित सीएक्सएफ और जेएक्सबी द्वारा यह सब कुछ उत्पन्न किया गया था, इसलिए हमें डब्ल्यूएसडीएल को रनटाइम के बारे में जानने की आवश्यकता नहीं है।
WsdlLocation विशेषता को WSDL स्थान को ओवरराइड करने का इरादा है (कम से कम यह वही है जिसे मैंने कहीं पढ़ा है), और यह डिफ़ॉल्ट मान "" है। चूँकि हम मावेन का उपयोग कर रहे हैं, हमने <wsdlLocation></wsdlLocation>
wsdlLocation को खाली छोड़ने के लिए स्रोत जनरेटर को मजबूर करने के लिए CXF के विन्यास में शामिल करने की कोशिश की। हालाँकि, यह केवल XML टैग को अनदेखा करता है क्योंकि यह खाली है। हम एक बहुत बदसूरत शर्मनाक हैक किया, का उपयोग कर <wsdlLocation>" + "</wsdlLocation>
।
यह अन्य स्थानों को भी बदलता है:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
तो, मेरे सवाल हैं:
क्या हमें वास्तव में एक डब्ल्यूएसडीएल स्थान की आवश्यकता है, भले ही सभी वर्ग सीएक्सएफ और जेएक्सबी द्वारा उत्पन्न किए गए थे? यदि हाँ, तो क्यों?
अगर हमें वास्तव में डब्ल्यूएसडीएल स्थान की आवश्यकता नहीं है, तो सीएक्सएफ बनाने और इसे पूरी तरह से बचने के लिए उचित और साफ तरीका क्या है?
उस हैक से हमें क्या दुष्प्रभाव हो सकते हैं? हम अभी भी यह देखने के लिए परीक्षण नहीं कर सकते हैं कि क्या होता है, इसलिए यदि कोई अग्रिम में कह सकता है, तो यह अच्छा होगा।
classpath:
में छोड़ें<wsdlLocation...
।