Пример JAX-WS Hello World - Стиль документа

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

5. Готово

Готово, опубликуйте и протестируйте по URL:

http://локальный : 9999/WS/привет wsdl .

Клиент веб-службы

Создайте клиент веб-службы для доступа к опубликованной службе.

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]ссылка://тег/веб-сервисы/[веб-сервисы]