Изменение URL-адреса на клиенте веб-службы, созданном с помощью wsimport

Я пытаюсь написать модуль для приложения Java, который обращается к веб-службе, описанной WSDL. Исходный WSDL был загружен прямо из того, что я считаю веб-сервисом ASP.NET; URL-адрес службы заканчивается расширением .asmx, и при просмотре URL-адреса службы в браузере отображается ссылка, которую можно использовать для загрузки WSDL.

Ключевым требованием для меня является возможность отключить URL-адрес службы без перекомпиляции. Указанный мне URL-адрес, очевидно, является тестовым сервером, и я знаю, что в производственной среде мне будет предоставлен рабочий URL-адрес для использования. Я также хотел бы иметь возможность самостоятельно создать фиктивный сервер для тестирования и сохранить возможность указывать новый URL-адрес в будущем без перекомпиляции, если служба будет перемещена. Фактически, я хотел бы, чтобы установка нашего приложения могла создавать несколько экземпляров веб-службы по разным URL-адресам.

Но моя концепция, похоже, не соответствует тому, что инструмент wsimport делает для меня. Следуя ответу f1sh здесь , я сгенерировал код Java из моего загруженного WSDL с помощью этой команды:

wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl

Я обнаружил, что сгенерированный код имеет жестко закодированную ссылку на мой загруженный файл wsdlFile.wsdl, который содержит URL-адрес службы. . Наше приложение не будет работать таким образом, чтобы его можно было настроить путем редактирования файла WSDL во время выполнения.Мне нужен код, который компилируется в мое приложение во время сборки и может иметь URL-адрес службы, установленный во время создания экземпляра.

Я не совсем уверен, зачем вообще нужно разбирать WSDL во время выполнения; я понял, что WSDL предоставляет достаточно информации для генерации кода, который может получить доступ к веб-сервису, поэтому я не уверен, что он предоставляет сгенерированному коду, кроме URL-адреса службы, и я не уверен, почему URL-адрес службы не указан в конструктор или настраиваемый с помощью метода в сгенерированном классе веб-службы. Я, должно быть, что-то упускаю.

Какова общая практика для этого сценария? Большинство людей регенерируют код для каждого отдельного URL-адреса, который они собираются использовать? Генерируется ли код во время выполнения? Есть ли еще один инструмент WSDL, который я могу использовать для создания клиентского кода с настраиваемым URL-адресом?

12
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Этот подход требует, чтобы я также предоставил объект javax.xml.namespace.QName, который я еще не понимаю, в качестве второго аргумента.

Скопируйте файл из созданного вами источника. QName - это квалифицированное имя XML - «уникальное» удостоверение.

Я до сих пор не понимаю, зачем нужен WSDL во время выполнения.

Не могу сказать, что знаю наверняка, но WSDL - это, по сути, схема. Предоставляя его, я предполагаю, что вы даете JAX-WS механизм для проверки ответа SOAP. Я не думаю, что привязок JAXB для этого достаточно.

Я всегда использую конструктор с двумя аргументами в сгенерированной службе, чтобы предоставить URL-адрес через метод ClassLoader.getResource , чтобы встроить WSDL в мою банку. Как и в случае с любой другой схемой, использование удаленного URL-адреса или URL-адреса файловой системы для этого глупо неоптимально.

См. этот вопрос, чтобы узнать, как установить конечную точку во время выполнения :

HelloService service = new HelloService();
Hello port = service.getHelloPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
      "http://foo:8086/HelloWhatever");
String response = port.sayHello(name);
6
ответ дан 2 December 2019 в 20:15
поделиться

Этот ответ ускользал от меня в течение нескольких дней, но каким-то образом процесс написания вопроса всегда сосредотачивает меня на поиске ответа, и еще пара поисковых запросов в Интернете указали на него:

http://www.fransvanbuul.net/?p=98

Похоже, wsimport создал класс com.example.WebService, который расширяет javax.xml.ws.Service. Этот класс WebService имеет два конструктора. Конструктор без аргументов жестко закодирован с URL-адресом file:// для использования исходного WSDL, из которого я сгенерировал. (Я полагаю, что если бы я предоставил URL-адрес https:// в командной строке wsimport, это был бы жестко закодированный URL-адрес.) В качестве альтернативы я могу использовать конструктор с двумя аргументами и указать URL-адрес WSDL во время создания экземпляра! Этот подход требует, чтобы я также предоставил объект javax.xml.namespace.QName, который я еще не понимаю, в качестве второго аргумента.

Использование этого конструктора с двумя аргументами, вероятно, решит мою проблему.

Кажется, что wsimport, который я использую из JDK 1.6, является частью пакета JAX-WS. JDK 1.6 в последних версиях содержит JAX-WS 2.1, а JAX-WS 2.2 устраняет трудности, которые я поднимаю в этом вопросе.

Я буду рад принять любой ответ, который частично или полностью объясняет остальную часть этой ситуации. Я до сих пор не понимаю, зачем нужен WSDL во время выполнения. С практической точки зрения мне было бы полезно, если бы кто-нибудь показал мне, как использовать конструктор с двумя аргументами или как генерировать мой код с помощью JDK 1.6 и JAX-WS 2.2.

10
ответ дан 2 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

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