WSDL Загрузки JAX-WS от банки

Если вы хотите сделать это в оболочке:

#!/bin/bash
file=$1
designation=$2

# code to validate user input here ...

sum=0
count=0
while IFS=, read -r n d s; do 
    if [[ ${designation,,} == "${d,,}" ]]; then 
        (( sum += s ))
        (( count++ ))
    fi
done < "$file"

if (( count == 0 )); then 
    echo "No $designation found in $file"
else
    echo $((sum / count))
fi
44
задан Cogsy 19 April 2009 в 03:20
поделиться

6 ответов

Вот мой хакерский обходной путь.

Я распаковываю WSDL из банки и записываю его в файл рядом с jar:

File wsdl = new File("../lib/service.wsdl");
InputStream source = getClass().getResource("resources/service.wsdl").openStream();
FileOutputStream out = new FileOutputStream(wsdl);

byte[] buffer = new byte[512];
int read;
while((read = source.read(buffer)) >= 0) {
    out.write(buffer, 0, read);
}

Затем укажите классы обслуживания на файл : ../ lib / service.wsdl .

Это работает, но я буду признателен, если кто-нибудь сможет показать мне более элегантное решение.

1
ответ дан 26 November 2019 в 22:03
поделиться

Если у вашего пути к классам есть "." в нем Class.getResource (".") вернет URL-адрес каталога, из которого вы выполнили команду java. Иначе, он вернет ноль. Отрегулируйте wsdllocation соответственно.

3
ответ дан 26 November 2019 в 22:03
поделиться

Да, это вполне возможно, поскольку я сделал это при создании клиентов через javax.xml.ws.EndpointReference, класс, связанный с WS-A. Я добавил ссылку на путь к классам WSDL в WS-A EndPointReference, и реализация JAX-WS в Metro загрузила его очень хорошо. Независимо от того, загружается ли WSDL из WS-A EndPointReference или из файла или URL-адреса http, ваша реализация JAX-WS должна использовать тот же код синтаксического анализа WSDL, что и все, что вы делаете, - это разрешение URL.

Лучшим подходом для вас, вероятно, будет сделать что-то вроде следующего:

URL wsdlUrl = MyClass.class.getResource(
            "/class/path/to/wsdl/yourWSDL.wsdl");

Service yourService= Service.create(
            wsdlUrl,
            ...);

Где ... представляет QName Сервис WSDL внутри вашего WSDL. Теперь важно помнить, что ваш WSDL должен быть полным и действительным. Это означает, что если ваш WSDL импортирует файлы XSD или другие WSDL, URL-адреса должны быть правильными. Если вы включили импортированные WSDL и XSD в тот же JAR, что и файл WSDL, вы должны использовать относительные URL-адреса для импорта и сохранить все импортированные файлы в том же файле JAR. Обработчик URL-адресов JAR не обрабатывает относительные URL-адреса как относительные по отношению к пути к классам, а скорее как относительные в файле JAR, поэтому вы не можете иметь импорт в своем WSDL, который выполняется через JAR, если вы не реализуете пользовательский обработчик URL-адресов и свой собственный префикс для выполнения разрешение импорта на основе пути к классам. Если ваш WSDL импортирует внешние ресурсы, это нормально, но вы подписываетесь на проблемы с обслуживанием, если эти ресурсы когда-либо перемещаются. Даже использование статической копии WSDL из пути к классам противоречит духу WSDL, веб-служб и JAX-WS, но бывают случаи, когда это необходимо.

Наконец, если вы встраиваете статический WSDL, я предлагаю чтобы вы, по крайней мере, сделали конечную точку службы настраиваемой для целей тестирования и развертывания. Код для перенастройки конечной точки вашего клиента веб-службы выглядит следующим образом:

  YourClientInterface client = yourService.getPort(
            new QName("...", "..."),
            YourClientInterface.class);
  BindingProvider bp = (BindingProvider) client;
  bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                "http://localhost:8080/yourServiceEndpoint");
48
ответ дан 26 November 2019 в 22:03
поделиться

Я наткнулся на ту же проблему. Код клиента генерации JAXWS использует трюк MyService.class.getResource (".") для загрузки файла wsdl ... но после тестирования кажется, что это работает, только если файл класса находится в каталоге на файловая система. Если файл класса находится в JAR, этот вызов возвращает ноль для URL.

Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:

final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");

, тогда он также будет работать, если класс и wsdl объединены в jar.

Я думаю, что большинство людей действительно объединят в пакет банка!

Если файл класса находится в JAR, этот вызов возвращает ноль для URL.

Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:

final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");

, тогда он также будет работать, если класс и wsdl объединены в jar.

Я думаю, что большинство людей действительно объединят в пакет банка!

Если файл класса находится в JAR, этот вызов возвращает ноль для URL.

Это звучит как ошибка в JDK, поскольку если вы создадите свой URL-адрес следующим образом:

final URL url = new URL( MyService.class.getResource( MyService.class.getSimpleName() + ".class"), "myservice.wsdl");

, тогда он также будет работать, если класс и wsdl объединены в jar.

Я думаю, что большинство людей действительно объединят в пакет банка!

2
ответ дан 26 November 2019 в 22:03
поделиться

Может быть, немного поздно, но я нашел довольно простое решение, которое помогло решить эту проблему, но оно включало изменение сгенерированного кода класса обслуживания:

Если следующая строка в классе обслуживания

baseUrl = net.example.ApplicationService.class.getResource(".");

будет изменена на

baseUrl = net.example.ApplicationService.class.getResource("");

он отлично работает даже с WSDL, упакованным в JAR. Не уверен в точном предполагаемом поведении getResource () в любом из этих случаев, но пока у меня не было никаких проблем с этим подходом,

6
ответ дан 26 November 2019 в 22:03
поделиться

Другой ответ - использовать

new Service(wsdllocation, servicename );

для получения объекта службы.

Вот как я решил проблему.

3
ответ дан 26 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: