В этом руководстве мы покажем вам, как использовать JAX-WS для создания конечной точки веб-службы на основе SOAP (стиль документа). Сравните со ссылкой://webservices/jax-ws/jax-ws-hello-world-example/[стиль RPC], для его работы требуются дополнительные усилия.
Directory структура этого примера
Изображение://wp-content/uploads/2010/11/jaxws-document-hello-world-example.png[JAXWS-документ-привет-мир - например, название = "JAXWS-документ-привет-мир - пример », ширина = 437, высота = 327]
Конечная точка веб-службы JAX-WS
Вот шаги для создания веб-сервиса стиля документа в JAX-WS.
1. Создайте интерфейс конечной точки веб-службы
На самом деле, аннотирование с помощью
@ SOAPBinding
не является обязательным, поскольку по умолчанию используется стиль документа
File: HelloWorld.java
package com.mkyong.ws; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; //Service Endpoint Interface @WebService @SOAPBinding(style = Style.DOCUMENT, use=Use.LITERAL)//optional public interface HelloWorld{ @WebMethod String getHelloWorldAsString(String name); }
2. Создать реализацию конечной точки веб-службы
File: HelloWorldImpl.java
package com.mkyong.ws; import javax.jws.WebService; //Service Implementation @WebService(endpointInterface = "com.mkyong.ws.HelloWorld") public class HelloWorldImpl implements HelloWorld{ @Override public String getHelloWorldAsString(String name) { return "Hello World JAX-WS " + name; } }
3. Создать Endpoint Publisher.
File: HelloWorldPublisher.java
package com.mkyong.endpoint; import javax.xml.ws.Endpoint; import com.mkyong.ws.HelloWorldImpl; //Endpoint publisher public class HelloWorldPublisher{ public static void main(String[]args) { Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl()); } }
Подождите, когда вы запустите издателя конечной точки, вы увидите следующее сообщение об ошибке:
Wrapper class com.mkyong.ws.jaxws.GetHelloWorldAsString is not found. Have you run APT to generate them?
Смотрите эту ссылку://webservices/jax-ws/wrapper-class-package-jaxws-methodname-is-not-found-have-you-run-apt-to-generate-them/[статья].
Вам необходимо использовать инструмент « wsgen » для генерации необходимых переносимых артефактов JAX-WS. Давайте перейдем к следующему шагу.
4. команда wsgen
Для стиля документа требуются дополнительные классы, вы можете использовать « wsgen » для генерации всех необходимых артефактов Java (классов сопоставления, схемы wsdl или xsd). Команда « wsgen » необходима для чтения класса реализации конечной точки службы:
wsgen -keep -cp . com.mkyong.ws.HelloWorldImpl
Он сгенерирует два класса, скопируйте его в папку « package.jaxws ».
File: GetHelloWorldAsString.java
package com.mkyong.ws.jaxws; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "getHelloWorldAsString", namespace = "http://ws.mkyong.com/") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "getHelloWorldAsString", namespace = "http://ws.mkyong.com/") public class GetHelloWorldAsString { @XmlElement(name = "arg0", namespace = "") private String arg0; /** ** ** ** @return ** returns String ** / public String getArg0() { return this.arg0; } /** ** ** ** @param arg0 ** the value for the arg0 property ** / public void setArg0(String arg0) { this.arg0 = arg0; } }
File: GetHelloWorldAsStringResponse.java
package com.mkyong.ws.jaxws; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "getHelloWorldAsStringResponse", namespace = "http://ws.mkyong.com/") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "getHelloWorldAsStringResponse", namespace = "http://ws.mkyong.com/") public class GetHelloWorldAsStringResponse { @XmlElement(name = "return", namespace = "") private String __return; /** ** ** ** @return ** returns String ** / public String getReturn() { return this.__return; } /** ** ** ** @param __return ** the value for the __return property ** / public void setReturn(String __return) { this.__return = __return; } }
-
Примечание ** Инструмент «wsgen» доступен в папке «JDK__Path \ bin \». Для получения подробной информации, пожалуйста, прочитайте эту ссылку://webservices/jax-ws/jax-ws-wsgen-tool-example/[JAX-WS: пример инструмента wsgen].
Клиент веб-службы
Создайте клиент веб-службы для доступа к опубликованной службе.
File: HelloWorldClient.java
package com.mkyong.client; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.mkyong.ws.HelloWorld; public class HelloWorldClient{ public static void main(String[]args) throws Exception { URL url = new URL("http://localhost:9999/ws/hello?wsdl"); QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService"); Service service = Service.create(url, qname); HelloWorld hello = service.getPort(HelloWorld.class); System.out.println(hello.getHelloWorldAsString("mkyong")); } }
Выход
Hello World JAX-WS mkyong
Отслеживание трафика SOAP
Сверху вниз, показывая, как конверт SOAP проходит между клиентом и сервером в этом веб-сервисе в стиле документа.
1. Запросить файл WSDL
Сначала клиент отправляет запрос wsdl конечной точке службы:
-
Клиент отправляет запрос: **
GET/ws/hello?wsdl HTTP/1.1 User-Agent: Java/1.6.0__13 Host: localhost:9999 Accept: text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2 Connection: keep-alive
-
Сервер отправляет ответ: **
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml;charset=utf-8 <?xml version="1.0" encoding="UTF-8"?> <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. --> <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.mkyong.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.mkyong.com/" name="HelloWorldImplService"> <types> <xsd:schema> <xsd:import namespace="http://ws.mkyong.com/" schemaLocation="http://localhost:9999/ws/hello?xsd=1"></xsd:import> </xsd:schema> </types> <message name="getHelloWorldAsString"> <part name="parameters" element="tns:getHelloWorldAsString"></part> </message> <message name="getHelloWorldAsStringResponse"> <part name="parameters" element="tns:getHelloWorldAsStringResponse"></part> </message> <portType name="HelloWorld"> <operation name="getHelloWorldAsString"> <input message="tns:getHelloWorldAsString"></input> <output message="tns:getHelloWorldAsStringResponse"></output> </operation> </portType> <binding name="HelloWorldImplPortBinding" type="tns:HelloWorld"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"> </soap:binding> <operation name="getHelloWorldAsString"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> </binding> <service name="HelloWorldImplService"> <port name="HelloWorldImplPort" binding="tns:HelloWorldImplPortBinding"> <soap:address location="http://localhost:9999/ws/hello"></soap:address> </port> </service> </definitions>
2. getHelloWorldAsString (имя строки)
Второй вызов, клиентский метод put, вызывает запрос в конверте SOAP и отправляет его конечной точке сервиса. В конечной точке службы вызовите запрошенный метод, поместите результат в конверт SOAP и отправьте его обратно клиенту.
-
Клиент отправляет запрос: **
POST/ws/hello HTTP/1.1 SOAPAction: "" Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, ** ; q=.2, ** /** ; q=.2 Content-Type: text/xml; charset=utf-8 User-Agent: Java/1.6.0__13 Host: localhost:9999 Connection: keep-alive Content-Length: 224 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsString xmlns:ns2="http://ws.mkyong.com/"> <arg0>mkyong</arg0> </ns2:getHelloWorldAsString> </S:Body> </S:Envelope>
-
Сервер отправляет ответ: **
HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml; charset=utf-8 <?xml version="1.0" ?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:getHelloWorldAsStringResponse xmlns:ns2="http://ws.mkyong.com/"> <return>Hello World JAX-WS mkyong</return> </ns2:getHelloWorldAsStringResponse> </S:Body> </S:Envelope>
Скачать исходный код
Скачать его - ссылка://wp-content/uploads/2010/11/JAX-WS-HelloWorld-Document-Example.zip[JAX-WS-HelloWorld-Document-Example.zip](10 КБ)
ссылка://тег/hello-world/[привет мир]ссылка://тег/jax-ws/[jax-ws]ссылка://тег/веб-сервисы/[веб-сервисы]