JAX-WS Hello Worldの例 - RPCスタイル

JAX-WSはJDK 1.6にバンドルされているため、Java Webサービスの開発が容易になります。このチュートリアルでは、次のタスクの実行方法を説明します。

  1. JAX-WSを使用してSOAPベースのRPCスタイルのWebサービスエンドポイントを作成します.

  2. Java Webサービスクライアントを手動で作成します.

  3. wsimport ツールを使用してJava Webサービスクライアントを作成します.

  4. Ruby Webサービスクライアントを作成します.

JAX-WSでRPCスタイルのWebサービスを開発するのがいかに簡単かは驚きです。

JAX-WS Webサービスのエンドポイント

JAX-WSを使用してRPCスタイルのWebサービスエンドポイントを作成する方法を示す次の手順。

1. Webサービスエンドポイントインターフェイスを作成する

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.RPC)
public interface HelloWorld{

    @WebMethod String getHelloWorldAsString(String name);

}

2. Webサービスエンドポイント実装を作成する

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.エンドポイントパブリッシャーを作成する

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());
    }

}

エンドポイント・パブリッシャーを実行すると、「 hello world web service 」がURL「 http://localhost:9999/ws/hello 」にデプロイされます。

4.テストする

このURL「 http://localhost:9999/ws/hello?wsdl 」を使用して、生成されたWSDL(Webサービス定義言語)ドキュメントにアクセスして、デプロイされたWebサービスをテストできます。

Webサービスクライアント

OK、Webサービスが正しくデプロイされました。次に、公開されたサービスにアクセスするためのWebサービスクライアントを作成する方法を見てみましょう。

1. Java Webサービスクライアント

ツールがなければ、次のようにJava Webサービスクライアントを作成できます。

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");

       //1st argument service URI, refer to wsdl document above
   //2nd argument is service name, refer to wsdl document above
        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

2. wsimportツールによるJava Webサービスクライアント

代わりに、 " wsimport "ツールを使用して公開されたwsdlファイルを解析し、公開されたWebサービスにアクセスするために必要なクライアントファイル(スタブ)を生成することができます。

  • wsimportはどこですか? wsimport ツールはJDKにバンドルされています。 " JDK PATH/bin__"フォルダにあります。

wsimport 」コマンドを発行します。

wsimport -keep http://localhost:9999/ws/hello?wsdl

必要なクライアントファイルを生成します。これは、提供されたwsdlファイルに依存します。この場合、1つのインタフェースと1つのサービス実装ファイルが生成されます。

File:HelloWorld.java

package com.mkyong.ws;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
/** **
 **  This class was generated by the JAX-WS RI.
 **  JAX-WS RI 2.1.1 in JDK 6
 **  Generated source version: 2.1
 **
 ** /@WebService(name = "HelloWorld", targetNamespace = "http://ws.mkyong.com/")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HelloWorld {

   /** **
     **
     **  @param arg0
     **  @return
     **      returns java.lang.String
     ** /    @WebMethod
    @WebResult(partName = "return")
    public String getHelloWorldAsString(
        @WebParam(name = "arg0", partName = "arg0")
        String arg0);

}

File:HelloWorldImplService.java

package com.mkyong.ws;

import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
/** **
 **  This class was generated by the JAX-WS RI.
 **  JAX-WS RI 2.1.1 in JDK 6
 **  Generated source version: 2.1
 **
 ** /@WebServiceClient(name = "HelloWorldImplService",
    targetNamespace = "http://ws.mkyong.com/",
    wsdlLocation = "http://localhost:9999/ws/hello?wsdl")
public class HelloWorldImplService
    extends Service
{

    private final static URL HELLOWORLDIMPLSERVICE__WSDL__LOCATION;

    static {
        URL url = null;
        try {
            url = new URL("http://localhost:9999/ws/hello?wsdl");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HELLOWORLDIMPLSERVICE__WSDL__LOCATION = url;
    }

    public HelloWorldImplService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    public HelloWorldImplService() {
        super(HELLOWORLDIMPLSERVICE__WSDL__LOCATION,
            new QName("http://ws.mkyong.com/", "HelloWorldImplService"));
    }

   /** **
     **
     **  @return
     **      returns HelloWorld
     ** /    @WebEndpoint(name = "HelloWorldImplPort")
    public HelloWorld getHelloWorldImplPort() {
        return (HelloWorld)super.getPort(
            new QName("http://ws.mkyong.com/", "HelloWorldImplPort"),
            HelloWorld.class);
    }

   /** **
     **
     **  @param features
     **   A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy.
     **   Supported features not in the <code>features</code> parameter will have their default values.
     **  @return
     **   returns HelloWorld
     ** /    @WebEndpoint(name = "HelloWorldImplPort")
    public HelloWorld getHelloWorldImplPort(WebServiceFeature... features) {
        return (HelloWorld)super.getPort(
            new QName("http://ws.mkyong.com/", "HelloWorldImplPort"),
            HelloWorld.class,
            features);
    }

}

今度は、上記の生成されたファイルに依存するJava Webサービスクライアントを作成します。

package com.mkyong.client;

import com.mkyong.ws.HelloWorld;
import com.mkyong.ws.HelloWorldImplService;

public class HelloWorldClient{

    public static void main(String[]args) {

        HelloWorldImplService helloService = new HelloWorldImplService();
        HelloWorld hello = helloService.getHelloWorldImplPort();

        System.out.println(hello.getHelloWorldAsString("mkyong"));

    }

}

ここに出力

Hello World JAX-WS mkyong

3. Ruby Webサービスクライアント

多くの場合、Webサービス開発は他のプログラミング言語と混在して使用されます。そこで、公開されたJAX-WSサービスにアクセスするために使用されるRuby Webサービスクライアントの例を示します。

# package for SOAP-based services
require 'soap/wsdlDriver'

wsdl__url = 'http://localhost:9999/ws/hello?wsdl'

service = SOAP::WSDLDriverFactory.new(wsdl__url).create__rpc__driver

# Invoke service operations.
data1 = service.getHelloWorldAsString('mkyong')

# Output results.
puts "getHelloWorldAsString : #{data1}"

出力

getHelloWorldAsString : Hello World JAX-WS mkyong

SOAPトラフィックのトレース

上から順に、クライアントとサーバーの間のSOAPエンベロープの流れを示します。 #1 Webサービスクライアントをもう一度見てください:

    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"));
  • 注:SOAPトラフィックを監視するには、このガイドを参照するのが非常に簡単です。「リンク://webservices/jax-ws/how-to-trace-soap-message-in-eclipse-ide/IDE]をクリックします。

1. WSDLファイルをリクエストする

まず、クライアントがサービスエンドポイントにwsdlリクエストを送信します。下記のHTTPトラフィックを参照してください。

  • クライアント送信要求:**

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"?>

<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></types>

<message name="getHelloWorldAsString">
    <part name="arg0" type="xsd:string"></part>
</message>
<message name="getHelloWorldAsStringResponse">
    <part name="return" type="xsd:string"></part>
</message>

<portType name="HelloWorld">
    <operation name="getHelloWorldAsString" parameterOrder="arg0">
        <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="rpc"></soap:binding>
    <operation name="getHelloWorldAsString">
        <soap:operation soapAction=""></soap:operation>
        <input>
            <soap:body use="literal" namespace="http://ws.mkyong.com/"></soap:body>
        </input>
        <output>
            <soap:body use="literal" namespace="http://ws.mkyong.com/"></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. hello.getHelloWorldAsString()

2番目の呼び出しでは、クライアントはメソッドを呼び出して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-RPC-Example.zip[JAX-WS-HelloWorld-RPC-Example.zip](14KB)

前の投稿:JSONを読み書きするGsonストリーミング
次の投稿:JAX-WS - java.net.BindException:すでに使用中のアドレス:bind