Когда я генерирую клиент веб-сервиса, используя 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...
строке.