Как работает клиент, созданный 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 содержит бобы, используемые в интернете сервер службы (исключая ObjectFactory и package-info). А пока ... --15--> и MyMethodResponse также используются бобы для установки параметра запроса и ответа метода/операции веб-службы.

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

я с

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

2 ответов


прежде чем я отвечу на вопросы, некоторые разъяснения: JAX-WS-это спецификация для реализации веб-сервисов на Java. Он описывает, как артефакты WSDL могут быть сопоставлены классам Java и как это сопоставление может быть применено с помощью аннотаций. Ты можешь!--11-->скачать спецификацию здесь. Инструмент 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 через https. Другие конфигурации, такие как SOAP over JMS, возможны, и ваш клиент должен знать, какой протокол использовать. Поэтому ему нужна привязка WSDL. Кроме того, как вы заявляете позже, в ваших файлах Java нет адреса конечной точки. Этот адрес также считывается из WSDL.

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

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

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

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

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


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

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

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

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