Когда я создаю клиент webservice, используя 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 файле и classpath. Но мы хотим избежать этого. Поскольку все это было создано 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 не генерировать его и полностью избегать?
-
Какие плохие побочные эффекты мы можем получить с этим взломом? Мы все еще не можем проверить это, чтобы посмотреть, что произойдет, поэтому, если кто-то может сказать заранее, было бы хорошо.