JAX-WS Web サービスでの MTOM の使用可能化
Java™ API for XML-Based Web Services (JAX-WS) を使用する場合、Web サービス要求のほかに、イメージやファイルなどのバイナリー添付を送信することができます。JAX-WS では、SOAP Message Transmission Optimization Mechanism (MTOM) 仕様に指定された、 バイナリー・データの最適化伝送のサポートが追加されています。
このタスクについて
JAX-WS は、バイナリー添付データの送信用に SOAP Message Transmission Optimized Mechanism (MTOM) の使用をサポートします。MTOM を有効にすることにより、 バイナリー・データを XML 文書に組み込むために必要なデータ・エンコードを行うコストを負担することなく、 バイナリー・データの送受信を最適に行うことができます。
アプリケーション・サーバーは、JAX-WS アプリケーションの場合にのみ、MTOM を使用した添付の送信をサポートします。 本製品は、新規の MTOM および XOP 規格を使用することによって、Web Services Security SOAP メッセージに添付を提供する機能も提供します。
JAX-WS アプリケーションは、XML 文書内に含まれる base64 または hexBinary エンコード・データとして、バイナリー・データを送信できます。 しかし、MTOM が備える最適化機能を利用するには、MTOM を使用可能にして、 バイナリーの base64 データを XML 文書外に含まれる添付として送信してください。MTOM 最適化は、デフォルトでは使用不可になっています。 JAX-WS アプリケーションでは、MTOM サポートを有効にするために、クライアント成果物とサーバー成果物の両方を別個に構成する必要があります。
手順
タスクの結果
MTOM を使用してバイナリー・データを最適な状態で送受信する、JAX-WS Web サービスのサーバーおよびクライアント・アプリケーションを開発しました。
例
以下の例は、WSDL ファイルから開始する際に、Web サービスのクライアント・エンドポイントとサーバー・エンドポイントの両方で MTOM サポートを有効にする方法を示しています。
- xsd:base64Binary エレメントを含む WSDL ファイルを見つけます。
次の例は、xsd:base64Binary エレメントを含む WSDL ファイルの一部分です。
<types> ........ <xs:complexType name="ImageDepot"> <xs:sequence> <xs:element name="imageData" type="xs:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xs:sequence> </xs:complexType> ........ </types>
- WSDL ファイルの app_server_root¥bin¥
ディレクトリーから wsimport コマンドを実行して、一連の JAX-WS 移植可能成果物を生成します。
WSDL ファイルに含まれる expectedContentTypes 値に応じて、 生成される JAXB 成果物は次の表に記述されている Java タイプになります。
表 1. MIME タイプおよび Java 型のマッピング. MIME タイプと Java 型のマッピングについて説明します。 MIME タイプ Java 型 image/gif java.awt.Image image/jpeg java.awt.Image text/plain java.lang.String text/xml javax.xml.transform.Source application/xml javax.xml.transform.Source */* javax.activation.DataHandler - 他の JAX-WS アプリケーションと同様に、JAXB 成果物を使用します。 これらの Bean を使用して、ディスパッチ・クライアント API と動的プロキシー・クライアント API の両方からバイナリー・データを送信します。
- ディスパッチ・クライアントで MTOM を使用可能にします。
//Create the Dispatch instance. JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom"); Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD); //Enable MTOM. SOAPBinding binding = (SOAPBinding) dispatch.getBinding(); binding.setMTOMEnabled(true);
- 動的プロキシー・クライアントで MTOM を使用可能にします。
JAX-WS クライアントを MTOM 対応にしたので、サーバーに送られるメッセージでも MTOM が使用可能になっています。しかし、サーバーが MTOM を使用してクライアントに応答する場合は、 エンドポイントで MTOM を使用可能にする必要があります。//Create the Dynamic Proxy instance. Service svc = Service.create(serviceName); MtomSample proxy = svc.getPort(portName, MtomSample.class); //Enable MTOM. BindingProvider bp = (BindingProvider) proxy; SOAPBinding binding = (SOAPBinding) bp.getBinding(); binding.setMTOMEnabled(true);
- エンドポイント実装クラスで MTOM を使用可能にします。
jaxax.xml.ws.SOAPBinding クラスには、サポートされるバインディング・タイプごとに静的メンバーが含まれています。 SOAP11HTTP_MTOM_BINDING または SOAP12HTTP_MTOM_BINDING のいずれかを、@BindingType アノテーションの値として含めます。 この値により、すべてのサーバー応答で MTOM が使用可能になります。@MTOM(enabled, threshold=4096) @WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample") public class MtomSampleService implements MtomSample { .... }
サーバーおよびクライアントで MTOM を使用可能にすると、 添付を表すバイナリー・データは Multipurpose Internet Mail Extensions (MIME) 添付として SOAP メッセージに組み込まれます。MTOM を使用しない場合、 同じデータは XML スキーマを記述するフォーマット (base64 または 16 進エンコード) でエンコードされて、 XML 文書にインラインで組み込まれます。
... other transport headers ...
Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812;
type="application/xop+xml"; start="
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: application/xop+xml; charset=UTF-8; type="text/xml";
content-transfer-encoding: binary
content-id:
<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include"
href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/>
</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812
content-type: text/plain
content-transfer-encoding: binary
content-id:
<1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org>
… binary data goes here …
--MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
... other transport headers ...
Content-Type: text/xml; charset=UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom">
<input>
<imageData>R0lGADl ... more base64 encoded data ... KTJk8giAAA7</imageData>
</input>
</sendImage>
</soapenv:Body>
</soapenv:Envelope>
追加情報については、インフォメーション・センターの『サンプル』セクションを参照してください。このセクションには、JAX-WS Web サービスでの MTOM の使用方法を示すサンプルがあります。