Подтвердить что ты не робот

Как работает сгенерированный клиент wsimport?

Прежде чем что-либо еще, я хочу, чтобы вы знали, что я уже могу подключиться к серверу веб-сервисов. Я задаю этот вопрос, потому что хочу получить более глубокие знания о том, как работает клиент, созданный wsimport. Основываясь на моих исследованиях, wsimport использует JAXWS. Обратите внимание, что у меня нет знаний от JAXWS.

Я создал своего клиента, используя wsimport. WSDL, который я использовал, является веб-службой Axis2 и автоматически генерируется Axis2. Ниже приведены классы wsimport:

В разделе com.datamodel.xsd

  • DataBeanRequest.java
  • DataBeanResponse.java
  • ObjectFactory.java
  • package-info.java

В com.service

  • MyWebService.java
  • MyWebServicePortType.java
  • MyMethod.java
  • MyMethodResponse.java
  • ObjectFactory.java
  • package-info.java

С приведенными выше классами я могу сказать, что com.datamodel.xsd содержит beans, используемый сервером веб-сервисов (исключая ObjectFactory и package-info). Между тем MyMethod и MyMethodResponse также beans используются для установки параметра запроса и ответа метода/операции веб-службы.

Ниже приведены мои вопросы: (Вам не обязательно отвечать на все это, если вы не знаете ответов по некоторым из моих вопросов.:) И, пожалуйста, не стесняйтесь делиться любой информацией, которую, по вашему мнению, я могу найти полезно.)

Правильно ли я с

  • Правильно ли я согласен с моими предположениями?
  • Какова функция других классов?
  • Я проверил MyWebService и содержит аннотацию, ссылающуюся на абсолютное местоположение WSDL, которое я использовал для создания клиента. Какова актуальность указания wsdllocation в клиенте? Как клиент использует эту информацию?
  • Я заметил, что фактический URL-адрес веб-службы не объявлен ни в одном из классов, сгенерированных. Как клиент знает, где ему нужно подключиться?
  • Был ли аннотирован файл WSDL, чтобы клиент мог прочитать URL-адрес в файле WSDL при подключении? Если да, то означает ли это, что файл WSDL всегда читается, когда необходимо установить новое соединение?
  • Поскольку мне нужно скомпилировать мое приложение и установить его на другом сервере, он станет недействительным. Могу ли я установить его на относительный путь вместо абсолютного пути? Как? (Ответ: Да, он может быть установлен в относительный путь. Команда wsimport имеет атрибут wsdllocation, в котором может быть указано значение wsdllocation.)
  • Что делать, если мне нужно подключиться к HTTPS. Как установить сертификат сервера?
  • Есть ли разница при создании моего клиента с помощью wsimport и при его создании с помощью Axis2 или Apache CXF.
4b9b3361

Ответ 1

Прежде чем ответить на вопросы, некоторые пояснения: JAX-WS - это спецификация для реализации веб-сервисов на Java. В нем описано, как артефакты WSDL могут быть сопоставлены с классами Java и как это сопоставление может быть применено с помощью аннотаций. Вы можете загрузить спецификацию здесь. Инструмент wsimport является частью эталонной реализации этой спецификации, а эталонная реализация является частью библиотеки классов Java. Существует несколько альтернативных реализаций, таких как Axis2, CXF или Metro, которые улучшают базовую поддержку JAX-WS с поддержкой дополнительных стандартов, таких как WS-ReliableMessaging или WS-Security.

Теперь на ваши вопросы:

Я исправлю свои предположения выше?

Да, вы.

Какова функция других классов?

package-info существует для сопоставления пространства имен XML, используемого в веб-службе, с пакетом, в котором находятся классы реализации. Пространство имен обычно отличается от имени пакета Java (обычно это URL-адрес), и это делает необходимым отображение.

ObjectFactory позволяет вам создавать любые сообщения, отправленные и полученные службой. Это вам нужно, если вы хотите подключить код перед классом заглушки, предоставить измененные сообщения или подобные вещи.

Я не могу видеть содержимое ваших классов, но если я понимаю, правильно MyWebServicePortType - это интерфейс, который напоминает portType в вашем WSDL. То есть, он отображает операции и их подписи в методах WSDL для Java. Если вы хотите предоставить услугу (чего вы не знаете, вы спрашиваете о клиенте), вам нужно будет реализовать этот интерфейс. Когда вы реализуете клиент, вы просто используете его.

Наконец, класс MyWebService содержит нужный клиент, если вы хотите вызвать веб-службу.

Я проверил MyWebService и в нем содержится аннотация, относящаяся к абсолютное местоположение WSDL, которое я использовал для создания клиента. Какие является ли спецификацией wsdllocation в клиенте? Как клиент использует эту информацию?

Созданный вами интерфейс содержит подпись portType службы, но он не объясняет, как вы можете разговаривать с сервисом. Это часть привязки в WSDL. Самым основным параметром является стиль документа/литерала для сообщений с использованием SOAP через HTTP. Возможны другие конфигурации, такие как SOAP over JMS, и ваш клиент должен знать, какой протокол использовать. Поэтому ему нужен привязывающий WSDL. Кроме того, как вы заявляете позже, в ваших файлах Java нет адреса конечной точки. Этот адрес также считывается из WSDL.

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

Он читает address из port service в WSDL. Это находится в конце WSDL.

Был ли аннотирован файл WSDL, чтобы клиент мог прочитать URL-адрес на Файл WSDL при подключении?

Нет, port является типичным элементом конкретной конечной точки веб-сервиса. Здесь нет ничего особенного.

Если да, значит, это означает, что файл WSDL всегда читается, когда новый соединение должно быть установлено?

Ну, на стороне клиента может быть кеширование (я не знаю о деталях эталонной реализации на этом). С концептуальной точки зрения: да, это так.

Что делать, если мне нужно подключиться к HTTPS. Как настроить сервер сертификат

Это может быть сложно, я не могу дать вам готовый ответ. Я бы предложил прочитать вопросы по этой теме например, этот.

Есть ли разница, когда я создаю свой клиент, используя wsimport и когда я сгенерирую его с помощью Axis2 или Apache CXF

Да, есть. wsimport лучше, не используйте wsdl2java. Вот описание, почему.

Ответ 2

Вы спросили: я заметил, что фактический URL-адрес веб-службы не объявлен ни в одном из генерируемых классов. Как клиент знает, где ему нужно подключиться?

Если WSDL был загружен с помощью браузера и передан как вход в wsimport, локальное расположение файла wsdl внедряется в сгенерированный код. Вот почему вы не видите фактическое местоположение службы в сгенерированном коде. Это также означает, что если вы удалили локальную копию файла wsdl, сгенерированный код не будет работать (если он был использован с использованием основного метода).

Если URL-адрес wsdl был передан как вход в wsimport, тогда этот URL-адрес встроен в сгенерированный код, который далее используется для получения фактического местоположения службы. Идея состоит в том, что местоположения WSDL фиксированы. Ожидается, что они будут находиться в UDDI или в локальном файле. Это позволяет фактическим службам перемещаться, и если они перемещаются, вам просто нужно изменить локальную копию файла wsdl или обновить wsdl в UDDI. [в основном это не происходит, поскольку места службы никогда не являются IP, а именами DNS)

Вот почему никогда не рекомендуется публиковать wsdl на том же сервере, на котором работает ваш веб-сервис