JAX-WSの紹介

1概要

XML Webサービス用のJAVA API(JAX-WS) は、SOAP(Simple Object Access Protocol)Webサービスを作成して使用するための標準化されたAPIです。

この記事では、SOAP Webサービスを作成し、JAX-WSを使用してそれに接続します。

2石鹸

SOAPは、ネットワークを介してメッセージを送信するためのXML仕様です。

SOAPはXMLを大量に使用するため、ツール/フレームワークで最もよく使用されます。 JAX-WSはSOAPの使用を簡素化するフレームワークです。これは標準のJavaの一部です。

3トップダウンとボトムアップ

SOAP Webサービスを構築する方法は2つあります。トップダウンまたはボトムアップのアプローチで進むことができます。

トップダウン(コントラクトファースト)アプローチでは、WSDLドキュメントが作成され、必要なJavaクラスがWSDLから生成されます。ボトムアップ(契約最後)アプローチでは、

一方、WSDLはJavaクラスから生成されるため、コードを変更するとWSDLが変更される可能性があります。これはトップダウンアプローチの場合は当てはまりません。

4 Webサービス定義言語(WSDL)

WSDL は利用可能なサービスの契約定義です。入出力メッセージの仕様、およびWebサービスの呼び出し方法です。これは言語に依存せず、XMLで定義されています。

WSDL文書の主な要素を見てみましょう。

4.1. 定義

definitions 要素は、すべてのWSDL文書のルート要素です。これは、サービスの名前、名前空間などを定義しています。ご覧のとおり、かなり広々としています。

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="http://jaxws.baeldung.com/"
  xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
  xmlns:wsp="http://www.w3.org/ns/ws-policy"
  xmlns:wsp1__2="http://schemas.xmlsoap.org/ws/2004/09/policy"
  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://jaxws.baeldung.com/"
  name="EmployeeService">
  ...
</definitions>

4.2. タイプ

types 要素は、Webサービスで使用されるデータ型を定義します。 WSDLは相互運用性に役立つ型システムとしてhttps://www.w3.org/TR/xmlschema-2/[XSD](XMLスキーマ定義)を使用します。

<definitions ...>
    ...
    <types>
        <xsd:schema>
            <xsd:import namespace="http://jaxws.baeldung.com/"
              schemaLocation = "http://localhost:8080/employeeservice?xsd=1"/>
        </xsd:schema>
    </types>
    ...
</definitions>

4.3. メッセージ

message 要素は、送信されているデータの抽象的な定義を提供します。各 message 要素は、サービスメソッドの入力または出力、および考えられる例外について説明します。

<definitions ...>
    ...
    <message name="getEmployee">
        <part name="parameters" element="tns:getEmployee"/>
    </message>
    <message name="getEmployeeResponse">
        <part name="parameters" element="tns:getEmployeeResponse"/>
    </message>
    <message name="EmployeeNotFound">
        <part name="fault" element="tns:EmployeeNotFound"/>
    </message>
    ...
</definitions>

4.4. 操作とポートの種類

portType 要素は、実行できる各 operation と、関連するすべての message 要素を記述します。たとえば、 getEmployee オペレーションは、Webサービス operation によってスローされるリクエスト input output 、および可能性のある fault 例外を指定します。

<definitions ...>
    ...
    <portType name="EmployeeService">
        <operation name="getEmployee">
            <input
              wsam:Action="http://jaxws.baeldung.com/EmployeeService/getEmployeeRequest"
              message="tns:getEmployee"/>
            <output
              wsam:Action="http://jaxws.baeldung.com/EmployeeService/getEmployeeResponse"
              message="tns:getEmployeeResponse"/>
            <fault message="tns:EmployeeNotFound" name="EmployeeNotFound"
              wsam:Action="http://jaxws.baeldung.com/EmployeeService/getEmployee/Fault/EmployeeNotFound"/>
        </operation>
    ....
    </portType>
    ...
</definitions>

4.5. バインディング

binding 要素は、各 portType のプロトコルとデータ形式の詳細を提供します。

<definitions ...>
    ...
    <binding name="EmployeeServiceImplPortBinding"
      type="tns:EmployeeService">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
          style="document"/>
        <operation name="getEmployee">
            <soap:operation soapAction=""/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
            <fault name="EmployeeNotFound">
                <soap:fault name="EmployeeNotFound" use="literal"/>
            </fault>
        </operation>
        ...
    </binding>
    ...
</definitions>

4.6. サービスとポート

service 要素は、Webサービスでサポートされているポートを定義します。

service port 要素は、サービスの name binding 、および address を定義します。

<definitions ...>
    ...
    <service name="EmployeeService">
        <port name="EmployeeServiceImplPort"
          binding="tns:EmployeeServiceImplPortBinding">
            <soap:address
              location="http://localhost:8080/employeeservice"/>
        </port>
    </service>
    ...
</definitions>

5トップダウン(契約優先)アプローチ

WSDLファイル employeeservicetopdown.wsdl. を作成することによるトップダウンのアプローチから始めましょう。簡単にするために、このメソッドには1つのメソッドしかありません。

<?xml version="1.0" encoding="UTF-8"?>
<definitions
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:tns="http://topdown.server.jaxws.baeldung.com/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
  targetNamespace="http://topdown.server.jaxws.baeldung.com/"
  qname="EmployeeServiceTopDown">
    <types>
        <xsd:schema
          targetNamespace="http://topdown.server.jaxws.baeldung.com/">
            <xsd:element name="countEmployeesResponse" type="xsd:int"/>
        </xsd:schema>
    </types>

    <message name="countEmployees">
    </message>
    <message name="countEmployeesResponse">
        <part name="parameters" element="tns:countEmployeesResponse"/>
    </message>
    <portType name="EmployeeServiceTopDown">
        <operation name="countEmployees">
            <input message="tns:countEmployees"/>
            <output message="tns:countEmployeesResponse"/>
        </operation>
    </portType>
    <binding name="EmployeeServiceTopDownSOAP"
      type="tns:EmployeeServiceTopDown">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
          style="document"/>
        <operation name="countEmployees">
            <soap:operation
              soapAction="http://topdown.server.jaxws.baeldung.com/              EmployeeServiceTopDown/countEmployees"/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="EmployeeServiceTopDown">
        <port name="EmployeeServiceTopDownSOAP"
          binding="tns:EmployeeServiceTopDownSOAP">
            <soap:address
              location="http://localhost:8080/employeeservicetopdown"/>
        </port>
    </service>
</definitions>

** 5.1. WSDLからのWebサービスソースファイルの生成

WSDLドキュメントからWebサービスのソースファイルを生成するには、JDKの一部である wsimport ツールを使用できます(リンク:/java-home-on-windows-7-8-10-mac-os-x-linux[$])。 JAVA__HOME]/bin)

コマンドプロンプトから:

wsimport -s . -p com.baeldung.jaxws.server.topdown employeeservicetopdown.wsdl

使用されるコマンドラインオプション: -p はターゲットパッケージを指定します。 -s は、生成されたソースファイルを置く場所を指定します。

生成されたファイル:

  • EmployeeServiceTopDown.java - サービスエンドポイントインタフェース

メソッド定義を含む(SEI) ** ObjectFactory.java - のインスタンスを作成するためのファクトリメソッドを含みます。

プログラムでスキーマ派生クラス ** EmployeeServiceTopDown Service.java__ - サービスプロバイダクラスです

JAX-WSクライアントで使用できる

5.2. Webサービスエンドポイントインタフェース

wsimport ツールは、Webサービスエンドポイントインタフェース EmployeeServiceTopDown を生成しました。 Webサービスメソッドを宣言します。

@WebService(
  name = "EmployeeServiceTopDown",
  targetNamespace = "http://topdown.server.jaxws.baeldung.com/")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@XmlSeeAlso({
    ObjectFactory.class
})
public interface EmployeeServiceTopDown {
    @WebMethod(
      action = "http://topdown.server.jaxws.baeldung.com/"
      + "EmployeeServiceTopDown/countEmployees")
    @WebResult(
      name = "countEmployeesResponse",
      targetNamespace = "http://topdown.server.jaxws.baeldung.com/",
      partName = "parameters")
    public int countEmployees();
}

5.3. Webサービスの実装

wsimport ツールはWebサービスの構造を作成しました。 Webサービスの実装を作成する必要があります。

@WebService(
  name = "EmployeeServiceTopDown",
  endpointInterface = "com.baeldung.jaxws.server.topdown.EmployeeServiceTopDown",
  targetNamespace = "http://topdown.server.jaxws.baeldung.com/")
public class EmployeeServiceTopDownImpl
  implements EmployeeServiceTopDown {

    @Inject
    private EmployeeRepository employeeRepositoryImpl;

    @WebMethod
    public int countEmployees() {
        return employeeRepositoryImpl.count();
    }
}

6. ボトムアップ(契約 - 最後)アプローチ

ボトムアップアプローチでは、エンドポイントインタフェースと実装クラスの両方を作成する必要があります。 Webサービスが公開されると、WSDLがクラスから生成されます。

従業員のデータに対して簡単なCRUD操作を実行するWebサービスを作成しましょう。

** 6.1. モデルクラス

Employee モデルクラス:

public class Employee {
    private int id;
    private String firstName;

   //standard getters and setters
}

6.2. Webサービスエンドポイントインタフェース

Webサービスメソッドを宣言するWebサービスエンドポイントインタフェース。

@WebService
public interface EmployeeService {
    @WebMethod
    Employee getEmployee(int id);

    @WebMethod
    Employee updateEmployee(int id, String name);

    @WebMethod
    boolean deleteEmployee(int id);

    @WebMethod
    Employee addEmployee(int id, String name);

   //...
}

このインタフェースはWebサービスの抽象規約を定義します。使用されている注釈:

**

**

  • @ WebResult は、XML要素の名前をカスタマイズするために使用されます。

戻り値を表します

6.3. Webサービスの実装

Webサービスエンドポイントインタフェースの実装クラス

@WebService(endpointInterface = "com.baeldung.jaxws.EmployeeService")
public class EmployeeServiceImpl implements EmployeeService {

    @Inject
    private EmployeeRepository employeeRepositoryImpl;

    @WebMethod
    public Employee getEmployee(int id) {
        return employeeRepositoryImpl.getEmployee(id);
    }

    @WebMethod
    public Employee updateEmployee(int id, String name) {
        return employeeRepositoryImpl.updateEmployee(id, name);
    }

    @WebMethod
    public boolean deleteEmployee(int id) {
        return employeeRepositoryImpl.deleteEmployee(id);
    }

    @WebMethod
    public Employee addEmployee(int id, String name) {
        return employeeRepositoryImpl.addEmployee(id, name);
    }

   //...
}

7. Webサービスエンドポイントの公開

Webサービスを公開する(トップダウンとボトムアップ)には、Webサービス実装のアドレスとインスタンスを javax.xml.ws.Endpoint クラスの publish() メソッドに渡す必要があります。

public class EmployeeServicePublisher {
    public static void main(String[]args) {
        Endpoint.publish(
          "http://localhost:8080/employeeservicetopdown",
           new EmployeeServiceTopDownImpl());

        Endpoint.publish("http://localhost:8080/employeeservice",
          new EmployeeServiceImpl());
    }
}

これで EmployeeServicePublisher を実行してWebサービスを開始できます。 CDI機能を利用するために、Webサービスは、WildFlyやGlassFishなどのアプリケーションサーバーにWARファイルとしてデプロイできます。

8リモートWebサービスクライアント

それでは、 EmployeeService Webサービスにリモートで接続するためのJAX-WSクライアントを作成しましょう。

8.1. クライアント成果物の生成

JAX-WSクライアント成果物を生成するために、もう一度 wsimport ツールを使用できます。

wsimport -keep -p com.baeldung.jaxws.client http://localhost:8080/employeeservice?wsdl

生成された EmployeeService Service クラスは、 URL QName__を使用してサーバーポートを取得するためのロジックをカプセル化します。

8.2. Webサービスへの接続

Webサービスクライアントは生成された EmployeeService Service__を使用してサーバーに接続し、Webサービス呼び出しをリモートで行います。

public class EmployeeServiceClient {
    public static void main(String[]args) throws Exception {
        URL url = new URL("http://localhost:8080/employeeservice?wsdl");

        EmployeeService__Service employeeService__Service
          = new EmployeeService__Service(url);
        EmployeeService employeeServiceProxy
          = employeeService__Service.getEmployeeServiceImplPort();

        List<Employee> allEmployees
          = employeeServiceProxy.getAllEmployees();
    }
}

9結論

この記事は、JAX-WSを使ったSOAP Webサービスの簡単な紹介です。

JAX-WS APIを使用してSOAP Webサービスを作成するために、ボトムアップとトップダウンの両方のアプローチを使用しました。また、リモートからサーバーに接続してWebサービスを呼び出すことができるJAX-WSクライアントも作成しました。

完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/jee-7[GitHubで利用可能]です。