Как работает клиент, созданный 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 всегда считывается, когда необходимо установить новое соединение?
поскольку мне нужно скомпилировать приложение и установить его на другом сервере, оно станет недействительным. Могу ли я установить относительный путь вместо абсолютного пути? Как? (Ответ: Да, он может быть установлен на относительный путь. Thewsimport
команда имеет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 на том же сервере, где работает ваш веб-сервис