В этом руководстве мы покажем вам, как использовать 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]ссылка://тег/веб-сервисы/[веб-сервисы]