Когда я генерирую клиент веб-сервиса, используя 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...
строке.Мы используем
Другими словами, используйте путь относительно пути к классам.
Я полагаю, что WSDL может понадобиться во время выполнения для проверки сообщений во время маршала / демаршала.
источник
Для тех, кто использует
org.jvnet.jax-ws-commons:jaxws-maven-plugin
для генерации клиента из WSDL во время сборки:src/main/resources
wsdlLocation
сclasspath:
wsdlLocation
с/
Пример:
/src/main/resources/foo/bar.wsdl
jaxws-maven-plugin
с<wsdlDirectory>${basedir}/src/main/resources/foo</wsdlDirectory>
и<wsdlLocation>/foo/bar.wsdl</wsdlLocation>
источник
1) В некоторых случаях да. Если WSDL содержит такие вещи, как политики и тому подобное, которые управляют поведением во время выполнения, тогда WSDL может потребоваться во время выполнения. Артефакты не создаются для связанных с политикой вещей и тому подобного. Кроме того, в некоторых непонятных случаях RPC / Literal не все необходимые пространства имен выводятся в сгенерированном коде (согласно спецификации). Таким образом, WSDL будет необходимо для них. Темные случаи, хотя.
2) Я думал, что-то вроде будет работать. Какая версия CXF? Это звучит как ошибка. Вы можете попробовать пустую строку там (только пробелы). Не уверен, работает ли это или нет. Тем не менее, в вашем коде вы можете использовать конструктор, который принимает URL WSDL и просто передает null. WSDL не будет использоваться.
3) Только ограничения выше.
источник
Я был в состоянии генерировать
путем настройки pom-файла для нулевого значения для wsdlurl:
источник
Возможно ли, что вы можете избежать использования wsdl2java? Вы можете сразу использовать API-интерфейсы CXF FrontEnd для вызова вашего веб-сервиса SOAP. Единственный улов заключается в том, что вам нужно создать свои SEI и VO на стороне клиента. Вот пример кода.
Вы можете увидеть полное руководство здесь http://weblog4j.com/2012/05/01/developing-soap-web-service-using-apache-cxf/
источник
Обновление для CXF 3.1.7
В моем случае я поместил файлы WSDL
src/main/resources
и добавил этот путь к своим источникам в Eclipse (щелкните правой кнопкой мыши Project-> Build Path -> Configure Build Path ...-> Source [Tab] -> Add Folder).Вот как
pom
выглядит мой файл, и, как видно, никакойwsdlLocation
опции не требуется:А вот и созданный Сервис. Как видно, URL получен из ClassLoader, а не из Абсолютного пути к файлу.
источник
<configuration> <sourceRoot>${basedir}/src/main/java/</sourceRoot> <wsdlRoot>${basedir}/src/main/resources/</wsdlRoot> <includes> <include>*.wsdl</include> </includes> </configuration>
Я включаю все файлы .wsdl в путь к классу, тогда как я могу указать расположение wsdl, чтобы каждый сгенерированный файл .java содержал соответствующий путь .wsdl? Заранее спасибо. @MazyСерьезно, главный ответ не работает для меня. пробовал cxf.version 2.4.1 и 3.0.10. и каждый раз генерировать абсолютный путь с помощью wsdlLocation.
Мое решение состоит в том, чтобы использовать
wsdl2java
команду вapache-cxf-3.0.10\bin\
с-wsdlLocation classpath:wsdl/QueryService.wsdl
.Деталь:
источник
Решение @Martin Devillers работает отлично. Для полноты, предоставив следующие шаги:
src/main/resource
В файле pom добавьте как wsdlDirectory, так и wsdlLocation (не пропустите / в начале wsdlLocation), как показано ниже. В то время как wsdlDirectory используется для генерации кода, а wsdlLocation используется во время выполнения для создания динамического прокси.
Затем в вашем коде Java (с конструктором без аргументов):
Вот полная часть генерации кода в pom-файле с текущими API в сгенерированном коде.
источник