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で利用可能]です。