Встраивание WSDL для веб-службы в клиент JAX-WS .jar - PullRequest
5 голосов
/ 09 мая 2011

У меня есть веб-сервис, который был создан несколько лет назад на C ++ и используется клиентом .NET, использующим "#ssl.exe" в C # для создания клиентских заглушек. По разным причинам мне сейчас также нужен клиент Java, и я хочу ограничить использование Java 6 (JDK 1.6) с JAX-WS. Сгенерированные заглушки работают нормально, даже если они упакованы в .jar, но у меня возникла проблема с тем, как клиенты веб-службы JAX-WS хотят быть развернутыми. Похоже, проблема, с которой я сталкиваюсь, разрешима , но ни один из предложенных способов не работает.

JAX-WS ожидает, что WSDL будет доступен, предпочтительно из сети, поскольку он каждый раз анализирует WSDL при запуске для создания привязок. Как и jgrowl в Создание клиента веб-службы с известным, но недоступным wsdl , клиент может не иметь доступа к WSDL по URL-адресу, который использует JAX-WS (который, вероятно, будет файлом на компьютере сборки или указатель на localhost). Я хочу отправить WSDL внутри клиента .jar, но самое простое решение (-wsdllocation "/path/to/wsdl/in/jar.wsdl") выводит предупреждение, которое я не хочу показывать.

Я бы также предпочел , а не , чтобы клиент делал что-то вроде решения, найденного jgrowl, которое работает, но не работает. Статьи, найденные в Google, в основном относятся к адресам WSDL сервера, но предполагают, что клиенты должны иметь возможность работать с META-INF/jax-ws-catalog.xml файлами, которые преобразуют URL-адрес, используемый в -wsdllocation, в путь в файле .jar, но, похоже, они не работают в наше тестирование.

Существует ли "рецепт", чтобы я мог поместить WSDL в .jar где-нибудь и получить клиент JAX-WS просто работать без дополнительных усилий со стороны пользователя клиента и без предупреждения?

1 Ответ

3 голосов
/ 09 мая 2011

Если вы предпочитаете не устанавливать URL для WSDL в конструкторе, вы можете полагаться на поведение сгенерированных артефактов.Когда я использую , следующее -wsdlLocation:

-wsdllocation wsdl/MaintainAddress.wsdl

В коде службы в качестве статического инициализатора генерируется следующее:

static {
    URL url = null;
    try {
        URL baseUrl;
        baseUrl = demo.ws.service.MaintainAddress_Service.class.getResource(".");
        url = new URL(baseUrl, "wsdl/MaintainAddress.wsdl");
    } catch (MalformedURLException e) {
        logger.warning("Failed to create URL for the wsdl Location: 'wsdl/MaintainAddress.wsdl', retrying as a local file");
        logger.warning(e.getMessage());
    }
    MAINTAINADDRESS_WSDL_LOCATION = url;
}

Это по существу будет делатьто же самое, что и решение, которое вы нашли, но с конструктором по умолчанию.WSDL должен быть ресурсом на пути к классам в папке wsdl.

Этот подход не выдает мне никаких предупреждений.

Я не думаю, что это поведение определенов спецификации - по крайней мере, я не смог ее найти.Я полагаю, что это деталь реализации инструмента wsimport в моем JDK.


У вас есть больше вариантов, если вы развертываете контейнер Java EE - см. JSR 109.Я считаю, что именно здесь jax-ws-catalog.xml вступает в игру.

...