Как работает сгенерированный клиент 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.
Ответы
Ответ 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 на том же сервере, на котором работает ваш веб-сервис