Коли я генерую клієнта веб-сервісу за допомогою wsdl2java від CXF (який генерує щось подібне до wsimport), через maven, мої послуги починаються з таких кодів:
@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 (плюс усе, що імпортується, інші WSDL та XSD) кудись у jar-файл та класифікувати його. Але ми хочемо цього уникнути. Оскільки все це було створено CXF та JAXB, що базуються на WSDL та XSD, ми не бачимо сенсу знати WSDL під час виконання.
Атрибут wsdlLocation призначений для заміщення місця розташування WSDL (принаймні, це я десь читав), а значення за замовчуванням - "". Оскільки ми використовуємо maven, ми намагалися включити <wsdlLocation></wsdlLocation>
всередину конфігурацію CXF, щоб спробувати змусити генератор джерела залишити wsdlLocation порожнім. Однак це просто змушує ігнорувати тег 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;
}
Отже, мої запитання:
Чи справді нам потрібне місце розташування WSDL, навіть якщо всі класи були створені CXF та JAXB? Якщо так, то чому?
Якщо нам не потрібне місце розташування WSDL, то який правильний та чистий спосіб змусити CXF не генерувати його та уникати його повністю?
Які погані побічні ефекти ми могли б отримати із цим злом? Ми все ще не можемо перевірити це, щоб побачити, що трапиться, тому якби хтось міг сказати заздалегідь, було б добре.
classpath:
у<wsdlLocation...
рядку.