Cosminexus V11 アプリケーションサーバ SOAPアプリケーション開発の手引

手引・文法書

3021-3-J25-20

前書き

対象製品

マニュアル「アプリケーションサーバ & BPM/ESB基盤 概説」の前書きの対象製品の説明を参照してください。

輸出時の注意

本製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認の上、必要な手続きをお取りください。

なお、不明な場合は、弊社担当営業にお問い合わせください。

商標類

HITACHI，Cosminexus，TPBrokerは，株式会社 日立製作所の商標または登録商標です。

AIXは，世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

AMDは，Advanced Micro Devices, Inc.の商標です。

Itaniumは，アメリカ合衆国および / またはその他の国における Intel Corporation またはその子会社の商標です。

Linuxは，Linus Torvalds氏の日本およびその他の国における登録商標または商標です。

Microsoftは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

OracleとJavaは，Oracle Corporation 及びその子会社，関連会社の米国及びその他の国における登録商標です。文中の社名，商品名等は各社の商標または登録商標である場合があります。

Red Hat is a registered trademark of Red Hat, Inc. in the United States and other countries.

Red Hatは，米国およびその他の国におけるRed Hat, Inc.の登録商標です。

Red Hat Enterprise Linux is a registered trademark of Red Hat, Inc. in the United States and other countries.

Red Hat Enterprise Linuxは，米国およびその他の国におけるRed Hat, Inc.の登録商標です。

UNIXは，The Open Groupの商標です。

Windowsは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

Windows Serverは，米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。

その他記載の会社名，製品名などは，それぞれの会社の商標もしくは登録商標です。

This product includes software developed by the Apache Software Foundation (http://www.apache.org/).

SOAPアプリケーション開発支援機能およびSOAP通信基盤は，Common Public License Version 1.0に基づいて配布されているWSDL4Jを利用しています。

マイクロソフト製品のスクリーンショットの使用について

マイクロソフトの許可を得て使用しています。

発行

2021年 3月　3021-3-J25-20

著作権

All Rights Reserved. Copyright (C) 2020, 2021, Hitachi, Ltd.

変更内容

変更内容(3021-3-J25-20) uCosminexus Application Server 11-10，uCosminexus Client 11-10，uCosminexus Developer 11-10，uCosminexus Service Architect 11-10，uCosminexus Service Platform 11-10

追加・変更内容

変更個所

記載内容は変更なし（リンク情報だけを変更した）。

−

単なる誤字・脱字などはお断りなく訂正しました。

はじめに

このマニュアルをお読みになる際の前提情報については，マニュアル「アプリケーションサーバ & BPM/ESB基盤 概説」のはじめにの説明を参照してください。

第1編　概要

1　Application Serverで実現するSOAPアプリケーションの概要

Application Serverでは，SOAPアプリケーションを開発，実行するための機能を提供しています。

この章では，SOAPアプリケーションを開発，実行するに当たり，前提知識となるWebサービスの概要とSOAPに関する技術について説明します。また，SOAPアプリケーション開発支援機能の特長についても説明します。

なお，このマニュアルでは，JAX-WS仕様に対応したWebサービスの開発方法については説明していません。JAX-WS仕様に対応したWebサービスの開発方法については，マニュアル「アプリケーションサーバ Webサービス開発ガイド」を参照してください。

1.1　マニュアルの説明，プレフィクスと名前空間URI

このマニュアルでは，SOAPおよびWSDLの技術を利用して開発し，ネットワーク上でサービスを提供するアプリケーションのことをSOAPアプリケーションと表記します。また，アプリケーションサーバが提供するSOAPアプリケーション開発用の機能をSOAPアプリケーション開発支援機能，SOAPアプリケーション実行用の環境をSOAP通信基盤と表記します。

注意

JAX-WS仕様に対応したWebサービスを開発する場合，SOAPアプリケーション開発支援機能およびSOAP通信基盤ではなく，JAX-WS機能（開発用のコマンドラインインタフェースと通信基盤）を使用します。

SOAPアプリケーション開発支援機能およびSOAP通信基盤と，JAX-WS機能の間に互換性はありません。JAX-WS機能を使用したWebサービスの開発方法については，マニュアル「アプリケーションサーバ Webサービス開発ガイド」を参照してください。

また，JAX-WS機能への切り替えに当たっての注意事項については，「1.6　JAX-WS仕様に対応したWebサービスを開発する場合の注意事項」を参照してください。

このマニュアルの対象となるSOAPアプリケーション開発支援機能，およびSOAP通信基盤は，アプリケーションサーバを構成する次のプログラムプロダクトで提供されています。

SOAPアプリケーション開発支援機能（Component Container）

Developer

Service Architect

SOAP通信基盤（Component Container）

Application Server

Service Platform

SOAP通信基盤（Component Container Client）

Client

なお，Cosminexus 08-00からコネクションプーリングのデフォルト設定が無効になりました。コネクションプーリングを使用する場合，「7.4　コネクションプーリング」を参照し，その内容を十分に理解した上で使用してください。

このマニュアルで使用している表記について説明します。

コーディング例で使用する記号

このマニュアルでは，次に示す記号を使用して，コーディング例を記述しています。

記号

意味

…

リーダ

記述が省略されていることを示します。この記号の直前に示された項目を繰り返し複数個指定できます。

（例）

値…では，「値を必要個指定する」ことを示します。

/*　*/

//

コメント文として扱うことを示します。

（例）

//メッセージを送信する

コマンドの形式で使用する記号

このマニュアルでは，次に示す記号を使用して，コマンドの形式を記述しています。

記号

意味

［　］

この記号で囲まれている項目は，省略してもよいことを示します。

<　>

この記号で囲まれている項目は，サービスロケーションやファイルなどの可変値を指定することを示します。

Windowsの場合のフォルダとパスの表記

このマニュアルでは，Windows，AIX，およびLinuxで共通の内容の場合，Windowsの「フォルダ」を「ディレクトリ」と表記しています。また，「¥」を「/」と表記しています。

Windowsの場合，「ディレクトリ」を「フォルダ」に，「/」を「¥」に置き換えてお読みください。

プレフィクスと名前空間URIの対応

このマニュアルで使用するプレフィクスと名前空間URIの対応を次に示します。特に断りがないかぎり，次のプレフィクスを使用します。

プレフィクス

名前空間URI

soap

http://schemas.xmlsoap.org/wsdl/soap/

soapenc

http://schemas.xmlsoap.org/soap/encoding/

soapenv

http://schemas.xmlsoap.org/soap/envelope/

wsdl

http://schemas.xmlsoap.org/wsdl/

wsi

http://ws-i.org/profiles/basic/1.1/xsd

xsd

http://www.w3.org/2001/XMLSchema

xsd2000

http://www.w3.org/2000/10/XMLSchema

xsi

http://www.w3.org/2001/XMLSchema-instance

1.2　Webサービスの概要

SOAPアプリケーションの説明に入る前に，まずその上位概念となるWebサービスの概要について説明します。

Webサービスは，インターネット上に分散するアプリケーションが提供するサービスを，クライアントにAPIとして提供することを目的としています。Webサービスは，相互接続のためのデータ形式やセキュリティ方式などのインタフェースだけを定義しています。トランスポートプロトコルなどのインタフェース以外については定義していないため，柔軟な相互接続が期待できます。Webサービスに関連する仕様は，基本的にXMLがベースになっています。基礎技術としてはSOAP，WSDL，UDDIが挙げられます。また，SOAPを対象としたセキュリティ仕様として，WS-Securityがあります。次に，Webサービスの一例を示します。

図1‒1　Webサービスの一例

Webサービスでは，柔軟にシステム間を相互接続するという概念上，未知のサービスを発見する手段があります。未知のサービスを発見するために，UDDIレジストリを利用します。UDDIレジストリを利用したWebサービスの利用の流れを示します。

サービス提供者は，UDDIレジストリに，サービスの内容，アドレスを登録して公開します。

サービス利用者は，UDDIレジストリにアクセスし，求めるサービスを検索します。

UDDIレジストリは，サービス利用者に，該当するサービスの内容，アドレスを提供します。

サービス利用者は，取得したアドレスに接続し，サービスを要求します。

サービス提供者は，サービス利用者にサービスを提供します。

サービス利用者とサービス提供者がやり取りするSOAPメッセージは，Webサービスセキュリティの機能を使用することによって，機密情報を保護します。Webサービスセキュリティの機能については，マニュアル「アプリケーションサーバ Webサービスセキュリティ構築ガイド」を参照してください。

1.3　SOAPアプリケーションの概要

SOAPアプリケーションとは，Webの標準技術を利用してネットワーク上でサービスを公開，実行できるアプリケーションのことをいいます。SOAPアプリケーションでは，クライアントとサーバ間のメッセージ交換用のプロトコルにSOAPを利用しています。クライアント側はサーバにメッセージを送信することで，サーバ側で提供されるSOAPサービスを利用します。次に，SOAPアプリケーションの処理の流れを示します。

図1‒2　SOAPアプリケーションの処理の流れ

リクエストメッセージを受けたSOAPサービスが処理を実行し，処理結果が必要な場合は，レスポンスメッセージをクライアントに返します。

次に，SOAPアプリケーションによるシステム開発の特長について示します。

相互接続性の高いシステムを開発できる

拡張性の高いシステムが開発できる

メッセージレベルでセキュアなシステムが開発できる

●相互接続性の高いシステムを開発できる

SOAPではオブジェクトへのアクセスを実現するために，下位のトランスポート層にWeb標準のプロトコル（HTTP）を利用できます。また，オブジェクトにアクセスするメッセージには，XMLの技術を利用します。したがって，Web標準のプロトコルやXMLの技術を利用した既存のシステムを拡張して，相互接続性の高いシステムを開発できます。さらに，開発したシステムをWS-Iが定めるBasic Profileに適合させることで，他社製品で構築したシステムとの相互接続性をより高めることができます。「付録C　WS-I Basic Profileに適合したシステムを構築するための注意事項」を参考に開発されることをお勧めします。

●拡張性の高いシステムが開発できる

SOAPアプリケーションでは，クライアントとサーバ間でやり取りするメッセージの形式にXMLの技術を利用しています。XML形式のデータは拡張性が高く，データの記述，交換に適しているため，拡張性の高いアプリケーションを開発できます。

●メッセージレベルでセキュアなシステムが開発できる

SOAPアプリケーションでは，従来からの通信路のセキュリティに加え，メッセージレベルでのセキュリティをサポートしています。通信路のセキュリティについては「14.8　FAQ」を参照してください。

メッセージレベルでのセキュリティについては，マニュアル「アプリケーションサーバ Webサービスセキュリティ構築ガイド」を参照してください。

1.4　SOAPアプリケーションを支える技術

SOAPアプリケーションを実現するには，実装するための基本的なプロトコルであるSOAPと，実装時のインタフェース定義で使用するWSDLについて理解する必要があります。また，公開されているサービスを利用するためには，UDDIの理解も必要です。ここでは，SOAP，WSDL，およびUDDIの概要について説明します。

1.4.1　SOAPの概要

SOAPを利用してやり取りするメッセージの構造やメッセージの送受信に関する仕様が，SOAP1.1仕様としてW3Cで規定されています。次に，SOAP 1.1として規定されている仕様の概要について示します。

SOAPメッセージ

クライアントとサーバ間でやり取りするメッセージの構造を規定しています。SOAPメッセージは，SOAPエンベロープと呼ばれるXMLドキュメントの形式の構造を持ち，SOAPヘッダとSOAPボディという要素を持ちます。SOAPボディには，送受信するメッセージを記述します。SOAPメッセージの構造を次に示します。

図1‒3　SOAPメッセージの構造

SOAP符号化規則

SOAPアプリケーションで使用する変数，配列などのデータを，XML文書であるSOAPメッセージ中にどのように記述するかを規定します。データ型とそのXML記述形式とのマッピングルールです。

SOAPエンコーディング

SOAP符号化規則の一つで，SOAP1.1仕様で定義されます。

この符号化規則を使用する場合，encodingStyle属性には"http://schemas.xmlsoap.org/soap/encoding/"を指定し，use属性には"encoded"を指定します。広く使われていますが，WS-I Basic Profile 1.0a に対応する場合には推奨されていません。

リテラルエンコーディング

SOAP符号化規則の一つで，符号化に際して具体的なXMLスキーマ定義を参照します。この符号化規則を使用する場合，encodingStyle属性は指定せず，use属性には"literal"を指定します。WS-I Basic Profile 1.0a ではSOAPエンコーディングではなく，こちらを使用することが推奨されています。

SOAP Fault

SOAPメッセージの処理中に発生したエラーを記述するためのSOAPメッセージを表します。SOAP Faultは，SOAPエンジンが作成するものと，SOAPサービスの開発者が作成するものに分けられます。

HTTPバインディング

HTTPを利用したSOAPメッセージの交換について規定しています。ただし，HTTPバインディングはNoteでの規定となっており，SOAPの仕様として，トランスポートに何を使用するかは規定していません。

RPC構造

SOAPでRPCを行うための構造化の形式を規定します。

SOAPアプリケーション開発支援機能とSOAP 1.1のサポート範囲の関係については，「12.1　SOAP 1.1との対応」を参照してください。

1.4.2　WSDLの概要

WSDLとはインタフェース定義の言語仕様の一つで，開発したプログラムにアクセスするためのインタフェース定義を記述します。

記述形式にXMLの技術を採用し，開発したプログラムのオブジェクトが提供する機能，および使用するパラメタを，XMLタグの形式で表現できるようにします。WSDLを利用することで，SOAPアプリケーション同士でコミュニケーションを取るときにインタフェース定義を共有できます。SOAPアプリケーション開発支援機能では，SOAPアプリケーション開発支援機能で提供する開発支援コマンドによってWSDLからSOAPアプリケーションに必要なソースコードを生成できます。

次に，WSDL 1.1で規定されているWSDLの構造を示します。

図1‒4　WSDLの構造

SOAPアプリケーション開発支援機能とWSDL 1.1のサポート範囲の関係については，「12.2　WSDL 1.1との対応」を参照してください。

1.4.3　UDDIの概要

UDDIはWebサービスに関する情報を公開したり，検索したりするためのAPI，およびその情報を格納するUDDIレジストリを規定しています。SOAPアプリケーションの情報もUDDIで公開したり，検索したりできます。

次に，UDDIのデータ構造，UDDIのAPI，およびUDDIレジストリについて説明します。

UDDIのデータ構造

UDDI Version 2.0では五つのデータ構造に関して規定されています。

businessEntity

サービスを公開，管理する主体を記述します。複数のbusinessServiceを含みます。

businessService

サービス仕様やサービス内容を記述します。複数のbindingTemplateを含みます。

bindingTemplate

サービスに接続するための情報（エンドポイント）やサービスの構成に関する技術情報を記述します。bindingTemplateはtModelの参照情報だけを含みます。

tModel

サービスの技術仕様や分類に関する情報を記述します。

publisherAssertion

二つのbusinessEntityの関係を記述します。

五つのデータ構造の関係を次の図に示します。

図1‒5　UDDIのデータ構造の関係（例）

UDDIのAPI

UDDI Version 2.0では，照会APIと発行APIに関して規定されています。

照会API

データ構造を検索（find）したり，詳細情報を取得（get）したりするためのAPIです。

発行API

データ構造を登録更新（save）したり，削除（delete）したりするためのAPIです。

UDDIレジストリ

UDDIレジストリは，UDDIのデータ構造を格納管理するためのデータベースであり，UDDIのAPIを受け付けて処理する機能を持っています。UDDIレジストリは，パブリックとプライベートに分類されます。パブリックUDDIレジストリは，インターネット上に配置され，全世界で同じUDDIデータ構造を共有します。プライベートUDDIレジストリは，企業や組織といった限られた範囲で運用されるUDDIレジストリです。

1.5　SOAPアプリケーション開発支援機能の特長

Application Serverでは，SOAPアプリケーションを開発する機能として，SOAPアプリケーション開発支援機能，SOAPアプリケーションを実行，運用する基盤としてSOAP通信基盤を提供します。SOAPアプリケーション開発支援機能では，RPC形態およびメッセージング形態のSOAPアプリケーションを開発できます。

RPC形態のSOAPアプリケーションの概要については，「2.1.1　RPC形態のSOAPアプリケーション」を参照してください。メッセージング形態のSOAPアプリケーションの概要については，「2.1.2　メッセージング形態のSOAPアプリケーション」を参照してください。

ここでは，SOAPアプリケーション開発支援機能の特長について説明します。

1.5.1　開発支援コマンドを使用して効率良く開発できる

SOAPアプリケーションは開発支援コマンドを使用して開発できます。開発支援コマンドを使用することで，SOAPアプリケーションの開発，実行に必要なファイルやソースコードを自動的に生成できます。

開発支援コマンドが提供する機能を示します。

WSDLの生成

JavaインタフェースおよびJavaクラスから，インタフェース定義を記述したWSDLを生成できます。

ソースコードの生成

WSDLからサーバとクライアントのアクセスに必要なソースコード（スタブとスケルトン）を生成できます。ソースコードを生成することで，複雑な処理を記述する必要はなくなり，業務ロジックの開発に注力できます。

サービスデプロイ定義の生成

デプロイに関する情報を記述したサービスデプロイ定義を生成できます。

1.5.2　既存のJavaプログラムを有効活用できる

SOAPアプリケーションを新規開発するだけでなく，既存のJavaプログラムをSOAPアプリケーションとして利用できます。JavaアプリケーションやEJBなど既存のプログラムを有効活用できるため，SOAPアプリケーション用にプログラムを一から作り直す必要はありません。

1.6　JAX-WS仕様に対応したWebサービスを開発する場合の注意事項

JAX-WS仕様に対応したWebサービスを開発する場合，SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用するのではなく，JAX-WS機能（開発用のコマンドラインインタフェースと通信基盤）に切り替える必要があります。

なお，SOAPアプリケーション開発支援機能およびSOAP通信基盤と，JAX-WS機能の間に互換性はありません。

JAX-WS仕様に対応したWebサービスの開発方法については，マニュアル「アプリケーションサーバ Webサービス開発ガイド」を参照してください。

2　SOAPアプリケーションを開発する前に

この章では，SOAPアプリケーションを開発する前に必要なSOAPアプリケーションの形態の選択について説明します。また，SOAPアプリケーションの開発，実行で必要な前提環境について説明します。

2.1　SOAPアプリケーションの形態の選択

SOAPアプリケーションでは，サーバとクライアント間のデータの受け渡しに，RPCまたはメッセージングのどちらかを利用します。SOAPアプリケーションを開発する前に，どちらの形態を利用するかを決める必要があります。

SOAPアプリケーションの形態，および各形態の利点を次に示します。

図2‒1　SOAPアプリケーションの形態と利点

RPC形態のSOAPアプリケーション

RPC形態のSOAPアプリケーションでは，関数呼び出しによってSOAPメッセージを扱います。サーバとクライアント間の処理に必要なWSDLおよびJavaクラスは，開発支援コマンドで生成できます。

RPC形態のSOAPアプリケーションでは，スタブまたはDII（Dynamic Invocation Interface）を使用してクライアント側の処理を実装します。

また，WSDLのスタイルとして，RPCスタイルまたはDOCUMENTスタイルを選択します。WSDLのスタイルは，構築するシステムに応じて選択してください。RPCスタイルおよびDOCUMENTスタイルについては，「3.3.2　WSDLのスタイルの指定」を参照してください。

メッセージング形態のSOAPアプリケーション

メッセージング形態のSOAPアプリケーションでは，SOAPメッセージを直接扱います。サーバとクライアント間の処理は，Java API（SAAJ）を使用して実装します。

2.1.1　RPC形態のSOAPアプリケーション

RPC形態のSOAPアプリケーションでは，次のどちらかの方法でSOAPサービスを利用します。

スタブを使用する

DII（Dynamic Invocation Interface）を使用する

また，スタブを使用する場合，SOAPアプリケーションのプログラムにEJBを利用することもできます。

ここでは，各方法の概要について説明します。なお，RPC形態のSOAPアプリケーションを開発するには，WSDLが必要になります。WSDLを使用した開発方法については，「3.1　RPC形態のSOAPアプリケーション開発の流れ」を参照してください。

また，RPC形態のSOAPアプリケーションの開発例については，「4.　RPC形態のSOAPアプリケーションの開発例」を参照してください。

(1)　スタブを使用する場合

クライアントとサーバ間のインタフェースに関する処理を隠蔽したスタブおよびスケルトンを介して，SOAPメッセージを送受信します。

スタブを使用したRPC形態のSOAPアプリケーションを実現するには，クライアント側にSOAPサービス呼び出し処理を，サーバ側にSOAPサービスを実装します。クライアント側に実装するSOAPサービス呼び出し処理は，開発支援コマンドによって自動生成されるスタブを使用し，SOAPサービスに渡す引数や戻り値に関する処理を記述することで実装できます。スタブの使用方法については，「4.1.8　クライアント側の処理を実装する」を参照してください。スタブを使用してRPC形態のSOAPアプリケーションを実現する場合の処理の流れを示します。

図2‒2　RPC形態のSOAPアプリケーションの処理の流れ（スタブ）

図に沿って，SOAPアプリケーションの処理の流れを説明します。図中に示した番号が次に示す番号に対応しています。

SOAPサービス呼び出し処理では，SOAPサービスのURL，メソッド名，および引数をAPIで指定し，SOAPサービスを呼び出します。

SOAPクライアントライブラリは，APIで指定された内容からSOAPメッセージを作成し，SOAPエンジンに対してリクエストメッセージを送信します。

リクエストメッセージを受信したSOAPエンジンは，SOAPメッセージから呼び出すSOAPサービス，メソッド，および引数を解析して，SOAPサービスを呼び出します。

SOAPサービスはパラメタの内容によって処理をして，結果を戻り値としてSOAPエンジンに返します。

SOAPエンジンは戻り値によってSOAPメッセージを作成し，レスポンスメッセージをSOAPクライアントライブラリに送信します。

レスポンスメッセージを受信したSOAPクライアントライブラリは，SOAPメッセージから戻り値を解析し，呼び出し元に返します。

(2)　EJBを利用する場合

EJBを利用したSOAPアプリケーションは，次の形態に分けられます。

EJBからSOAPサービスを呼び出す形態

EJBをSOAPサービスのエンドポイントとする形態

EJBからSOAPサービスを呼び出す形態の処理は，クライアント部分をEJBで実装することを除けば，EJBを利用しない場合と同様です。

EJBをSOAPサービスのエンドポイントとする形態の処理の流れを次に示します。

図2‒3　EJBをSOAPサービスのエンドポイントとする場合の処理の流れ

図に沿って，EJBをSOAPサービスのエンドポイントとする形態の処理を説明します。図中に示した番号が次に示す番号に対応しています。

クライアント側でSOAPメッセージを生成し，送信先にリクエストメッセージを送信します。

メッセージを受信したSOAPエンジンは，J2EEサーバに配置されたEJBを呼び出します。EJBの呼び出しには，ホームインタフェースおよびリモートインタフェースを利用します。SOAPエンジンと同じJ2EEサーバに配置されたEJBだけでなく，別のJ2EEサーバに配置されたEJBを呼び出すこともできます。

呼び出されたEJBによって処理を行い，処理結果をSOAPエンジンに返します。

SOAPエンジンは，処理結果をクライアントに返します。

SOAPサービスのエンドポイントとして配置できるEJBは，J2EEサーバに配置された，Stateless Session Bean，Stateful Session Bean，およびEntity Beanです。

なお，EJBを利用したSOAPアプリケーションの開発例については，「4.3　既存のEJBを利用して開発する場合」を参照してください。EJBからSOAPサービスを呼び出す場合の注意事項については，「3.12　EJB利用時の注意事項」の「EJBからSOAPサービスを呼び出す場合の注意事項」を参照してください。

(3)　DIIを使用する場合

DIIとは，サービスインタフェースおよびスタブを使用しないで，JAX-RPCで定義された標準APIでSOAPサービスを呼び出す機能です。スタブを使用しないため，呼び出し先は特定のサービスに固定されることなく，動的に呼び出し先を変更できます。

DIIを使用してRPC形態のSOAPアプリケーションを実現する場合の処理の流れを示します。

図2‒4　RPC形態のSOAPアプリケーションの処理の流れ（DII）

図に沿って，SOAPアプリケーションの処理の流れを説明します。図中に示した番号が次に示す番号に対応しています。

オペレーション名やパラメタなどのサービス呼び出しに必要な情報をCallオブジェクトに入力し，SOAPサービスを呼び出します。サービス呼び出しに必要な情報は，WSDLから読み込んで保持します。

SOAPクライアントライブラリ（JAX-RPC API）は，入力した情報をリクエストメッセージに含め，サーバに送信します。

リクエストメッセージを受信したSOAPエンジンは，SOAPメッセージから呼び出すSOAPサービス，メソッド，および引数を解析して，SOAPサービスを呼び出します。

SOAPサービスはパラメタの内容によって処理をして，結果を戻り値としてSOAPエンジンに返します。

SOAPエンジンは戻り値によってSOAPメッセージを作成し，レスポンスメッセージをSOAPクライアントライブラリに送信します。

レスポンスメッセージを受信したSOAPクライアントライブラリは，SOAPメッセージから戻り値を解析し，呼び出し元に返します。

2.1.2　メッセージング形態のSOAPアプリケーション

メッセージング形態のSOAPアプリケーションでは，クライアントとサーバ間で任意のXMLデータをSOAPメッセージとして送受信します。メッセージングでは，SOAPメッセージを直接処理するため，XML形式で表す複雑なメッセージを扱うことができます。

メッセージング形態のSOAPアプリケーションは，SAAJを利用して開発できます。なお，メッセージング形態のSOAPアプリケーションでは，WSDLは使用しません。

SAAJでは，メッセージ送信クラスを提供し，クライアントとサーバ間のインタフェースに関する処理を隠蔽するようにしています。

SAAJを利用したSOAPアプリケーションを実現するには，クライアント側にメッセージ生成処理を，サーバ側にSOAPサービスを実装します。メッセージ生成処理は，SAAJを使用して，ユーザが開発する必要があります。使用するAPIについては，「12.3　SAAJ 1.2との対応」を参照してください。次に，SAAJを使用したメッセージングによるSOAPアプリケーションの処理の流れを示します。

図2‒5　メッセージング形態のSOAPアプリケーションの処理の流れ（SAAJ）

図に沿って，SAAJを利用したSOAPアプリケーションの処理を説明します。図中に示した番号が次に示す番号に対応しています。

メッセージ生成処理では，送信先と送信するメッセージを，提供するAPIに渡します。送信するメッセージはユーザがSAAJのAPIを利用して作成する必要があります。

SOAPクライアントライブラリ（SAAJ）は，APIで指定されたメッセージを含んだSOAPメッセージを作成し，送信先にメッセージを送信します。

メッセージを受信したSOAPエンジン（SAAJ）は，ユーザ指定部分を解析して取り出し，SOAPサービスを呼び出します。SOAPサービスを実装するメソッドは，あらかじめ登録しておく必要があります。

SOAPサービスはメッセージの内容を解析し，処理をします。また，必要があればレスポンスメッセージを作成し，SOAPエンジンに返します。

レスポンスメッセージを受け取った場合，SOAPエンジン（SAAJ）はSOAPサービスを実装するメソッドが返したメッセージをクライアントに返信します。

SOAPクライアントライブラリ（SAAJ）は，受信したSOAPメッセージの中からユーザ指定部分を解析して取り出し，メッセージを返します。

SAAJを利用したSOAPアプリケーションの開発例については，「6.　メッセージング形態のSOAPアプリケーションの開発例」を参照してください。

2.2　SOAPアプリケーションの前提環境

SOAPアプリケーションの開発および実行時に必要な前提環境について示します。

また，SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用する前に注意が必要なコネクションプーリングについて説明します。

2.2.1　開発時および実行時の前提環境

SOAPアプリケーションはDeveloperを利用して開発し，Application Serverを利用して実行します。

Developerの前提OSおよび前提ソフトウェアについては，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

Application Serverの前提OSおよび前提ソフトウェアについては，マニュアル「アプリケーションサーバ & BPM/ESB基盤 概説」を参照してください。

また，次の場合にはWSDL4Jが必要になります。Application ServerまたはDeveloperをインストールしたあとに，WSDL4Jをインストールしてください。

SOAPアプリケーションを開発する

DIIを使用したRPC形態のSOAPアプリケーションを実行する

次の場合にはWSDL4Jをインストールする必要はありません。

スタブを使用したRPC形態のSOAPアプリケーションを実行する

メッセージング形態のSOAPアプリケーションを実行する

2.2.2　.NET Frameworkを使用する場合の前提環境

Application Serverで動作するSOAPサービスは，.NET Frameworkを使用して開発したクライアントアプリケーションから利用できます。

開発時の前提環境

.NET Frameworkを使用してSOAPアプリケーションを開発する場合，次のプログラムを追加してください。

Microsoft(R) .NET Framework 2.0 Software Development Kit

開発時に使用できる言語はC#です。

実行時の前提環境

.NET Frameworkを使用して開発したSOAPアプリケーションを実行する場合，次のプログラムをクライアント側に追加してください。

Microsoft(R) .NET Framework Version 2.0

2.2.3　コネクションプーリング利用時の注意事項

Application Server 08-00およびDeveloper 08-00から，コネクションプーリングのデフォルト設定を無効（使用しない）に変更しています。

コネクションプーリングを使用する場合，「7.4　コネクションプーリング」を参照し，その内容を十分に理解した上で使用してください。

2.3　SOAPアプリケーション開発支援機能およびSOAP通信基盤の設定

SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用する場合の設定について説明します。

バージョンアップインストールする場合は，「付録A　SOAPアプリケーションの移行」を参照してください。

2.3.1　J2EEサーバ用オプション定義ファイルの定義内容

SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用するには，J2EEサーバ用オプション定義ファイルで定義します。

J2EEサーバ用オプション定義ファイルのadd.class.pathの「hitsaaj.jar」の行を有効にし，「cjjaxws.jar」と「cjjaxrs.jar」の行を無効にします。次の例に従って定義してください。

...
add.class.path=<cosminexus.home>¥c4web¥lib¥hitsaaj.jar
#add.class.path=<cosminexus.home>¥jaxws¥lib¥cjjaxws.jar
#add.class.path=<cosminexus.home>¥jaxrs¥lib¥cjjaxrs.jar
...

J2EEサーバ用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

注意事項

「hitsaaj.jar」，「cjjaxws.jar」，および「cjjaxrs.jar」のすべてのコメントを外した場合，またはすべてにコメントを付けた場合の動作は保証されません。

以降では，J2EEサーバ用オプション定義ファイルの編集方法を説明します。

ここで説明するどの方法でも，J2EEサーバ用オプション定義ファイルを編集（保存）したあとに，J2EEサーバを再起動してください。J2EEサーバを再起動しない場合は，編集内容が反映されません。

2.3.2　直接編集する場合

直接編集する場合，次の場所に格納されたJ2EEサーバ用オプション定義ファイルをテキストエディタで開き，内容を変更します。

<Application Serverのインストールディレクトリ>/CC/server/usrconf/ejb/<J2EEサーバ名>/usrconf.cfg

2.3.3　Management Serverの運用管理ポータルを利用する場合

Management Serverの運用管理ポータルを利用する場合，［J2EEコンテナの設定］画面の「拡張パラメタ」で設定します。

SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用する場合の設定例を次に示します。

図2‒6　運用管理ポータルによるSOAPアプリケーション開発支援機能／SOAP通信基盤の設定例

運用管理ポータルの［J2EEコンテナの設定］画面については，マニュアル「アプリケーションサーバ 運用管理ポータル操作ガイド」を参照してください。

2.3.4　Smart Composer機能を利用する場合

Smart Composer機能を利用する場合は，簡易構築定義ファイルに，J2EEの拡張パラメタとして追加します。Smart Composer機能および簡易構築定義ファイルについては，マニュアル「アプリケーションサーバ システム構築・運用ガイド」を参照してください。

SOAPアプリケーション開発支援機能およびSOAP通信基盤を利用する場合の設定例を次に示します。

<param>
 <param-name>add.class.path</param-name>
 <param-value>&lt;cosminexus.home&gt;¥c4web¥lib¥hitsaaj.jar</param-value>
</param>

第2編　開発と実行

3　RPC形態のSOAPアプリケーションの開発

RPC形態のSOAPアプリケーションは，開発支援コマンドを使用して効率良く開発できます。

この章では，RPC形態のSOAPアプリケーション開発の流れ，および各開発工程で必要な作業について説明します。また，document/literalに対応したSOAPアプリケーションを開発する方法および例外処理を実装する方法についても説明します。

3.1　RPC形態のSOAPアプリケーション開発の流れ

RPC形態のSOAPアプリケーションは，開発支援コマンドでWSDLやJavaクラスなどを生成しながら開発できます。

ここでは，次に示す場合の開発の流れを示します。

SOAPアプリケーションを新規に開発する場合

既存のJavaクラスを利用してSOAPアプリケーションを開発する場合

既存のEJBを利用してSOAPアプリケーションを開発する場合

添付ファイルを使用してSOAPアプリケーションを開発する場合

DIIを使用してSOAPアプリケーションを開発する場合

.NET Frameworkを使用してSOAPアプリケーションのクライアントを開発する場合

JAX-WS仕様に対応したWebサービスの開発方法については，マニュアル「アプリケーションサーバ Webサービス開発ガイド」を参照してください。

開発支援コマンドについては，「9.　開発支援コマンド」を参照してください。

3.1.1　SOAPアプリケーションを新規に開発する場合

SOAPアプリケーションを新規に開発する場合の流れを示します。

図3‒1　WSDLを使用したSOAPアプリケーションの新規開発

SOAPアプリケーションを新規に開発する場合，Javaインタフェース（リモートインタフェース）からWSDLを生成し，生成したWSDLからサーバおよびクライアントに必要な次のファイルを生成します。

サーバで使用するJavaクラス（スケルトン）およびサービスデプロイ定義

クライアントで使用するJavaクラス（スタブ）

SOAPアプリケーションを新規に開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

Javaインタフェース（リモートインタフェース）を作成する（4.1.2）

SOAPアプリケーションのWSDLを作成するために，Javaインタフェース，およびユーザ定義のデータ型クラスを作成します。

WSDLを生成する（4.1.3）

作成したJavaインタフェースおよびユーザ定義のデータ型クラスから，SOAPアプリケーションのWSDLを生成します。

スケルトンおよびサービスデプロイ定義を生成する（4.1.4）

生成されたWSDLからサーバ側に必要なソースコードであるスケルトンを生成します。同時に，生成したソースコードをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

サーバ側の処理を実装する（4.1.5）

スケルトン生成時に生成された実装クラスに，SOAPサービスの実装を記述します。

スタブを生成する（4.1.7）

WSDLからクライアント側に必要なソースコードであるスタブを生成します。

クライアント側の処理を実装する（4.1.8）

SOAPサービスを利用するクライアント側の処理を実装します。

3.1.2　既存のJavaクラスを利用してSOAPアプリケーションを開発する場合

既存のJavaクラスを利用してSOAPアプリケーションを開発する場合の流れを示します。

図3‒2　既存のJavaクラスを利用したSOAPアプリケーションの開発

既存のJavaクラスからWSDLおよびサービスデプロイ定義を生成します。生成したWSDLからクライアントで使用するJavaクラス（スタブ）を生成します。

既存のJavaクラスを利用してSOAPアプリケーションを開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

サービスデプロイ定義を生成する（4.2.2）

既存のJavaクラスをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

WSDLを生成する（4.2.4）

既存のJavaクラスをSOAPサービスとして公開するためのWSDLを生成します。

スタブを生成する（4.2.5）

生成されたWSDLからクライアント側に必要なソースコードであるスタブを生成します。

クライアント側の処理を実装する（4.2.6）

SOAPサービスを利用するクライアント側の処理を実装します。

3.1.3　既存のEJBを利用してSOAPアプリケーションを開発する場合

既存のEJBを利用してSOAPアプリケーションを開発する場合の流れを示します。

図3‒3　既存のEJBを利用したSOAPアプリケーションの開発

既存のEJBからWSDLおよびサービスデプロイ定義を生成します。生成したWSDLからクライアントで使用するJavaクラス（スタブ）を生成します。

既存のEJBを利用してSOAPアプリケーションを開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

EJB呼び出し環境を設定する（4.3.2）

J2EEアプリケーションのRMI-IIOPインタフェースおよびRMI-IIOPスタブを取得します。

サービスデプロイ定義を生成する（4.3.3）

Enterprise Beanクラスとホームインタフェースから，既存のJavaクラスをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

WSDLを生成する（4.3.5）

既存のEJBをSOAPサービスとして公開するためのWSDLを生成します。

スタブを生成する（4.3.6）

生成されたWSDLからクライアント側に必要なソースコードであるスタブを生成します。

クライアント側の処理を実装する（4.3.7）

SOAPサービスを利用するクライアント側の処理を実装します。

3.1.4　添付ファイルを使用してSOAPアプリケーションを開発する場合

添付ファイルを使用したSOAPアプリケーションを開発する場合の流れを示します。

図3‒4　添付ファイルを使用したSOAPアプリケーションの開発

添付ファイルを使用したSOAPアプリケーションを開発する場合，Javaインタフェース（リモートインタフェース）からWSDLを生成し，生成したWSDLからサーバおよびクライアントに必要な次のファイルを生成します。

サーバで使用するJavaクラス（スケルトン）およびサービスデプロイ定義

クライアントで使用するJavaクラス（スタブ）

添付ファイルを使用したSOAPアプリケーションを開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

Javaインタフェース（リモートインタフェース）を作成する（4.4.2）

SOAPアプリケーションのWSDLを作成するために，Javaインタフェース，およびユーザ定義のデータ型クラスを作成します。

WSDLを生成する（4.4.3）

作成したJavaインタフェースおよびユーザ定義のデータ型クラスから，SOAPアプリケーションのWSDLを生成します。

スケルトンおよびサービスデプロイ定義を生成する（4.4.4）

生成されたWSDLからサーバ側に必要なソースコードであるスケルトンを生成します。同時に，生成したソースコードをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

サーバ側の処理を実装する（4.4.5）

スケルトン生成時に生成された実装クラスに，SOAPサービスの実装を記述します。

スタブを生成する（4.4.7）

WSDLからクライアント側に必要なソースコードであるスタブを生成します。

クライアント側の処理を実装する（4.4.8）

SOAPサービスを利用するクライアント側の処理を実装します。

3.1.5　DIIを使用してSOAPアプリケーションを開発する場合

DIIを使用したSOAPアプリケーションを開発する場合の流れを示します。

図3‒5　DIIを使用したSOAPアプリケーションの開発

JavaインタフェースからWSDLを生成し，生成したWSDLからサーバで使用するJavaクラス（スケルトン）およびサービスデプロイ定義を生成します。DIIを使用する場合，スタブは使用しません。SOAPサービスの呼び出しに必要な情報をWSDLファイルから取得します。

DIIを使用したSOAPアプリケーションを開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

Javaインタフェース（リモートインタフェース）を作成する（4.1.2）

SOAPアプリケーションのWSDLを作成するために，Javaインタフェース，およびユーザ定義のデータ型クラスを作成します。

WSDLを生成する（4.1.3）

作成したJavaインタフェースから，SOAPアプリケーションのWSDLを生成します。

スケルトンおよびサービスデプロイ定義を生成する（4.1.4）

生成されたWSDLからサーバ側に必要なソースコードであるスケルトンを生成します。

サーバ側の処理を実装する（4.1.5）

スケルトンの生成と同時に生成された実装クラスに，SOAPサービスの実装を記述します。

DIIのクライアント側の処理を実装する（3.8.2）

SOAPサービスを利用するクライアント側の処理を実装します。

3.1.6　.NET Frameworkを使用してSOAPアプリケーションのクライアントを開発する場合

.NET Frameworkを使用してSOAPアプリケーションを開発する場合の流れは，新規に開発する場合，既存のJavaクラスを利用する場合，および既存のEJBを利用する場合と同じです。

ただし，クライアント側に必要なソースコード（スタブ）を生成するときに，.NET Framework SDKが提供するwsdlコマンドを使用する必要があります。

3.2　Javaインタフェースの作成とJavaクラスの利用

SOAPアプリケーションを新規に開発する場合，最初にWSDLの生成に必要なJavaインタフェースを作成します。既存のJavaクラスまたは既存のEJBを利用してSOAPアプリケーションを開発する場合，最初にJavaクラスまたはEJBが利用できる状態かどうかを確認します。

SOAPアプリケーションを新規に開発する場合，3.2.1〜3.2.6に記載された内容に従ってJavaインタフェースを作成してください。

既存のJavaクラスおよびEJBを利用してSOAPアプリケーションを開発する場合は，「3.2.7　既存のJavaクラスおよびEJBの利用」を参照してください。

3.2.1　Javaインタフェース作成の概要

SOAPアプリケーションの新規開発時に作成するJavaインタフェース（リモートインタフェース）の例を示します。

package com.sample;

public interface Sample extends java.rmi.Remote{

    public java.lang.String test( int od )
      throws java.rmi.RemoteException, com.sample.UserDefinedException;
}

リモートインタフェースのメソッドのパラメタや戻り値には，ユーザ定義のデータ型クラスを使用できます。

なお，リモートインタフェースとユーザ定義のデータ型クラスは，Java2WSDLコマンドでWSDLを生成するために作成します。SOAPアプリケーションで使用するのは，WSDL2Javaコマンドで生成したリモートインタフェースおよびユーザ定義のデータ型クラスであることに注意してください。

3.2.2　リモートインタフェース作成時の規則

リモートインタフェースは，次に示す規則に従って作成してください。

表3‒1　リモートインタフェースの作成規則

項目

規則

継承関係

java.rmi.Remoteインタフェースを継承します。

パッケージ名

半角英数字（大文字／小文字ともに使用できます）およびアンダースコア（"_"）の範囲でJava言語の文法規則に従って記述してください。

デフォルトパッケージは使用できません。

インタフェース名

半角英数字（大文字／小文字ともに使用できます）およびアンダースコア（"_"）の範囲でJava言語の文法規則に従って記述してください。

メソッド名

メソッドのパラメタ名

メソッドのパラメタと戻り値の型

「3.2.3　リモートインタフェースで使用できる型とクラス」を参照してください。

メソッドの例外

java.rmi.RemoteExceptionを定義してください。※

ユーザ定義例外を定義することもできます。ユーザ定義例外を定義する場合は，「3.2.4　ユーザ定義のデータ型クラス作成時の規則」を参照してください。

注※

throws節にjava.rmi.RemoteExceptionを定義していない場合，Java2WSDLコマンドによってKDCCC0228-Wのメッセージが出力され，処理は続行されます。また，throws節にjava.rmi.RemoteExceptionおよびユーザ定義例外のどちらでもない例外を定義した場合，Java2WSDLコマンドによってKDCCC0229-Wのメッセージが出力されます。この例外はwsdl:fault要素にマッピングされません。

3.2.3　リモートインタフェースで使用できる型とクラス

リモートインタフェースのメソッドのパラメタや戻り値には，次に示す型およびクラスを使用できます。また，配列を使用することもできます。

プリミティブ型（intやdoubleなど）

ラッパークラス（java.lang.Integerやjava.lang.Doubleなど）

Java標準クラス（java.lang.Stringやjava.util.Calendarなど）

Application Server独自の型（org.apache.axis.types.NegativeIntegerなど）

Holderクラス（javax.xml.rpc.holders.IntHolderやjavax.xml.rpc.holders.DoubleHolderなど）※1

ユーザ定義のデータ型クラス※2

注※1

Holderクラスは用途に制限があります。Holderクラスの制限については，「3.2.5　HolderクラスによるINOUTパラメタの格納」を参照してください。

注※2

ユーザ定義のデータ型クラスについては「3.2.4　ユーザ定義のデータ型クラス作成時の規則」を参照してください。

使用できる型とクラスの一覧については「11.3　JavaクラスからWSDLを生成する場合のデータ型の関係」を参照してください。

3.2.4　ユーザ定義のデータ型クラス作成時の規則

リモートインタフェースのメソッドのパラメタや戻り値には，ユーザ定義のデータ型クラスを使用できます。DIIでユーザ定義のデータ型クラスを使用する場合は，「3.8.3　DIIでのユーザ定義のデータ型クラスの使用」を参照してください。

ユーザ定義のデータ型クラスは，次に示す規則に従って作成してください。

表3‒2　ユーザ定義のデータ型クラスの作成規則

項目

規則

継承関係

java.lang.Objectクラスまたはほかのユーザ定義のデータ型クラスを継承します。※1

パッケージ名

半角英数字（大文字／小文字ともに使用できます）およびアンダースコア（"_"）の範囲でJava言語の文法規則に従って記述してください。

デフォルトパッケージは使用できません。

クラス名

半角英数字（大文字／小文字ともに使用できます）およびアンダースコア（"_"）の範囲でJava言語の文法規則に従って記述してください。

フィールド（プロパティ）名

メソッド（アクセサ）名

メソッド（アクセサ）のパラメタ名

フィールド（プロパティ）の型

「3.2.3　リモートインタフェースで使用できる型とクラス」を参照してください。

メソッド（アクセサ）のパラメタと戻り値の型

コンストラクタ

publicであるデフォルトコンストラクタを定義してください。

プロパティおよびアクセサの関係※2

プロパティとアクセサ（getterおよびsetter）は必ず一組になるように定義してください。

プロパティ以外のフィールドやアクセサ以外のメソッドは，定義しないでください。

注※1

java.util.Calendarのように直接java.lang.Objectを継承している場合でも，次に示すJava標準クラスおよびApplication Serverの実装クラスをスーパークラスとして利用することはできません。

Java標準クラス：J2SE 5.0仕様に対応した次のパッケージ名で始まるクラスは利用できません。

・java

・javax

・org.ietf

・org.omg

・org.w3c

・org.xml

Application Serverの実装クラス：Application Serverが提供する次のパッケージ名で始まるクラスは利用できません。

・com.cosminexus.c4web

・com.cosminexus.cws

・com.cosminexus.xml

・com.cosminexus.wss

・org.apache.axis

・org.apache.commons.discovery

・com.ibm.wsdl

注※2

プロパティとはユーザ定義のデータ型クラスで保持する情報のことです。また，アクセサとはプロパティの値を取得したり設定したりするためのメソッドのことです。アクセサのうち，取得するメソッドをgetter，設定するメソッドをsetterと呼びます。getterとsetterはプロパティと関係づけて一組定義してください。

getterおよびsetterを作成するときの規則を次に示します。

表3‒3　getterの作成規則

項目

規則

メソッド（アクセサ）名

"get" + 先頭を大文字にしたプロパティ名を定義してください。

パラメタ

定義しないでください。

戻り値

プロパティの値を返してください。

表3‒4　setterの作成規則

項目

規則

メソッド（アクセサ）名

"set" + 先頭を大文字にしたプロパティ名を定義してください。

パラメタ

プロパティと同じ型のパラメタを一つだけ定義してください。パラメタ名は任意です。

戻り値

voidとしてください。

3.2.5　HolderクラスによるINOUTパラメタの格納

リモートインタフェースのメソッドのパラメタに，INOUTパラメタを格納するためにHolderクラスを使用できます。リモートインタフェースのメソッドのパラメタ以外ではHolderクラスは使用できません。

Holderクラスの生成例，および使用できないHolderクラスの用途の例を示します。

(1)　Holderクラスの生成例

Holderクラスを使用したリモートインタフェース

package localhost;

public interface HolderTest extends java.rmi.Remote{

    public void test( javax.xml.rpc.holders.StringHolder inout ) throws java.rmi.RemoteException;
}

リモートインタフェースから，Java2WSDLコマンドによって生成されたWSDLの一部

<wsdl:definitions targetNamespace="http://localhost" ... >
...
 <wsdl:message name="testRequest">
  <wsdl:part name="in0" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="testResponse">
  <wsdl:part name="in0" type="xsd:string"/>
 </wsdl:message>
 <wsdl:portType name="HolderTest">
  <wsdl:operation name="test" parameterOrder="in0">
   <wsdl:input message="intf:testRequest" name="testRequest"/>
   <wsdl:output message="intf:testResponse" name="testResponse"/>
  </wsdl:operation>
 </wsdl:portType>
...
</wsdl:definitions>

(2)　使用できないHolderクラスの用途の例

Holderクラスは，リモートインタフェースのメソッドのパラメタだけに使用できます。メソッドの戻り値，配列の要素，およびユーザ定義のデータ型クラスのフィールドでは使用できません。

次に示す例を含む，リモートインタフェースのメソッドのパラメタ以外の用途に使用しないでください。

メソッドの戻り値

（例）Javaインタフェース

package localhost;

public interface HolderTest extends java.rmi.Remote{

    public javax.xml.rpc.holders.StringHolder test() throws java.rmi.RemoteException;
}

配列の要素

（例）Javaインタフェース

package localhost;

public interface HolderTest extends java.rmi.Remote{

    public void test( javax.xml.rpc.holders.StringHolder[] inout ) throws java.rmi.RemoteException;
}

ユーザ定義のデータ型クラスのフィールド

（例）Javaインタフェース

package localhost;

public interface HolderTest extends java.rmi.Remote{

    public void test( localhost.UserData data ) throws java.rmi.RemoteException;
}

（例）上記のユーザ定義のデータ型クラス

package localhost;

public class UserData implements java.io.Serializable {
    public javax.xml.rpc.holders.StringHolder value;
}

このような使い方をした場合，開発支援コマンドがKDCCC0012-Eのエラーメッセージを出力して終了したり※1，通信時にC4Fault例外※2，またはRemoteException例外※3が発生したりすることがあります。

注※1

メソッドの戻り値にHolderクラスを使用した場合が該当します。

注※2

Holderクラスを注※1を除く用途に使用してSOAPアプリケーションを開発し，スタブを使用して実行した場合が該当します。

注※3

Holderクラスを注※1を除く用途に使用してSOAPアプリケーションを開発し，DIIを使用して実行した場合が該当します。

3.2.6　リモートインタフェースおよびユーザ定義のデータ型クラスでの配列の使用

リモートインタフェースのメソッドのパラメタ，戻り値，またはこれらに指定するユーザ定義のデータ型クラス内で配列を使用できます。

配列を使用した場合，Java2WSDLコマンドおよびWSDL2Javaコマンド実行時に，"SequenceOf"で始まるデータ型クラスが生成されます。生成例を次に示します。

リモートインタフェース

package localhost;
public interface ArrayBank extends java.rmi.Remote{
    public void sentArrayData( java.lang.String[] arrayData ) throws java.rmi.RemoteException;
}

リモートインタフェースから，Java2WSDLコマンドによって生成されたWSDLの一部

<wsdl:definitions xmlns:intf="http://localhost" targetNamespace="http://localhost" ... >
...
 <wsdl:types>
  <schema targetNamespace="http://localhost" xmlns="http://www.w3.org/2001/XMLSchema">
   <complexType name="SequenceOf_xsd_string">
    <sequence>
     <element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd:string"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>
 <wsdl:message name="sentArrayDataRequest">
  <wsdl:part name="in0" type="intf:SequenceOf_xsd_string"/>
 </wsdl:message>
 <wsdl:message name="sentArrayDataResponse">
 </wsdl:message>
 <wsdl:portType name="ArrayBank">
  <wsdl:operation name="sentArrayData" parameterOrder="in0">
   <wsdl:input message="intf:sentArrayDataRequest" name="sentArrayDataRequest"/>
   <wsdl:output message="intf:sentArrayDataResponse" name="sentArrayDataResponse"/>
  </wsdl:operation>
 </wsdl:portType>
...
</wsdl:definitions>

上記のWSDLから，WSDL2Javaコマンドによって生成されたリモートインタフェース

package localhost;

public interface ArrayBank extends java.rmi.Remote {
    public void sentArrayData(localhost.SequenceOf_xsd_string in0) throws java.rmi.RemoteException;
}

localhost.SequenceOf_xsd_stringクラスの一部

package localhost;

public class SequenceOf_xsd_string  implements java.io.Serializable {
    private java.lang.String[] item;

    public SequenceOf_xsd_string() {
    }

    public SequenceOf_xsd_string(
           java.lang.String[] item) {
           this.item = item;
    }

    public java.lang.String[] getItem() {
        return item;
    }

    public void setItem(java.lang.String[] item) {
        this.item = item;
    }
...
}

例えば，sentArrayDataメソッドに対して，{ "data1", "data2" }という配列を与える場合，次のようにSequenceOf_xsd_stringインスタンスを生成して呼び出します。

ArrayBankServiceLocator locator = new ArrayBankServiceLocator();
ArrayBank port = locator.getArrayBank();
SequenceOf_xsd_string in0 = new SequenceOf_xsd_string();
in0.setItem( new String[]{ "data1", "data2" } );
port.sentArrayData( in0 );

なお，配列を使用する場合，その配列が空である（要素数が0である）ことと，その配列がnullであることを区別することはできません。配列が空である場合も，配列がnullであるものとして扱われます。

また，例えば，sentArrayDataメソッドの第1引数をin0として，次のように生成したSequenceOf_xsd_stringインスタンスをクライアント側の実装で与えた場合，SOAPサービス側の実装のメソッド内で第1引数から取得できるin0に対し，getItemメソッドを呼び出した結果はどちらもnullです。

空の配列を与える

SequenceOf_xsd_string in0 = new SequenceOf_xsd_string();
in0.setItem( new String[]{} );

nullを与える

SequenceOf_xsd_string in0 = new SequenceOf_xsd_string();
in0.setItem( null );

3.2.7　既存のJavaクラスおよびEJBの利用

既存のJavaクラスおよび既存のEJBを利用して開発する場合，利用する次のプログラムが3.2.2〜3.2.6に記載された規則に従っているか確認してください。

Javaクラス（Javaクラスを利用して開発する場合）

Beanクラス（EJBを利用して開発する場合）

ホームインタフェース（EJBを利用して開発する場合）

JavaクラスまたはEJBから参照するリモートインタフェースおよびユーザ定義のデータ型クラス

なお，EJBを利用して開発する場合は，Holderクラスは使用できません。

3.3　WSDLの生成と定義

RPC形態のSOAPアプリケーションの開発で必要なWSDLは，Java2WSDLコマンドで生成するか，手動で定義します。

ここでは，WSDLを生成する場合およびWSDLを定義する場合に，留意が必要な点について説明します。

3.3.1　サービスロケーションの指定

Java2WSDLコマンドでWSDLを生成するときに，サービスロケーションを指定します（service要素のaddress location属性）。サービスロケーションの指定例を示します。

http://localhost:8080/RPCSampleService/services/UserInfo

指定例を基に，サービスロケーションの指定内容を示します。

http

通信プロトコルを指定します。「http」または「https」を指定します。

localhost:8080

サービスが存在するホスト名（またはIPアドレス），およびポート番号を指定します。半角英数字および次の記号を使用できます。

-　_　.　~　@　:　%　!　$　&　'　(　)　*　+　,　;　=　[　]

RPCSampleService

呼び出すSOAPサービスのコンテキストルート名を指定します。半角英数字および次の記号を使用できます。

-　_　.　~　/

services

SOAPエンジンが提供するサーブレットパス名を指定します。半角英数字および次の記号を使用できます。

-　_　.　~　/

UserInfo

呼び出すサービスの名称を指定します。半角英数字および次の記号を使用できます。

-　_　.　~　/

3.3.2　WSDLのスタイルの指定

Java2WSDLコマンドでWSDLを生成するときに，WSDLのスタイルを指定します。WSDLのスタイルは「RPC」または「DOCUMENT」を指定します。

RPC

SOAP 1.1仕様のSection 7.1に従い，RPCの操作名と同じ名前を持つ要素で送信するデータ（パラメタまたは戻り値）をラップし，SOAPボディ要素の子要素として送信する形態です。

DOCUMENT

送信するデータをSOAPボディ要素の子要素としてそのまま送信する形態です。使用するXMLドキュメントは，エンコードスタイルまたは具体的なスキーマで定義されたルールに従っている必要があります。

また，WSDLのスタイルの指定に合わせてuse属性を指定します。use属性は，WSDLのmessage要素のpart要素がエンコード規則（例：SOAP encoding）を使用してエンコードされているかどうか，またはpart要素がmessage要素の具体的スキーマを定義しているかどうかを表します。use属性は，「LITERAL」または「ENCODED」を指定します。

LITERAL

スキーマを使用する場合に指定します。

ENCODED

エンコード規則を使用する場合に指定します。

WSDLのスタイルおよびuse属性は，Java2WSDLコマンドのオプションで指定します。オプションの指定値の組み合わせとサポート範囲を次の表に示します。

表3‒5　Java2WSDLコマンドのオプション指定値の組み合わせとサポート範囲

スタイルの指定値

use属性の指定値

サポート

RPC

LITERAL

○（デフォルト値）

RPC

ENCODED

○

DOCUMENT

LITERAL

○

DOCUMENT

ENCODED

×

（凡例）

○：サポートされます。

×：サポートされません。

指定できるオプションの指定値の組み合わせ，特徴，およびWS-I Basic Profileの推奨パターンを次の表に示します。

表3‒6　Java2WSDLコマンドのオプション指定値の組み合わせ，特徴，WS-I Basic Profileの推奨パターン

指定値の組み合わせ

特徴

WS-I Basic Profileの推奨パターン

RPC／LITERAL

（デフォルト値）

SOAPメッセージ内に型情報が含まれません。指定値を省略した場合に設定されるデフォルト値です。

○

RPC／ENCODED

SOAPメッセージ内に型情報が含まれるため，メソッド引数が多くなると，メッセージのサイズが大きくなります。

×

DOCUMENT／LITERAL

SOAPメッセージ内に型情報が含まれません。

○

（凡例）

○：WS-I Basic Profileで推奨されている組み合わせです。

×：WS-I Basic Profileで推奨されていない組み合わせです。

WSDLのスタイルおよびuse属性の指定方法については，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

3.3.3　生成されるWSDLの例

次のJavaメソッドに対して，Java2WSDLコマンドを実行したときに生成されるWSDLの例を示します。

public UserData getUserData(String user_no);

(1)　RPC／LITERALを指定した場合

WSDLのスタイルで「RPC」，use属性で「LITERAL」を指定した場合に生成されるWSDLの一部とSOAPメッセージの例を示します。

図3‒6　RPC／LITERALを指定した場合のWSDLの生成例

WSDLのoperation要素のname属性値が，SOAPメッセージのボディ直下の要素に対応します（図の（1））。WSDLのpart要素が，SOAPメッセージのオペレーション名を表す要素（<getUserData>）の子要素に対応します（図の（2））。

また，WSDLのbinding要素以下のstyle属性が"rpc"，use属性が"literal"になります。

(2)　RPC／ENCODEDを指定した場合

WSDLのスタイルで「RPC」，use属性で「ENCODED」を指定した場合に生成されるWSDLの一部とSOAPメッセージの例を示します。

図3‒7　RPC／ENCODEDを指定した場合のWSDLの生成例

WSDLのoperation要素のname属性値が，SOAPメッセージのボディ直下の要素に対応します（図の（1））。WSDLのpart要素が，SOAPメッセージのオペレーション名を表す要素（<getUserData>）の子要素に対応します（図の（2））。SOAPメッセージにはエンコード情報（xsi:type="xsd:string"）が含まれます。

また，WSDLのbinding要素以下のstyle属性が"rpc"，use属性が"encoded"になります。

(3)　DOCUMENT／LITERALを指定した場合

WSDLのスタイルで「DOCUMENT」，use属性で「LITERAL」を指定した場合に生成されるWSDLの一部とSOAPメッセージの例を示します。

図3‒8　DOCUMENT／LITERALを指定した場合のWSDLの生成例

WSDLのpart要素のelement属性で参照している要素（図の（1））が，SOAPメッセージのボディの子要素に対応します（図の（2））。

また，WSDLのbinding要素以下のstyle属性が"document"，use属性が"literal"になります。

wrapped形式のWSDL

Java2WSDLコマンド実行時に，DOCUMENT／LITERALを指定して生成されたWSDLでは，オペレーションの引数がoperation要素のname属性の値から命名されたelement要素（次の図の（1））でラップされます（次の図の（2））。このような形式のWSDLをwrapped形式と呼びます。

図3‒9　wrapped形式のWSDLの例

nonwrapped形式のWSDL

wrapped形式でないDOCUMENTスタイルのWSDLをnonwrapped形式と呼びます。

3.3.4　WSDLの構文

WSDLの要素の記述規則，および記述例を示します。WSDLを定義する場合は，この項に記載された内容，および「12.2　WSDL 1.1との対応」に記載された内容に注意してください。

(1)　XML SchemaのURI

XML SchemaのURIは「http://www.w3.org/2001/XMLSchema」を使用します。対象となるXML SchemaのURIは，WSDL（インポート，インクルードされたファイルを含む）に記述されたすべてのURIとなります。

(2)　wsdl:types要素

wsdl:types要素は，SOAPメッセージで使用する型に関する情報を定義する要素です。wsdl:types要素は，次に示す規則に従って記述してください。

wsdl:definitions要素の子要素として記述してください。

記述できる個数は0個または1個です。2個以上は記述できません。

wsdl:documentation要素およびwsdl:import要素よりもあとに記述してください。

wsdl:documentation要素およびwsdl:import要素を除く，ほかのすべての要素よりも前に記述してください。

(3)　xsd:schema要素

xsd:schema要素は，XML Schemaを記述する要素です。xsd:schema要素は，wsdl:types要素の子要素として記述してください。

xsd:schema要素の子要素には，xsd:import要素およびxsd:include要素を定義できます。

xsd:import要素

xsd:import要素は，XML Schemaをインポートする場合に定義する要素です。xsd:import要素の書式や構文については，「3.3.6　XML Schemaのインポート」を参照してください。

xsd:include要素

xsd:include要素は，XML Schemaをインクルードする場合に定義する要素です。xsd:include要素の書式や構文については，「3.3.7　XML Schemaのインクルード」を参照してください。

(4)　wsdl:import要素

wsdl:import要素は，WSDLをインポートする場合に定義する要素です。wsdl:import要素の書式や構文については，「3.3.8　WSDLのインポート」を参照してください。

(5)　wsdl:part要素

wsdl:part要素は，SOAPメッセージの内容を構成する要素です。wsdl:part要素は，次に示す規則に従って記述してください。

INパラメタ，OUTパラメタ，およびINOUTパラメタのwsdl:part要素を合計した数は254個までです。255個以上は記述できません。

(6)　拡張要素

拡張要素（extensibility element）は次に示す要素にだけ記述できます。

soap:binding要素

soap:operation要素

soap:body要素

soap:fault要素

soap:address要素

(7)　soap:binding要素

soap:binding要素は，SOAPバインディングを定義する要素です。soap:binding要素は，次に示す規則に従って記述してください。

wsdl:binding要素の子要素として記述してください。

必ず1個記述してください。2個以上は記述できません。

transport属性にはHTTPバインディングを示す"http://schemas.xmlsoap.org/soap/http"を指定してください。

(8)　wsdl:operation要素

wsdl:portType要素の子要素であるwsdl:operation要素と，wsdl:binding要素の子要素であるwsdl:operation要素は，一対一になるように記述してください。

(9)　soap:operation要素

soap:operation要素は，SOAPバインディングでのオペレーションの情報を定義する要素です。soap:operation要素は，次に示す規則に従って記述してください。

wsdl:binding要素の子要素であるwsdl:operation要素の子要素として記述してください。

必ず1個記述してください。2個以上は記述できません。

(10)　soap:body要素

soap:body要素は，SOAPメッセージのsoap:body要素以下のメッセージを定義する要素です。soap:body要素は，次に示す規則に従って記述してください。

wsdl:binding要素の子要素であるwsdl:input要素またはwsdl:output要素の子要素として記述してください。

必ず1個記述してください。2個以上は記述できません。

なお，parts属性を記述することはできますが，無視されます。

(11)　wsdl:fault要素

wsdl:fault要素はfaultを定義する要素です。wsdl:fault要素は，次に示す規則に従って記述してください。

wsdl:portType要素およびwsdl:binding要素の子要素として記述してください。

同じname属性の値を持つwsdl:fault要素を複数記述しないでください。

(12)　soap:fault要素

soap:fault要素は，SOAPメッセージのsoap:fault要素に含まれるdetail子要素以下のメッセージを定義する要素です。soap:fault要素は，次に示す規則に従って記述してください。

wsdl:binding要素の子要素であるwsdl:fault要素の子要素として記述してください。

必ず1個記述してください。2個以上は記述できません。

(13)　wsdl:service要素

wsdl:service要素は，SOAPサービスを定義する要素です。一つのWSDLに複数のSOAPサービスを対応させることはできません。wsdl:service要素は，次に示す規則に従って記述してください。

必ず1個記述してください。2個以上は記述できません。

3.3.5　WSDL定義で使用できる文字

WSDL定義では，RFC3986で規定されている非予約文字と日本語を使用できます。ここでは，WSDL定義で使用できる文字，および使用する文字に関する注意事項を示します。

WSDLファイル名で使用できない文字については，「3.3.9(3)　WSDLファイル名に使用できない文字」を参照してください。

(1)　使用できる文字

document/literalに対応したSOAPアプリケーションでは，WSDL定義に日本語を使用できます。WSDLのスタイルごとに，使用できる文字を示します。

(a)　「DOCUMENT／LITERAL」の場合

半角英数字（A〜Z，a〜z，0〜9），アンダースコア（_），および次に示す文字を使用できます。

全角ひらがな，全角かたかな

全角ギリシャ文字，全角ロシア文字など

繰り返し符号（「ゝ」，「ゞ」，「々」）

漢字（JIS X 0208の第一水準，第二水準に含まれる範囲）

WSDLのデータ型がanyURIの属性については，次の文字も使用できます。

ハイフン（-）

ピリオド（.）

チルダ（~）

日本語のサポートについては，「12.2.1(2)　WSDL 1.1仕様での日本語のサポート範囲」を参照してください。なお，DIIを使用する場合，日本語は使用できません。

(b)　「RPC／LITERAL」または「RPC／ENCODED」の場合

半角英数字（A〜Z，a〜z，0〜9）およびアンダースコア（_）を使用できます。WSDLのデータ型がanyURIの属性については，次の文字も使用できます。

ハイフン（-）

ピリオド（.）

チルダ（~）

(2)　日本語で定義する場合の注意

WSDL定義に日本語を使用する場合の注意事項について説明します。

(a)　wsdl:port要素のname属性を日本語で定義する場合

wsdl:port要素のname属性の値と，soap:address要素のlocation属性に指定されたURLパスの末尾の値は一致させる必要があります。ただし，wsdl:port要素のname属性を日本語で定義する場合，同じ値をパーセントエンコードしてsoap:address要素のlocation属性のURLパスに定義する必要があります（クライアントアプリケーションで動的にURLを指定する場合は除きます）。

パーセントエンコードするときに使用できる符号化形式はUTF-8です。また，パーセントエンコードした文字の16進コード（%xx）のAからFは，大文字を使用してください。

次に，wsdl:port要素のname属性を日本語で定義する場合の例を示します。

...
<wsdl:service name="UserInfoService">
 <wsdl:port binding="intf:UserInfoSoapBinding" name="日本語">
   <soap:address location="http://localhost:8080/RPCSampleService/services/%E6%97%A5%E6%9C%AC%E8%AA%9E"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

soap:address要素のlocation属性に誤った値を定義した場合，エラーとなり通信できません。

(b)　anyURIの属性に対して日本語で定義する場合

WSDLのデータ型がanyURIの属性に対して，日本語で値を定義する場合は，パーセントエンコードする必要があります。

パーセントエンコードするときに使用できる符号化形式はUTF-8です。また，パーセントエンコードした文字の16進コード（%xx）のAからFは，大文字を使用してください。

anyURIの属性を持つWSDLの要素については，「12.2.1(2)　WSDL 1.1仕様での日本語のサポート範囲」を参照してください。

(3)　WSDL定義での記号の扱い

WSDL定義で次の記号を名称に使用している場合，ソースコード生成時に記号が削除されます。そのため，記号を使用して名称を重複しないようにしている場合でも，ソースコード生成時には名称が重複して，コンパイルエラーになることがあります。

ソースコード生成時に削除される記号

ハイフン（-）

ピリオド（.）

コロン（:）

（例）

WSDL定義での名称：Section-Name

ソースコードでの名称：SectionName

(4)　先頭文字についての注意

WSDL定義で使用する名称の先頭文字は「a〜z」，「A〜Z」，または「_」（アンダースコア）で始まるように定義してください。それ以外の名称を先頭文字に使用すると，サービス呼び出し時にエラー（KDCCF0006-E）が発生することがあります。

(5)　同一データ型の変数名の定義に関する注意

WSDL定義でデータ型を定義する場合，同一データ型内の変数名として，"A"と"a"または"A1"と"a1"のように，大文字小文字だけが異なる変数名を定義すると，ソースコード生成後のコンパイルでエラーになることがあります。

大文字小文字だけが異なるような変数名は定義しないでください。

(6)　Javaの予約語を定義した場合の注意

WSDL定義で使用する名称に，Javaの予約語を定義すると，ソースコード生成時に名称の前に「_」（アンダースコア）が付加されます。

名称の前に「_」（アンダースコア）が付加されるJavaの予約語を次に示します。

  "abstract",  "assert",     "boolean",   "break",        "byte",
  "case",      "catch",      "char",      "class",        "const",
  "continue",  "default",    "do",        "double",       "else",
  "enum",      "extends",    "false",     "final",        "finally",
  "float",     "for",        "goto",      "if",           "implements",
  "import",    "instanceof", "int",       "interface",    "long",
  "native",    "new",        "null",      "package",      "private",
  "protected", "public",     "return",    "short",        "static",
  "strictfp",  "super",      "switch",    "synchronized", "this",
  "throw",     "throws",     "transient", "true",         "try",
  "void",      "volatile",   "while"

（例）

WSDL定義での名称：boolean

ソースコードでの名称：_boolean

3.3.6　XML Schemaのインポート

xsd:import要素を定義することで，同じWSDL内のXML Schema，および別ファイルのXML Schemaをインポートできます。XML Schemaのインポートでは，異なる名前空間に属するXML Schemaをインポートできます。

XML Schemaのインポートの概念を次の図に示します。

図3‒10　XML Schemaのインポート

なお，名前空間「http://www.w3.org/2001/XMLSchema」はインポートしないでください。

(1)　xsd:import要素の有効範囲

XML Schemaをインポートすることで，インポート対象のXML Schemaの要素および属性を参照できます。XML Schemaの型定義を参照する場合，同じファイル内に参照する型定義がなくても，型定義を記述したXML Schemaのファイルをインポートすれば参照できます。

XML Schemaの要素および属性を参照できる場合の例を示します。

図3‒11　XML Schemaの要素および属性を参照できる場合（インポート）

対象となるXML Schemaをインポートしない場合は，ほかの名前空間に属するXML Schemaの要素および属性を参照できません。また，別のファイルを介して，間接的にXML Schemaの要素および属性を参照することはできません。

XML Schemaの要素および属性を参照できない場合の例を示します。

図3‒12　XML Schemaの要素および属性を参照できない場合（インポート）

(2)　xsd:import要素の書式

xsd:import要素の書式と属性を示します。

書式

<xsd:import namespace="インポートする名前空間のURI"
           [schemaLocation="インポート対象のXML Schemaのファイル名"]/>

注　[　]は定義を省略できることを表します。

属性

namespace

インポート対象のXML Schemaが属する名前空間のURIを定義します。この属性の定義は必須です。

schemaLocation

インポート対象のXML Schemaのファイル名を定義します。同じWSDLファイル内のXML Schemaをインポートする場合，および次のURIをインポートする場合は，この属性の定義を省略します。

・http://schemas.xmlsoap.org/soap/encoding/

・http://www.w3.org/2003/05/soap-encoding

・http://xml.apache.org/xml-soap

・http://ws-i.org/profiles/basic/1.1/xsd

schemaLocation属性に定義できるのは相対パスだけです。したがって，絶対パスや，http://やftp://などのプロトコルで始まるURIは定義できません。また，相対パスにショートカットを含めることはできません。

相対パスに指定する文字に関する注意

相対パスに指定する文字の使用可否を次の表に示します。次の表にない文字を使用する場合は，パーセントエンコードする必要があります。

表3‒7　相対パスに指定する文字の使用可否

分類

文字

そのまま使用できる文字

（指定時にパーセントエンコード不要）

半角英数字（A〜Z，a〜z，0〜9）および次の文字

-　.　_　~　/

使用できない文字

（パーセントエンコードしても指定不可）

半角スペースおよび次の文字

?　:　*　%　|　<　>　"　[　]　&　+

「#」はパーセントエンコードすると指定できます。ただし，ファイル名の先頭には指定できません。

相対パスに指定した文字は，大文字と小文字は区別されません。

パーセントエンコードした文字の16進コード（%xx）のAからFは，大文字を使用してください。

パーセントエンコードする場合，正しくパーセントエンコードされているか確認してください。不完全な文字列は指定できません。

(3)　xsd:import要素の構文

xsd:import要素の構文，および定義時の注意事項を示します。

(a)　xsd:import要素の記述位置

xsd:import要素は，次に示す規則に従って記述してください。

xsd:schema要素の子要素として記述してください。

xsd:annotation要素よりもあとに記述してください。

xsd:annotation要素およびxsd:include要素を除く，ほかのすべての要素よりも前に記述してください。

(b)　インポート対象のXML Schemaの定義

インポート対象のXML Schemaでは，ルート要素をxsd:schema要素にしてください。また，インポート対象のxsd:schema要素のtargetNamespace属性は，次に示す規則に従って記述してください。

インポート元のxsd:import要素のnamespace属性と同じ値を定義してください。

インポート元のtargetNamespace属性と異なる値を定義してください。

(c)　複数のXML Schemaのインポート

xsd:schemaの子要素にxsd:import要素を複数行記述することで，複数のXML Schemaをインポートできます。

schemaLocation属性の値が異なれば，namespace属性の値がそれぞれ同じ場合でも，異なる場合でもインポートできます。schemaLocation属性の値が同じ場合は，どちらもインポートできません（schemaLocation属性の値が同じxsd:import要素は複数行記述できません）。schemaLocation属性を省略する場合は，namespace属性の値が同じxsd:import要素を複数行記述できません。

(4)　xsd:import要素の定義例

別ファイルのXML Schemaをインポートする場合，および同じWSDL内のXML Schemaをインポートする場合の定義例を示します。

(a)　別ファイルのXML Schemaをインポートする場合

DataInfo.wsdl（インポート元）

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://dictionary.com"
 xmlns:intf="http://dictionary.com"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:types>
    <xsd:schema targetNamespace="http://dictionary.com">

      <xsd:import namespace="http://date.dictionary.com" schemaLocation="Date.xsd"/>
      ...
    </xsd:schema>
  </wsdl:types>
  ...
</wsdl:definitions>

Date.xsd（インポート対象）

<?xml version="1.0" ?>
<xsd:schema targetNamespace="http://date.dictionary.com"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:complexType name="DateInfo">
    <xsd:sequence>
      <xsd:element name="fromDate" nillable="true" type="xsd:string"/>
      <xsd:element name="toDate" nillable="true" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

</xsd:schema>

(b)　同じWSDL内のXML Schemaをインポートする場合

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://dictionary.com"
 xmlns:intf="http://dictionary.com"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:types>
    <xsd:schema targetNamespace="http://dictionary.com"
     xmlns:tns2="http://date.dictionary.com"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">

      <xsd:import namespace="http://date.dictionary.com"/>

      <xsd:complexType name="Data">
        <xsd:sequence>
          <xsd:element name="date" nillable="true" type="tns2:DateInfo"/>
          <xsd:element name="title" nillable="true" type="xsd:string"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>

    <xsd:schema targetNamespace="http://date.dictionary.com"
     xmlns="http://www.w3.org/2001/XMLSchema">
      <xsd:complexType name="DateInfo">
        <xsd:sequence>
          <xsd:element name="fromDate" nillable="true" type="xsd:string"/>
          <xsd:element name="toDate" nillable="true" type="xsd:string"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </wsdl:types>
  ...
</wsdl:definitions>

3.3.7　XML Schemaのインクルード

xsd:include要素を定義することで，同じ名前空間に属するXML Schemaをインクルードできます。

XML Schemaのインクルードの概念を次の図に示します。

図3‒13　XML Schemaのインクルード

(1)　xsd:include要素の有効範囲

XML Schemaをインクルードすることで，インクルード対象のXML Schemaの要素および属性を参照できます。XML Schemaの型定義を参照する場合，同じファイル内に参照する型定義がなくても，型定義を記述したXML Schemaのファイルをインクルードすれば参照できます。

XML Schemaの要素および属性を参照できる場合の例を示します。

図3‒14　XML Schemaの要素および属性を参照できる場合（インクルード）

対象となるXML Schemaをインクルードしない場合は，別のファイルに記述されたXML Schemaの要素および属性を参照できません。また，別のファイルを介して，間接的にXML Schemaの要素および属性を参照することはできません。

XML Schemaの要素および属性を参照できない場合の例を示します。

図3‒15　XML Schemaの要素および属性を参照できない場合（インクルード）

(2)　xsd:include要素の書式

xsd:include要素の書式と属性を示します。

書式

<xsd:include schemaLocation="インクルード対象のXML Schemaのファイル名"/>

属性

schemaLocation

インクルード対象のXML Schemaのファイル名を定義します。この属性の定義は必須です。

schemaLocation属性に定義できるのは相対パスだけです。したがって，絶対パスや，http://やftp://などのプロトコルで始まるURIは定義できません。また，相対パスにショートカットを含めることはできません。

相対パスを記述するときは，「3.3.6(2)　xsd:import要素の書式」に記載された「相対パスに指定する文字に関する注意」の内容に注意してください。

(3)　xsd:include要素の構文

xsd:include要素の構文，および定義時の注意事項を示します。

(a)　xsd:include要素の記述位置

xsd:include要素は，次に示す規則に従って記述してください。

xsd:schema要素の子要素として記述してください。

xsd:annotation要素よりもあとに記述してください。

xsd:annotation要素およびxsd:import要素を除く，ほかのすべての要素よりも前に記述してください。

(b)　インクルード対象のXML Schemaの定義

インクルード対象のXML Schemaでは，ルート要素をxsd:schema要素にしてください。また，インクルード対象のxsd:schema要素のtargetNamespace属性には，インクルード元のtargetNamespace属性と同じ値を定義してください。

(c)　複数のXML Schemaのインクルード

xsd:schemaの子要素にxsd:include要素を複数行記述することで，複数のXML Schemaをインクルードできます。ただし，ファイル名（schemaLocation属性の値）が重複した場合はインクルードできません。

(4)　xsd:include要素の定義例

XML Schemaをインクルードする場合の定義例を示します。

DataInfo.wsdl（インクルード元）

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://dictionary.com"
 xmlns:intf="http://dictionary.com"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:types>
    <xsd:schema targetNamespace="http://dictionary.com">

      ...
      <xsd:include schemaLocation="Data.xsd"/>
      ...

    </xsd:schema>
  </wsdl:types>

  ...

</wsdl:definitions>

Data.xsd（インクルード対象）

<?xml version="1.0" ?>
<xsd:schema targetNamespace="http://dictionary.com"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:complexType name="Data">
    <xsd:sequence>
      <xsd:element name="date" nillable="true" type="xsd:string"/>
      <xsd:element name="title" nillable="true" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

</xsd:schema>

3.3.8　WSDLのインポート

wsdl:import要素を定義することで，ほかのWSDLファイルをインポートできます。インポートできるのは，インポート元とインポート対象とを合わせて2階層までです。インポート対象に，さらにwsdl:import要素を定義することはできません。

WSDLのインポートの概念を次の図に示します。

図3‒16　WSDLのインポート

(1)　wsdl:import要素の書式

wsdl:import要素の書式と属性を示します。

書式

<wsdl:import namespace="インポート対象の名前空間のURI"
             location="インポート対象のWSDLのファイル名"/>

属性

namespace

インポート対象の名前空間のURIを定義します。この属性の定義は必須です。

location

インポート対象のWSDLのファイル名を定義します。この属性の定義は必須です。

location属性に定義できるのは相対パスだけです。したがって，絶対パスや，http://やftp://などのプロトコルで始まるURIは定義できません。また，相対パスにショートカットを含めることはできません。

相対パスを記述するときは，「3.3.6(2)　xsd:import要素の書式」に記載された「相対パスに指定する文字に関する注意」の内容に注意してください。

(2)　wsdl:import要素の構文

wsdl:import要素の構文，および定義時の注意事項を示します。

(a)　WSDLをインポートする場合の要素の組み合わせ

WSDLをインポートする場合，インポート元またはインポート対象のどちらかのWSDLに，wsdl:binding要素を定義する必要があります。次の表に，WSDLをインポートする場合に定義が必要な要素の組み合わせを示します。

表3‒8　WSDLをインポートする場合の要素の組み合わせ

インポート元

インポート対象

wsdl:binding

wsdl:service

wsdl:types※

wsdl:message

wsdl:portType

wsdl:service

wsdl:types※

wsdl:message

wsdl:portType

wsdl:binding

注※

wsdl:types要素を省略する場合は不要です。

(b)　wsdl:import要素の記述位置

wsdl:import要素は，次に示す規則に従って記述してください。

wsdl:definitions要素の子要素として記述してください。

wsdl:documentation要素よりもあとに記述してください。

wsdl:documentation要素を除く，ほかのすべての要素よりも前に記述してください。

(c)　インポート対象のWSDLの定義

インポート対象のWSDLでは，ルート要素をwsdl:definitions要素にしてください。また，インポート対象のwsdl:definitions要素のtargetNamespace属性は，次に示す規則に従って記述してください。

インポート元のwsdl:import要素のnamespace属性と同じ値を定義してください。

インポート元のtargetNamespace属性と異なる値を定義してください。

(d)　複数のWSDLのインポート

wsdl:definitionsの子要素にwsdl:import要素を複数行記述することで，複数のWSDLをインポートできます。ただし，インポート対象のWSDLで名前空間（namespace属性の値）またはファイル名（location属性の値）のどちらかが重複した場合は，インポートできません。

(3)　wsdl:import要素の定義例

WSDLをインポートする場合の定義例を示します。

DataInfoService.wsdl（インポート元）

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service.dictionary.com"
 xmlns:intf="http://dictionary.com"
 xmlns:svc="http://service.dictionary.com"
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:import namespace="http://dictionary.com" location="DataInfo.wsdl"/>

  <wsdl:binding name="DataInfoSoapBinding" type="intf:DataInfo">
    ...
  </wsdl:binding>

  <wsdl:service name="DataInfoService">
    ...
  </wsdl:service>
</wsdl:definitions>

DataInfo.wsdl（インポート対象）

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://dictionary.com"
 xmlns:intf="http://dictionary.com"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:types>
    ...
  </wsdl:types>

  <wsdl:message name="getDataResponse">
    ...
  </wsdl:message>

  <wsdl:portType name="DataInfo">
    ...
  </wsdl:portType>
</wsdl:definitions>

3.3.9　WSDLの生成時および定義時の注意事項

WSDLを生成および定義するときに注意が必要な内容について説明します。

(1)　ソースコード生成時のWSDL検証機能の実行について

WSDL2Javaコマンドを実行してソースコードを生成するときは，WSDL検証機能を有効にしてください。WSDL検証機能は，コマンド実行時に-Cオプションを指定することで有効にできます。

WSDL検証機能については，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

(2)　Javaインタフェースのメソッドのパラメタ名と生成されるWSDLの対応

Java2WSDLコマンドを実行してJavaインタフェースからWSDLを生成する場合，Javaインタフェースのメソッドのパラメタ名は，WSDLに「inXX」（XXは整数）の名称でマッピングされます。

Javaインタフェースおよび生成されるWSDLの例を示します。

Javaインタフェース

package localhost;

public interface UserInfo extends java.rmi.Remote {
    public String getUserData(String user_no1, String user_no2) throws java.rmi.RemoteException;
}

生成されるWSDL

...
 <wsdl:message name="getUserDataResponse">
 </wsdl:message>
 <wsdl:message name="getUserDataRequest">
  <wsdl:part name="in0" type="xsd:string"/>
  <wsdl:part name="in1" type="xsd:string"/>
 </wsdl:message>
 <wsdl:portType name="UserInfo">
  <wsdl:operation name="getUserData" parameterOrder="in0 in1">
   <wsdl:input message="intf:getUserDataRequest" name="getUserDataRequest"/>
   <wsdl:output message="intf:getUserDataResponse" name="getUserDataResponse"/>
  </wsdl:operation>
...

(3)　WSDLファイル名に使用できない文字

次に示す文字は，WSDLのファイル名に使用できません。

?　:　*　#　%　|　<　>　"

(4)　WSDLを手動で定義する場合の注意

WSDLを手動で定義する場合は，Application ServerでサポートしているWSDL 1.1仕様の範囲で記述してください。Application ServerでサポートしているWSDL 1.1仕様の範囲については「12.2　WSDL 1.1との対応」を参照してください。

(5)　extension要素を使用した場合のメッセージ形式について

次に示す例のように，多段的にextension baseを使用した場合，多段的なcomplexType要素の一部が上位要素の属性と見なしたSOAPメッセージが送信されます。

WSDL定義

<complexType name="arrayList">
  <complexContent>
    <extension base="tns:list">
      <sequence />
    </extension>
  </complexContent>
</complexType>
<complexType name="list">
  <complexContent>
    <extension base="tns:collection">
      <sequence />
    </extension>
  </complexContent>
</complexType>
<complexType name="collection">
  <complexContent>
    <restriction base="soapenc:Array">
      <attribute ref="soapenc:arrayType"
                 wsdl:arrayType="anyType[]" />
    </restriction>
  </complexContent>
</complexType>

SOAPメッセージ

<ns1:checkArrayList
    soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:ns1="http://testdata">
  <in xsi:type="ns1:ArrayList">
    <collection
        xsi:type="soapenc:Array"
        soapenc:arrayType="soapenc:string[2]"
        xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
      <item xsi:type="xsd:string">testdata</item>
      <item xsi:type="xsd:int">1</item>
    </collection>
  </in>
</ns1:checkArrayList>

(6)　他社クライアントおよび他社サービスと通信する場合のデータ型に関する注意

他社クライアントまたは他社サービスと通信するためのWSDL定義を作成する場合，双方で扱えるデータ型をWSDL定義に記述してください。

SOAP通信基盤で扱えるデータ型については，「12.2.3　XML Schemaのデータ型のサポート範囲」を参照してください。他社クライアントまたは他社サービスで扱えるデータ型については，各製品のマニュアルを参照してください。

(7)　派生データ型の定義に関する注意

データ型を派生させるために使用する，制限（restriction），ユニオン（union），およびリスト（list）の中で，SOAP通信基盤で有効になるのは制限（restriction）の列挙（enumeration）だけです。WSDL定義に派生データ型を定義する場合，またはWSDL定義からソースを生成する場合に，列挙（enumeration）以外は使用しないでください。列挙（enumeration）以外を使用した場合，指定値が有効にならなかったり，生成されたソースがコンパイルできなかったりする場合があります。

(8)　nillable属性に"false"を指定した場合の動作について

WSDL定義でnillable属性に"false"を指定した変数（データ型）にnullを設定しても，SOAPメッセージの送受信時エラーにはなりません。その場合，他社製品と通信できない場合があります。nullを指定した場合のSOAPメッセージの例を次に示します。

<変数名 xsi:nil="true"/>

(9)　WSDL2Javaコマンド実行時のKDCCC0289-Wメッセージについて

Java2WSDLコマンドを実行して生成されたWSDLファイル定義では，名前空間URI「http://schemas.xmlsoap.org/soap/encoding/」に属する型を参照していても，その名前空間URI「http://schemas.xmlsoap.org/soap/encoding/」のインポート文が記述されません。そのため，WSDL2Javaコマンド実行時に，Java2WSDLコマンドを使用して生成されたWSDLファイルを指定すると，KDCCC0289-Wメッセージが出力されます。

WSDL2Javaコマンドを実行したときにKDCCC0289-Wメッセージが出力されても，名前空間URI「http://schemas.xmlsoap.org/soap/encoding/」のインポート文が記述されている場合と同様に，正常に処理されます。

KDCCC0289-Wメッセージは，次のすべての条件が重なる場合に出力されます。

Java2WSDLコマンドの入力であるJavaインタフェースで，次に示すJavaクラスを使用している。

<この現象の原因となるJavaクラス名とWSDL内のデータ型の対応>

（Javaクラス名）→（WSDL内データ型）

java.lang.String　→　soapenc:string

java.lang.Boolean　→　soapenc:boolean

java.lang.Double　→　soapenc:double

java.lang.Float　→　soapenc:float

java.lang.Integer　→　soapenc:int

java.math.BigInteger　→　soapenc:integer

java.math.BigDecimal　→　soapenc:decimal

java.lang.Long　→　soapenc:long

java.lang.Short　→　soapenc:short

java.lang.Byte　→　soapenc:byte

byte[]　→　soapenc:base64

注

プレフィクスsoapencは，「http://schemas.xmlsoap.org/soap/encoding/」です。

Java2WSDLコマンド実行時に，-Tオプションに"1.2"を指定してWSDLファイルを生成する。

上記で生成したWSDLファイルを指定してWSDL2Javaコマンドを実行する。

KDCCC0289-Wメッセージを出力させないためには，WSDLファイルを手動で編集し，名前空間URI「http://schemas.xmlsoap.org/soap/encoding/」のインポート文を追加してください。WSDL2Javaコマンドを実行するときには，編集したWSDLファイルを指定してください。

(10)　WSDLとSOAPサービスの対応

一つのWSDLに複数のSOAPサービスを対応させることはできません。

3.4　document/literalに対応したSOAPアプリケーションの開発

document/literalは，スキーマで定義された形式のXMLドキュメントをSOAPボディの子要素としてそのまま送受信するインタフェース形態です。Application Serverでは，document/literalに対応したSOAPアプリケーションの開発を支援する機能として，次の機能を提供しています。

WSDLの生成

Javaインタフェースからdocument/literalに対応したWSDLを生成します。

ソースコードの生成

document/literalに対応したWSDLからソースコードを生成します。

サービスデプロイ定義の生成

document/literalに対応したサービスデプロイ定義ファイルを生成します。

ここでは，各機能の使用方法，マッピング，および注意事項について説明します。

3.4.1　document/literal使用時のWSDLの生成

document/literalに対応したWSDLの生成方法，およびJavaインタフェースとWSDLのマッピングについて説明します。

(1)　WSDLの生成

document/literalに対応したWSDLは，Java2WSDLコマンドで生成できます。Java2WSDLコマンドの-zオプションで「DOCUMENT」，-uオプションで「LITERAL」を指定します。

Java2WSDLコマンドの使用方法については，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

注意事項

DOCUMENTスタイルを使用する場合，メソッドをオーバーロードしているJavaインタフェースを指定することはできません。

DOCUMENTスタイルでは，Javaインタフェースのメソッド名を要素名とする要素がWSDLに定義され，その要素によって引数および戻り値がラップされます。したがって，Javaインタフェースでメソッドをオーバーロードしている場合，同一名称のメソッドが複数存在することになり，WSDLにも同一要素名の要素が多重定義されてしまいます。

Java2WSDLコマンドで指定できないJavaインタフェースを指定した場合は，エラーメッセージが出力され，異常終了となります。

(2)　Java2WSDLコマンドで生成されるWSDL

document/literal使用時のJavaインタフェースとWSDLのマッピング，および生成されるWSDLの詳細仕様について説明します。

(a)　JavaインタフェースとWSDLのマッピング

次に示すWSDLの生成例を基に，document/literal使用時のJavaインタフェースとWSDLのマッピングについて説明します。

図3‒17　JavaインタフェースとWSDLのマッピング（document/literal）

JavaインタフェースとWSDLのマッピング

wsdl:types要素内のxsd:element要素に，対象メソッドの「メソッド名」が要素名として定義されます。また，「メソッド名」要素の子要素に，対象メソッドの引数が定義されます（図中の（1）および（2））。

wsdl:types要素内のxsd:element要素に，対象メソッドの「メソッド名」+「Response」が要素名として定義されます。また，「メソッド名」+「Response」要素によって，対象メソッドの戻り値および引数で与えられたHolderクラスがラップされます。なお，対象メソッドの戻り値は，「メソッド名」+「Return」要素の子要素として定義されます（図中の（3）および（4））。

対象メソッドの引数および戻り値をラップした要素が，wsdl:message要素の子要素であるwsdl:part要素のelement属性で参照されます（図中の（5）および（6））。

Java2WSDLコマンドでdocument/literalに対応したWSDLを生成する場合，常にwrapped形式のWSDLが生成されます。

なお，次のどちらかが該当する場合，子要素に空のcomplexType要素（<complexType/>）を持つ「メソッド名」要素および「メソッド名」+「Response」要素が生成されます。

対象メソッドの引数がない場合

戻り値がvoidで，引数にHolderクラスが含まれない場合

(b)　生成されるWSDLの定義内容

次の表に，Java2WSDLコマンドでdocument/literalに対応したWSDLを生成した場合の定義内容を示します。

表3‒9　Java2WSDLコマンドで生成されたWSDLの定義内容（document/literal）

WSDL中の要素

定義内容

wsdl:types要素

xsd:schema要素

xsd:schema要素

elementFormDefault属性の値は"qualified"が定義されます。

リクエストメッセージに対応するxsd:element要素

name属性で"メソッド名"が定義されます。

子要素としてxsd:complexType要素が定義されます。xsd:complexType要素では，メソッドの引数を表す要素がxsd:sequenceで並べられます。

xsd:sequence下の要素の並び順は，メソッドシグネチャの引数の順序どおりとなります。

xsd:sequence下の要素の要素名は"in"+"通し番号"※1で，型は引数に対応する型が定義されます。ただしHolderクラスの場合は内部に持つ値の型となります。

メソッドの引数がない場合は子要素として空のxsd:complexType要素が定義されます。

レスポンスメッセージに対応するxsd:element要素

name属性で"メソッド名"+"Response"が定義されます。

子要素としてxsd:complexType要素が定義されます。xsd:complexType要素では，メソッドの戻り値および引数で与えられたHolderクラスを表す要素がxsd:sequenceで並べられます。

xsd:sequence下の要素の並び順は，1番目が戻り値で，その後はメソッドシグネチャの引数の順序どおりとなります。

xsd:sequence下の戻り値を表す要素の要素名は"メソッド名"+"Return"で，型は戻り値に対応する型が定義されます。

xsd:sequence下のHolderクラスを表す要素は，リクエストメッセージの対応する要素と同じ要素名で同じ型※2が定義されます。

メソッドの戻り値がvoid，かつメソッドの引数にHolderクラスが含まれない場合は子要素として空のxsd:complexType要素が定義されます。

リクエストメッセージに対応するwsdl:message要素※3

wsdl:part要素

element属性でxsd:schema要素下で定義されている，name属性が"メソッド名"の要素が定義されます。

レスポンスメッセージに対応するwsdl:message要素※3

wsdl:part要素

element属性でxsd:schema要素下で定義されているname属性が"メソッド名"+"Response"の要素が定義されます。

wsdl:binding要素

soap:binding要素

style属性で"document"が定義されます。

wsdl:input要素／wsdl:output要素

soap:body要素

use属性で"literal"が定義されます。

namespace属性は存在しません。

注※1

1番目の引数からn番目の引数まで，in0，in1，…，in（n-1）となります。

注※2

例えば2番目の引数と4番目の引数がHolderクラスの場合は，in1とin3がxsd:sequence下に含まれます。

注※3

子要素としてpart要素が一つ定義されます。

(3)　JavaソースコードとWSDLのマッピング例

Javaインタフェース，Javaクラス，およびdocument/literalに対応したWSDLの生成例を示します。

Java2WSDLコマンドに指定するJavaインタフェース

package localhost;

public interface UserInfo {
    public UserData getUserData(String in0, int in1);
}

Java2WSDLコマンドに指定するJavaインタフェースから利用されるクラスの定義

package localhost;
public class UserData {
    private String name;
    private String section;
    private String telephone;

    public UserData() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSection() {
        return section;
    }
    public void setSection(String section) {
        this.section = section;
    }
    public String getTelephone() {
        return telephone;
    }
    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

生成されたdocument/literalのWSDL

<wsdl:definitions targetNamespace="http://localhost" xmlns:intf="http://localhost" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="http://localhost" xmlns="http://www.w3.org/2001/XMLSchema">
   <element name="getUserData">
    <complexType>
     <sequence>
      <element name="in0" type="xsd:string"/>
      <element name="in1" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="getUserDataResponse">
    <complexType>
     <sequence>
      <element name="getUserDataReturn" type="intf:UserData"/>
     </sequence>
    </complexType>
   </element>
   <complexType name="UserData">
    <sequence>
     <element name="name" nillable="true" type="xsd:string"/>
     <element name="section" nillable="true" type="xsd:string"/>
     <element name="telephone" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>
 <wsdl:message name="getUserDataRequest">
  <wsdl:part element="intf:getUserData" name="parameters"/>
 </wsdl:message>
 <wsdl:message name="getUserDataResponse">
  <wsdl:part element="intf:getUserDataResponse" name="parameters"/>
 </wsdl:message>
 <wsdl:portType name="UserInfo">
  <wsdl:operation name="getUserData">
   <wsdl:input message="intf:getUserDataRequest" name="getUserDataRequest"/>
   <wsdl:output message="intf:getUserDataResponse" name="getUserDataResponse"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="getUserData">
   <soap:operation soapAction=""/>
   <wsdl:input name="getUserDataRequest">
    <soap:body use="literal"/>
   </wsdl:input>
   <wsdl:output name="getUserDataResponse">
    <soap:body use="literal"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="UserInfoService">
  <wsdl:port binding="intf:UserInfoSoapBinding" name="UserInfo">
   <soap:address location="http://localhost/RPCSampleService/services/UserInfo"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

3.4.2　document/literal使用時のソースコードの生成

document/literalに対応したWSDLからソースコードを生成する方法，およびWSDLとソースコードのマッピングについて説明します。また，wrapped形式のWSDLから，ソースコードを生成したときの要素展開規則について説明します。

(1)　ソースコードの生成

document/literal使用時のソースコードはWSDL2Javaコマンドで生成できます。WSDL2Javaコマンド実行時に，document/literal使用時のソースコードの生成に対応したWSDLを指定すると，クライアントアプリケーションおよびサーバアプリケーションに必要なソースコードが生成されます。

WSDL2Javaコマンドの使用方法については，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

DOCUMENTスタイルを使用する場合，次の構造を持つWSDLを指定することはできません。

一つのwsdl:messageに対応するwsdl:part要素が二つ以上ある。

wsdl:part要素でelement属性ではなく，type属性を使用している。

WSDL 1.1のスキーマに沿っていない。

WSDL2Javaコマンドで指定できないWSDLを指定した場合，エラーメッセージが出力され，異常終了となります。

(2)　WSDLとJavaソースコードのマッピング

document/literalに対応したWSDLからソースコードを生成する場合に，注意が必要なマッピング規則について説明します。

(a)　WSDLのstyle属性の指定とオペレーションのstyleの設定

soap:binding要素のstyle属性およびsoap:operation要素のstyle属性の指定と，オペレーションのstyleに設定される値の関係を次の表に示します。

表3‒10　style属性の指定とオペレーションのstyleの設定値

style属性の指定※

オペレーションのstyleの設定値

soap:binding要素

soap:operation要素

○

○

soap:operation要素のstyle属性の値が設定されます。

○

×

soap:binding要素のstyle属性の値が設定されます。

×

○

soap:operation要素のstyle属性の値が設定されます。

×

×

"document"が設定されます。

（凡例）

○：指定されていることを示します。

×：指定されていない，または無効な値が指定されていることを示します。

注※

style属性の有効値は"rpc"または"document"です。

注意事項

サービスデプロイ定義の構造上，オペレーションごとにstyle属性を設定することはできません。したがって，WSDLのwsdl:binding要素中に複数のsoap:operationを記述する場合，style属性はすべて同じ値を指定する必要があります。異なるstyle属性を指定した場合，WSDL2Javaコマンド実行時にKDCCC0266-Eのエラーが出力され，異常終了となります。

(b)　wsdl:part要素から参照されているxsd:element要素の値とJavaソースコードの関係

リクエストメッセージおよびレスポンスメッセージのwsdl:part要素から参照されているxsd:element要素の値と，Javaソースコードの関係を次の表に示します。

表3‒11　xsd:element要素の値とJavaのマッピング

項番

WSDL中の項目

条件

Javaへのマッピング

1

リクエストメッセージのwsdl:part要素から参照されているxsd:element要素

型がcomplexTypeの場合。

name属性の値が対応するwsdl:operation要素のname属性の値と一致する場合。

リクエストメッセージの要素の型およびレスポンスメッセージの要素の型に対応するJavaBeansクラスは生成されません。complexTypeの内部に持つ要素が展開され，それぞれがメソッドの引数および戻り値として設定されます。

2

レスポンスメッセージのwsdl:part要素から参照されているxsd:element要素

型がcomplexTypeの場合。

name属性の値が対応するwsdl:operation要素のname属性＋Responseの値と一致する場合。

3

項番1および2以外の場合

リクエストメッセージの要素の型およびレスポンスメッセージの要素の型に対応するJavaBeansクラスがそれぞれ生成され，メソッドの引数および戻り値として設定されます。

一つのwsdl:portType要素内に複数のwsdl:operation要素が定義されている場合，一つのwsdl:operation要素でも項番3の条件を満たせば，すべてのwsdl:operationに対して項番3のマッピング規則が適用されます。

次に，complexTypeがJavaBeansクラスにマッピングされない例，およびマッピングされる例を示します。

図3‒18　complexTypeがJavaBeansクラスにマッピングされない例

図3‒19　complexTypeがJavaBeansクラスにマッピングされる例

(3)　wrapped形式の要素展開規則

wrapped形式の要素展開規則を次の表に示します。展開した各子要素をpartと見なし，IN属性のものはWSDLの型から単純にJavaの型にマッピングされ，OUT属性およびINOUT属性のものはWSDLの型からHolderクラスにマッピングされます。なお，レスポンスメッセージにINOUT属性でない要素が2個以上存在する場合は，どれが戻り値か判断できないため，INOUT属性以外の要素はOUT属性となります。

表3‒12　wrapped形式の要素展開規則

リクエストメッセージの子要素※1数

レスポンスメッセージの子要素※2数

0

1

2以上

0

［引数］

なし

［戻り値］

void

［引数］

なし

［戻り値］

レスポンスメッセージの子要素の型

［引数］

レスポンスメッセージの各子要素の型に対応するHolderクラスが，要素の順序どおりに引数として定義されます。

［戻り値］

void

1以上

［引数］

リクエストメッセージの各子要素の型

［戻り値］

void

レスポンスメッセージの子要素数−共通要素※3である子要素数=0の場合

［引数］

次の項目の順序で引数が定義されます。

リクエストメッセージの各子要素の型

レスポンスメッセージの各子要素の型に対応するHolderクラス

［戻り値］

void

レスポンスメッセージの子要素数−共通要素※3である子要素数=1の場合

［引数］

次の項目が引数として定義されます。

共通要素以外のリクエストメッセージの子要素の型

共通要素の型に対応するHolderクラス

引数の順序はリクエストメッセージの子要素の順序どおりとなります。

［戻り値］

共通要素以外のレスポンスメッセージの子要素の型

レスポンスメッセージの子要素数−共通要素※3である子要素数>1の場合

［引数］

次の項目が引数として定義されます。

共通要素以外のリクエストメッセージの子要素の型

共通要素の型に対応するHolderクラス

共通要素以外のレスポンスメッセージの子要素の型に対応するHolderクラス

引数の順序は，まずリクエストメッセージの子要素の順序どおりに定義され，続いて共通要素以外のレスポンスメッセージの子要素の順序となります。

［戻り値］

void

注※1

リクエストメッセージの子要素とは，WSDLの中で，リクエストメッセージに対応するpart要素から参照されているelementの子要素を指します。

注※2

レスポンスメッセージの子要素とは，WSDLの中で，レスポンスメッセージに対応するpart要素から参照されているelementの子要素を指します。

注※3

共通要素とは，リクエストメッセージの子要素と，レスポンスメッセージの子要素で，要素名と型が一致する要素を指します。

注意事項

レスポンスメッセージの子要素は，戻り値，INOUT属性，OUT属性の順序で定義してください。また，INOUT属性の場合，リクエストメッセージの子要素とレスポンスメッセージの子要素は同じ順序で定義してください。異なる順序で定義した場合，レスポンスメッセージの子要素の定義とは異なる順序で，応答時のSOAPメッセージを送受信します。

IN属性，OUT属性，およびINOUT属性の要素を合計した数は254個までです。255個以上は定義できません。合計で255個以上定義した場合，不正なソースが生成されます。

リクエストメッセージの子要素数およびレスポンスメッセージの子要素数が，それぞれ1以上となる次の場合の例を示します。

レスポンスメッセージの子要素数−共通要素数の子要素数=0の場合

レスポンスメッセージの子要素数−共通要素数の子要素数=1の場合

レスポンスメッセージの子要素数−共通要素数の子要素数>1の場合

図3‒20　レスポンスメッセージの子要素数−共通要素数の子要素数=0の場合

図3‒21　レスポンスメッセージの子要素数−共通要素数の子要素数=1の場合

図3‒22　レスポンスメッセージの子要素数−共通要素数の子要素数>1の場合

document/literal対応のソースコードから，Java2WSDLコマンドによって生成されたWSDLは，オペレーション名と同一名称の要素で引数がラップされます。また，生成されたWSDLは，メソッドの引数および戻り値をラップする要素が定義されます。このWSDLに対してWSDL2Javaコマンドを実行した場合，ラップした要素が分解されて元の引数，戻り値を持つインタフェースとなります。

document/literal使用時に生成されるWSDL，および生成されるソースコードの関係を次の図に示します。

図3‒23　WSDL生成とJavaソースコード生成の関係（document/literal）

ただし，一部の型については，WSDL2Javaコマンド実行後に異なる型で生成される場合があります。例えば，元となるJavaインタフェースで使用している型が配列でも，生成されたJavaインタフェースでは，配列をラップしたクラスになるといった場合があります。

3.4.3　document/literal使用時のサービスデプロイ定義の生成

document/literalに対応したサービスデプロイ定義の生成方法について説明します。

document/literalに対応したサービスデプロイ定義はJava2WSDDコマンドで生成できます。Java2WSDDコマンドの-zオプションで「DOCUMENT」，-uオプションで「LITERAL」を指定します。

Java2WSDDコマンドの使用方法については，「9.3　Java2WSDDコマンド（サービスデプロイ定義の生成）」を参照してください。

注意事項

DOCUMENTスタイルを使用する場合，メソッドのオーバーロードをしているJavaインタフェースを指定することはできません。

Java2WSDDコマンドで指定できないJavaインタフェースを指定した場合は，エラーメッセージが出力され，異常終了となります。

3.4.4　document/literal使用時のSOAPメッセージの送信

document/literalに対応したSOAPアプリケーションでは，WSDLのwsdl:types要素で定義したスキーマに従ったXMLドキュメントが，SOAPボディの子要素として格納されます。次の図に，WSDLのスキーマ定義と，リクエストメッセージおよびレスポンスメッセージの対応を示します。

図3‒24　WSDLのスキーマ定義とSOAPメッセージ（document/literal）

また，document/literalに対応したWSDLでwsdl:partが存在しない場合は，次の図に示すとおり，子要素を持たない空のSOAPボディ要素が送信されます。

図3‒25　part要素がない場合のWSDLのスキーマ定義とSOAPメッセージ（document/literal）

3.5　RPC形態の添付ファイルの使用

RPC形態のSOAPアプリケーションでは，SOAPサービスを呼び出すときの引数や戻り値を利用して，添付ファイル付きSOAPメッセージを送受信できます。例えば，javax.activation.DataHandlerクラスを使用して，引数に指定したXML文書やイメージデータを送受信できます。

RPC形態の添付ファイルは，document/literalに対応したSOAPアプリケーションで使用できます。また，RPC形態の添付ファイルは，WS-I Attachments Profile - Version 1.0仕様に準拠し，wsi:swaRef形式のWSDLを使用します。

ここでは，RPC形態で添付ファイル付きSOAPメッセージを送受信する方法について説明します。

3.5.1　添付できるファイル

RPC形態では，SOAPメッセージで添付できるファイルの種類に制限はありません。ここでは，添付ファイルのサイズおよび添付ファイルの個数の上限値を示します。また，添付ファイルに対応するMIMEタイプについて説明します。

(1)　添付ファイルのサイズの上限値

添付できるファイルサイズは，デフォルトで100MB（104,857,600バイト）までです。この値は次に示す動作定義ファイルで変更できます。

サーバ定義ファイル

c4web.attachment.<識別子>.send_max_attachment_size

c4web.attachment.<識別子>.receive_max_attachment_size

クライアント定義ファイル

c4web.attachment.send_max_attachment_size

c4web.attachment.receive_max_attachment_size

サーバ定義ファイルについては，「10.2　サーバ定義ファイルの設定」を参照してください。クライアント定義ファイルについては，「10.3　クライアント定義ファイルの設定」を参照してください。

なお，上限値を超える添付ファイルを送信しようとした場合，SOAPサービスの呼び出し時に，SOAP Faultまたは例外が発生します。

(2)　添付ファイルの個数の上限値

添付できるファイル個数は，デフォルトで100個までです。この値は次に示す動作定義ファイルで変更できます。

サーバ定義ファイル

c4web.attachment.<識別子>.send_max_attachment_count

c4web.attachment.<識別子>.receive_max_attachment_count

クライアント定義ファイル

c4web.attachment.send_max_attachment_count

c4web.attachment.receive_max_attachment_count

サーバ定義ファイルについては，「10.2　サーバ定義ファイルの設定」を参照してください。クライアント定義ファイルについては，「10.3　クライアント定義ファイルの設定」を参照してください。

なお，上限値を超える添付ファイルを送信しようとした場合，SOAPサービスの呼び出し時に，SOAP Faultまたは例外が発生します。

(3)　添付ファイルに対応するMIMEタイプ

添付したファイルに対応するMIMEタイプは，添付したファイルの拡張子によって決まります。次の表に，添付ファイルの拡張子とデフォルトで設定されるMIMEタイプの対応を示します。

表3‒13　添付ファイルの拡張子とMIMEタイプの対応（RPC）

添付ファイルとして設定したファイルの拡張子

設定されるMIMEタイプ

html，htm

text/html

txt，text

text/plain

gif，GIF

image/gif

ief

image/ief

jpeg，jpg，jpe，JPG

image/jpeg

tiff，tif

image/tiff

xwd

image/x-xwindowdump

ai，eps，ps

application/postscript

rtf

application/rtf

tex

application/x-tex

texinfo，texi

application/x-texinfo

t，tr，roff

application/x-troff

au

audio/basic

midi，mid

audio/midi

aifc

audio/x-aifc

aif，aiff

audio/x-aiff

wav

audio/x-wav

mpeg，mpg，mpe

video/mpeg

qt，mov

video/quicktime

avi

video/x-msvideo

3.5.2　添付ファイルに使用できるJava型

添付ファイルに使用できるJava型，およびJavaインタフェースで指定できる個所について説明します。

(1)　使用できるJava型

Javaインタフェースに指定するJava型と，添付ファイルとしての使用可否を次の表に示します。

表3‒14　添付ファイルに使用できるJava型（RPC）

項番

Javaインタフェースで指定するJava型

添付ファイルとしての使用可否

1

javax.activation.DataHandler

○※1

2

org.apache.axis.holders.DataHandlerHolder

○

3

javax.activation.DataHandlerの配列型

○

4

org.apache.axis.holders.DataHandlerHolderの配列型

×※2

5

javax.activation.DataHandlerを継承したデータ型

×※3

（凡例）

○：使用できます。

×：使用できません。

注※1

javax.activation.DataHandlerは，JavaBeans Activation Framework（JAF）の型であるため，JAFを使用して任意のMIMEタイプのファイルを添付できます。

注※2

org.apache.axis.holders.DataHandlerHolderの配列型を使用した場合，javax.activation.DataHandlerの配列型としてマッピングされます。

注※3

javax.activation.DataHandlerを継承したデータ型を使用した場合，Java2WSDLコマンドはanyType型，Java2WSDDコマンドはユーザ定義のデータ型クラスとして扱います。

(2)　Javaインタフェースでの指定個所

添付ファイルとして使用できるJava型と，指定できる個所の対応を次の表に示します。

表3‒15　Javaインタフェースでの指定個所と添付ファイルで指定できるJava型の対応（RPC）

項番

Javaインタフェースでの指定個所

添付ファイルのJava型

指定可否

1

メソッド引数

javax.activation.DataHandler

○

2

org.apache.axis.holders.DataHandlerHolder

○

3

javax.activation.DataHandlerの配列型

○

4

メソッド戻り値

javax.activation.DataHandler

○

5

org.apache.axis.holders.DataHandlerHolder

×※1

6

javax.activation.DataHandlerの配列型

○

7

ユーザ定義のデータ型クラスのフィールド

javax.activation.DataHandler

○

8

org.apache.axis.holders.DataHandlerHolder

×※2

9

javax.activation.DataHandlerの配列型

○

10

ユーザ定義例外のフィールド

javax.activation.DataHandler

×※3

11

org.apache.axis.holders.DataHandlerHolder

×※3

12

javax.activation.DataHandlerの配列型

×※3

（凡例）

○：指定できます。

×：指定できません。

注※1

Holderクラスをメソッドの戻り値に指定した場合，Java2WSDLコマンドまたはJava2WSDDコマンドの実行時にエラーとなり，処理が終了します。

注※2

Holderクラスをユーザ定義のデータ型クラスのフィールドに指定した場合，通信時にC4Fault例外が発生します。

注※3

ユーザ定義例外のフィールドに添付ファイルとして使用できるJava型を指定した場合，Java2WSDLコマンドまたはJava2WSDDコマンドの実行時にエラーとなり，処理が終了します。

3.5.3　添付ファイルのJavaインスタンス生成とデータ取得

添付ファイルのJava型であるjavax.activation.DataHandlerは，JavaBeans Activation Framework（JAF）の型です。そのため，JAFの仕様に従って添付ファイルを利用できます。

添付ファイルのインスタンス生成方法とデータ取得方法について説明します。

(1)　インスタンスの生成方法

添付ファイルのオブジェクトであるjavax.activation.DataHandlerオブジェクトの生成方法を説明します。

まず，javax.activation.DataHandlerクラスのコンストラクタを次の表に示します。

表3‒16　javax.activation.DataHandlerクラスのコンストラクタ

項番

利用ケース

コンストラクタ

引数の説明

1

ファイルを添付する

DataHandler(javax.activation.DataSource ds)

第1引数

javax.activation.DataSourceオブジェクトです。javax.activation.FileDataSourceクラスのオブジェクトを指定できます。

2

メモリ上のオブジェクトを添付する

DataHandler(java.lang.Object obj, java.lang.String mimeType)

第1引数

Javaオブジェクトです。ただし，指定できる型は，JAFの仕様でサポートしている範囲の型となります。

第2引数

オブジェクトのMIMEタイプです。JAFの仕様に従って，第1引数で指定したオブジェクトに合わせて指定してください。

添付ファイルとして送信するオブジェクトによって，javax.activation.DataHandlerオブジェクトの生成方法が異なります。生成方法の例を次に示します。

(a)　ファイルを添付ファイルとして送信する場合

ファイルを添付ファイルとして送信する場合の，javax.activation.DataHandlerオブジェクトの生成方法を次に示します。なお，ファイルは存在するファイルを指定してください。

添付ファイルのファイルパスを引数に指定し，javax.activation.FileDataSourceオブジェクトを生成します。

javax.activation.FileDataSource fdSource = new javax.activation.FileDataSource("C:¥¥sample.jpg");

javax.activation.FileDataSourceオブジェクトを引数に指定し，javax.activation.DataHandlerオブジェクトを生成します。

javax.activation.DataHandler dhandler = new javax.activation.DataHandler(fdSource);

(b)　java.lang.Stringオブジェクトを添付ファイルとして送信する場合

java.lang.Stringオブジェクトを添付ファイルとして送信する場合の，javax.activation.DataHandlerオブジェクトの生成方法を次に示します。

添付ファイルとして送信する文字列のjava.lang.Stringオブジェクトを生成します。

java.lang.String attachments = new java.lang.String("あいうえお");

java.lang.Stringオブジェクト，およびMIMEタイプを引数に指定し，javax.activation.DataHandlerオブジェクトを生成します。

java.lang.Stringオブジェクトは，charsetパラメタに指定された文字コードでエンコードされます。

javax.activation.DataHandler dhandler = new javax.activation.DataHandler(attachments, "text/plain; charset=UTF-8");

注意事項

javax.activation.DataHandler(Object, String)コンストラクタの第1引数に，日本語を含むjava.lang.Stringオブジェクトを指定する場合は，第2引数にそのMIMEタイプおよびcharsetパラメタで適切な文字コードを指定する必要があります。javax.activation.DataHandler(Object, String)コンストラクタの第2引数の記述形式を次に示します。

MIMEタイプ ＋ ";" ＋ "charset" ＋ "=" ＋ 文字コード

なお，charsetパラメタを指定する場合は，次の点に注意してください。

charsetパラメタを指定しないと，添付ファイルの文字列がデフォルトの文字コード（US-ASCII）でエンコードされます。そのため，添付ファイルの文字列がUS-ASCII以外の文字を含んでいる場合，不正な添付ファイルが送信されてしまいます。添付ファイルの文字列がUS-ASCII以外の文字を含んでいる場合は，必ずcharsetパラメタを指定してください。

charsetパラメタは，添付ファイルとしてStringオブジェクトを送信する場合だけ指定できます。JPEGなどのバイナリデータを送信する場合は指定できません。

charsetパラメタの指定値（文字コード）については，次の点に注意してください。

大文字／小文字は区別されません。

JDKがサポートしていない文字コードおよび空文字は指定できません。

(2)　添付ファイルのデータ取得方法

添付ファイルのデータ取得方法を次に示します。なお，次の指定例に示す「dhandler」は，受信したjavax.activation.DataHandlerオブジェクトです。

(a)　添付ファイルを受信してjava.io.InputStreamオブジェクトとして取得する場合

添付ファイルのデータをjava.io.InputStreamとして取得します。

受信したjavax.activation.DataHandlerオブジェクトから，getInputStream()メソッドでjava.io.InputStreamオブジェクトを取得します。

java.io.InputStream stream = dhandler.getInputStream();

(b)　添付ファイルを受信してjavax.activation.DataSourceオブジェクトとして取得する場合

javax.activation.DataSourceオブジェクトを取得します。

受信したjavax.activation.DataHandlerオブジェクトから，getDataSource()メソッドで関連づけられたjavax.activation.DataSourceオブジェクトを取得します。

javax.activation.DataSource datasource =dhandler.getDataSource();

(c)　添付ファイルを受信してjava.lang.Stringオブジェクトとして取得する場合

添付ファイルを受信してjava.lang.Stringオブジェクトとして取得する場合の方法を次に示します。

添付ファイルのデータをオブジェクトとして取得します。

受信したjavax.activation.DataHandlerオブジェクトから，getContent()メソッドでオブジェクトを取得します。

java.lang.Object content = dhandler.getContent();

添付ファイルのMIMEタイプを取得します。

受信したjavax.activation.DataHandlerオブジェクトに対し，getContentType()メソッドを実行して，添付ファイルのMIMEタイプおよび文字コードを取得します。

ava.lang.String mimetype = dhandler.getContentType();

ここでは，mimetypeの内容として「text/plain; charset=UTF-8」が取得されます。

オブジェクトを適切な型にキャストします。

添付ファイルのMIMEタイプに応じて，オブジェクトを適切な型にキャストします。

java.lang.String attachment = (java.lang.String) content;

3.5.4　添付ファイル使用時のWSDLの生成

添付ファイルに対応したWSDLは，Java2WSDLコマンドで生成できます。Java2WSDLコマンドの-zオプションで「DOCUMENT」，-uオプションで「LITERAL」を指定します。

添付ファイルに対応したJava型を定義したJavaインタフェースと，WSDLのマッピング例を示します。

図3‒26　JavaインタフェースとWSDLのマッピング例（RPC）

添付ファイルのJava型は，wsi:swaRef型にマッピングされます（図の（1））。wsdl:definitions要素で，wsiの名前空間が宣言されます（図の（2））。wsi:swaRef型を指定しているXML Schemaでwsiの名前空間がインポートされます（図の（3））。

3.5.5　添付ファイル使用時のソースコードの生成

添付ファイルに対応したソースコードは，WSDL2Javaコマンドで生成できます。WSDL2Javaコマンドの-zオプションで「DOCUMENT」，-uオプションで「LITERAL」を指定します。

注意事項

WSDL定義では，MIME拡張要素（mime:multipartRelated，mime:part，mime:content，mime:mimeXml要素）は使用できません。

ユーザ定義例外で添付ファイルは使用できません。wsdl:fault要素内のユーザ定義例外に対応するwsdl:types要素内のelement要素の型に，添付ファイルが定義されている場合，WSDL2Javaコマンド実行時にエラーとなり，処理が終了します。このとき，ソースコードは生成されません。

WSDL定義内のwsi:swaRef型を指定しているXMLスキーマで，wsiの名前空間「http://ws-i.org/profiles/basic/1.1/xsd」をインポートしていない場合，警告メッセージが出力され，処理は続行します。

WSDLでは，wsi:swaRef型はxsd:element内の要素として指定できます。xsd:attribute内の要素として指定した場合，WSDL2Javaコマンド実行時にエラーとなります。

WSDLとソースコードのマッピング例を示します。

図3‒27　WSDLとソースコードのマッピング例（RPC）

WSDL定義のwsi:swaRef型は添付ファイルのJava型へマッピングされます（図の（1））。

3.6　例外処理の実装

この節では，RPC形態のSOAPアプリケーションで実装する例外処理について説明します。

SOAPアプリケーションでは，Java例外，SOAP Fault，およびWSDL Faultに関する処理を実装できます。ここでは，Java例外の種類を示し，Java例外とWSDL Fault，およびJava例外とSOAP Faultのマッピングについて説明します。

3.6.1　Java例外の種類

SOAPアプリケーションで使用できるJava例外の種類を示します。

ユーザ定義例外

ユーザ定義例外とは，サービスメソッドのthrows節で必須のjava.rmi.RemoteExceptionに追加して定義できる例外です。java.lang.Exceptionまたはほかのユーザ定義例外を直接継承して作成します。

C4Fault

C4Fault（com.cosminexus.cws.service.exception.C4Fault）は，Application Server独自の例外です。SOAP Faultを表します。

SOAPFaultException

SOAPFaultException（javax.xml.rpc.soap.SOAPFaultException）は，JAX-RPC 1.1規定の例外です。SOAP Faultを表します。

RemoteException

RemoteException（java.rmi.RemoteException）は，リモートメソッドの呼び出しで発生する通信に関する例外です。サービスメソッドのthrows節では，RemoteExceptionを定義する必要があります。

RuntimeException

RuntimeException（java.lang.RuntimeException）は，アプリケーション実行時に発生するランタイム例外です。

3.6.2　Java例外からWSDLへのマッピング

Java2WSDLコマンドによって，Java例外に対応するWSDLを生成できます。Java例外とWSDLのマッピングを次の図に示します。

図3‒28　Java例外とWSDLのマッピング（Java2WSDLコマンド実行時）

Java例外のうち，ユーザ定義例外がWSDL Fault（wsdl:fault要素）にマッピングされます。そのほかのJava例外については，マッピングされません。

(1)　ユーザ定義例外の定義

ユーザ定義例外は，ユーザ定義のデータ型クラスと同様に作成します。ユーザ定義のデータ型クラスの作成方法については，「4.1.2　Javaインタフェースを作成する」および「4.2.1　SOAPアプリケーションを設計する」を参照してください。ただし，ユーザ定義例外はjava.lang.Exception，またはほかのユーザ定義例外を直接継承しなければなりません。

java.lang.Exceptionを除くほかのJava標準例外※1，およびApplication Serverの実装クラス※2をスーパークラスとして利用することはできません。

java.sql.SQLExceptionのように直接java.lang.Exceptionを継承している場合でも，Java標準例外※1，およびApplication Serverの実装クラス※2自体をユーザ定義例外として利用することはできません。

注※1

J2SE 5.0仕様に対応した次のパッケージ名で始まるクラスは利用できません。

java

javax

org.ietf

org.omg

org.w3c

org.xml

注※2

Application Serverが提供する次のパッケージ名で始まるクラスは利用できません。

com.cosminexus.c4web

com.cosminexus.cws

com.cosminexus.xml

com.cosminexus.wss

org.apache.axis

org.apache.commons.discovery

com.ibm.wsdl

なお，既存のJavaクラスおよびEJBを利用する場合も，ここで示した内容に従って定義する必要があります。

(2)　リモートインタフェースの定義

メソッドのthrows節にユーザ定義例外を定義します。リモートインタフェースの例については，「4.1.2　Javaインタフェースを作成する」を参照してください。

3.6.3　WSDLからJava例外へのマッピング

WSDL2Javaコマンドによって，WSDL Faultに対応するソースコードを生成できます。WSDLとJava例外のマッピングを次の図に示します。

図3‒29　WSDLとJava例外のマッピング（WSDL2Javaコマンド実行時）

WSDL Fault（wsdl:fault要素）とユーザ定義例外のマッピングは可逆ではありません。

(1)　wsdl:part要素の属性

WSDLのwsdl:fault要素から参照されているwsdl:message要素は，wsdl:part要素を一つ持ちます。wsdl:part要素が複数存在する場合，WSDL2JavaコマンドによってKDCCC0239-Eのメッセージが出力されます。Javaソースコードは生成されません。

wsdl:part要素のelement属性が参照できる要素の型，およびtype属性が参照できる型は複合型です。単純型および配列は直接参照できません。単純型または配列を利用する場合は，複合型の子要素として定義してください。

単純型または配列を直接参照するように定義した場合は，WSDL2Javaコマンドによって，KDCCC0238-Eのメッセージが出力されます。Javaソースコードは生成されません。

(2)　WSDL Faultからマッピングされるユーザ定義例外の宣言

WSDL2Javaコマンド実行時に，WSDL Faultからマッピングされるユーザ定義例外の宣言を示します。

表3‒17　WSDL Faultからマッピングされるユーザ定義例外の宣言

Java文法

ユーザ定義例外の宣言

パッケージ名※1

xsd:schema要素のtargetNamespace属性値※2

クラス修飾子

"public"

例外名

xsd:complexType要素のname属性値

スーパークラス

java.lang.Exception

ただし，xsd:extension要素を利用して派生している場合は，派生元のxsd:complexType要素に対応する例外

注※1

「3.6.2(1)　ユーザ定義例外の定義」で示した利用できないパッケージ名の場合，KDCCC0231-Eのメッセージが出力され，ソースコードは生成されません。

注※2

WSDL2Javaコマンドの-Nオプション，-fオプション，および-pオプションで名前空間とパッケージ名のマッピングを変更できます。

(3)　リモートインタフェースの定義

リモートインタフェースのメソッドのthrows節に，必須のjava.rmi.RemoteExceptionに加えて，ユーザ定義例外を定義します。

(4)　xsd:complexType要素からユーザ定義例外へのマッピング

xsd:complexType要素の子要素から，ユーザ定義例外のフィールド，メソッド，コンストラクタへのマッピングは，ユーザ定義のデータ型クラスのマッピング規則に従います。

(5)　soap:fault要素の定義

wsdl:fault要素は，soap:fault要素を一つ持ちます。wsdl:fault要素にsoap:fault要素が存在しない場合，WSDL2JavaコマンドによってKDCCC0012-Eエラーが出力されます。Javaソースコードは生成されません。wsdl:fault要素にsoap:fault要素が複数存在する場合，WSDL2JavaコマンドによってKDCCC0247-Eエラーが出力されます。Javaソースコードは生成されません。

なお，soap:fault要素のname属性は，WSDL 1.1仕様では必須ですが，Application Serverでは必須ではありません。name属性が定義されていない場合，処理が続行されます。また，name属性が定義されている場合でも，name属性の値は利用されません。

3.6.4　Java例外からSOAP Faultへのマッピング

SOAPアプリケーションの実行中に例外が発生した場合の処理の流れと，Java例外とSOAP Faultのマッピングについて説明します。

サービスエンドポイントが例外をスローしたときの処理を次の図に示します。

図3‒30　例外をスローしたときの処理の流れ

Java例外からSOAP Faultへのマッピング規則を次の表に示します。

表3‒18　Java例外からSOAP Faultへのマッピング規則

項番

Java例外

SOAP Fault

faultcode

faultstring

faultactor

detail

1

ユーザ定義例外

message partのメッセージ型指定属性が参照するQName

KDCCP0015-Eのメッセージ

なし

wsdl:fault要素に対応するスキーマインスタンス

2

ユーザ定義例外を継承する例外※1

スーパークラスのユーザ定義例外に対応するfaultcode

KDCCP0015-Eのメッセージ

なし

スーパークラスのユーザ定義例外に対応するdetail

3

C4Fault

例外が保持するfaultcode

例外が保持するfaultstring

例外が保持するfaultactor

例外が保持するdetail

4

SOAPFaultException

例外が保持するfaultcode

例外が保持するfaultstring

例外が保持するfaultactor

例外が保持するdetail

5

RemoteException

c4web:Server.UserServiceException

KDCCP0007-Eのメッセージ

なし

なし

6

RuntimeException

c4web:Server.UserServiceException

KDCCP0007-Eのメッセージ

なし

なし

7

項番1〜6以外※2

c4web:Server.UserServiceException

KDCCP0007-Eのメッセージ

なし

なし

注※1

サービスメソッドのthrows節で定義されているユーザ定義例外を継承する例外が該当します。ユーザ定義例外を継承する例外は，throws節で定義されていないため，WSDL Faultとは対応しません。スーパークラスであるユーザ定義例外として扱われます。

注※2

サービスメソッドのthrows節に，java.rmi.RemoteExceptionおよびユーザ定義例外のどちらでもない例外を定義した場合に該当します。

3.6.5　SOAP FaultからJava例外へのマッピング

SOAPアプリケーションの実行中にSOAP Faultを受信した場合の処理の流れと，SOAP FaultとJava例外のマッピングについて説明します。

(1)　スタブを使用した場合

スタブを使用した場合に，SOAP Faultを受信したときの処理の流れを次の図に示します。

図3‒31　SOAP Fault受信時の処理の流れ（スタブ）

SOAP Faultを受信したときの処理を次の表に示します。

表3‒19　SOAP Fault受信時の処理（スタブ）

項番

SOAP Fault

SOAPクライアント

1

WSDL Faultに対応するインスタンス

ユーザ定義例外が取得されます。

2

WSDL Faultに対応しないインスタンス

C4Faultが取得されます。

SOAP FaultからJava例外へのマッピング規則を次の表に示します。

表3‒20　SOAP FaultからJava例外へのマッピング規則（スタブ）

SOAP Faultの要素

ユーザ定義例外の場合

C4Faultの場合

faultcode

マッピングされません。

C4FaultのFaultCodeに設定されます。

faultstring

マッピングされません。

C4FaultのFaultStringに設定されます。

faultactor

マッピングされません。

C4FaultのFaultActorに設定されます。

detail

wsdl:fault要素で指定しているスキーマに従って，ユーザ定義例外へマッピングされます。

C4FaultのFaultDetailに設定されます。

(2)　DIIを使用した場合

DIIを使用した場合に，SOAP Faultを受信したときの処理の流れを次の図に示します。

図3‒32　SOAP Fault受信時の処理の流れ（DII）

SOAP Faultを受信したときの処理を次の表に示します。

表3‒21　SOAP Fault受信時の処理（DII）

項番

SOAP Fault

SOAPクライアント

1

WSDL Faultに対応するインスタンス

RemoteExceptionからC4Faultがアンラップされます。

C4Faultからユーザ定義例外がアンラップされます。

ユーザ定義例外が取得されます。

2

WSDL Faultに対応しないインスタンス

C4FaultをラップしたRemoteExceptionが取得されます。

C4FaultをラップしたRemoteExceptionの内容を示します。

表3‒22　C4FaultをラップしたRemoteException（DII）

RemoteException

内容

詳細メッセージ

KDCCP3008-E An attempt to execute the invoke method has failed.(Class name = <クラス名>, Method signature = <メソッドシグネチャ>, reason = <理由>)

原因例外

C4Fault

3.7　クライアントの開発

SOAPアプリケーションを新規に開発する場合，および既存のJavaクラスを利用して開発する場合，クライアントはWSDL2Javaコマンドで生成したスタブを使用して実装します。また，SOAPアプリケーションのクライアントでは，ManagementクラスとClientIDクラスの実装が必要になります。

ここでは，スタブの使用方法，およびManagementクラスとClientIDクラスの使用方法について説明します。

なお，DIIを使用してSOAPアプリケーションを開発する場合のクライアントについては，「3.8　DIIを使用したクライアントの開発」を参照してください。

3.7.1　スタブの使用

生成されるスタブの内容，およびスタブを使用してSOAPサービスを呼び出す場合の実装について説明します。

(1)　スタブの内容

WSDL2Javaコマンドで生成するファイルのうち，クライアントでは次に示すファイル（スタブ）を使用します。

表3‒23　クライアントで利用するファイル（スタブ）

ファイル名

内容

<サービス名>Locator.java

サービスクラスです。SOAPサービスへの接続情報を保持しています。

<ポートタイプ名>.java

リモートインタフェースです。SOAPサービスで利用できるメソッドを定義しています。

<データ型名>.java

ユーザ定義のデータ型クラスです。メソッドのパラメタや，パラメタのクラスで参照されるデータ型を定義しています。必要に応じて使用します。

サービス名はWSDLのwsdl:service要素のname属性の値が設定されます。ポートタイプ名はWSDLのwsdl:portType要素のname属性の値が設定されます。また，データ型名はユーザ定義のデータ型の名前に応じて設定されます。

サービスクラス

SOAPサービスへの接続先（endpoint）情報を参照および設定できます。このクラスでは次のメソッドを提供します。

表3‒24　サービスクラスのメソッド

メソッド名

機能説明

get<ポート名>Address

SOAPサービスへの接続先情報を返します。

戻り値：java.lang.String

get<ポート名>

リモートインタフェースへのオブジェクトポインタを返します。

戻り値：リモートインタフェースへのオブジェクトポインタ

get<ポート名>(java.net.URL portAddress)

指定されたSOAPサービスへの接続先情報を使用して，リモートインタフェースへのオブジェクトポインタを返します。

戻り値：リモートインタフェースへのオブジェクトポインタ

ポート名はWSDLのwsdl:port要素のname属性の値が設定されます。

注意事項

生成されたスタブの内容は変更しないでください。

リモートインタフェース

メソッドを呼び出すことによって，SOAPサービスのオペレーションを呼び出すことができます。

(2)　サービス呼び出し処理の実装

スタブを使用してSOAPサービスを呼び出す処理を実装します。次の例では，サービスクラスの例をUserInfoServiceLocator.java，リモートインタフェースの例をUserInfo.javaとしています。

クライアントの開始処理を実行し，クライアント識別子を取得します。

ManagementクラスおよびClientIDクラスを使用します。なお，呼び出しごとにこの操作を実行する必要はありません。

（例）
   ClientID cltID = Management.initializeClient();

ManagementクラスおよびClientIDクラスの使用方法については，「3.7.2　ManagementクラスとClientIDクラスの使用」を参照してください。ManagementクラスおよびClientIDクラスのAPI仕様については，「13.　SOAP通信基盤が提供するAPI」を参照してください。

クライアント識別子を現在のスレッドに関連づけます。

（例）
   Management.connectClientIDtoCurrentThread(cltID);

サービスクラスのオブジェクトを生成します。

（例）
   UserInfoServiceLocator uis = new UserInfoServiceLocator();

サービスクラスのオブジェクトを使用して，リモートインタフェースのオブジェクトを生成します。

なお，生成，取得したリモートインタフェースのインスタンスは，複数のスレッドで共有できません。

（例）
   UserInfo ui = uis.getUserInfo();

SOAPサービスへの接続先は，WSDLのwsdl:service要素のsoap:address子要素のlocation属性となります。クライアントプログラム内でSOAPサービスへの接続先情報を取得する場合は，次のように記述します。

（例）
   String url = uis.getUserInfoAddress();

また，クライアントプログラム内でSOAPサービスへの接続先を変更する場合は，次のように記述します。

（例）
   java.net.URL endpoint = new java.net.URL("http://hostname:8080/WebApp1/services/UserInfo");
   UserInfo ui = uis.getUserInfo(endpoint);

リモートインタフェースのオブジェクトのメソッドを呼び出して，SOAPアプリケーションのオペレーションを実行します。

（例）
   String name = ui.getName();

実装例の全体は，「4.1.8　クライアント側の処理を実装する」を参照してください。

なお，DeployScopeが「Session」となっているSOAPサービスを呼び出すクライアントプログラムを実装する場合，SOAPサービスのJavaインタフェースのインスタンスは，JSPやサーブレットが呼び出されるたびに，ローカル変数に生成してください。初期化や呼び出し時に，インスタンスを生成後，それをメンバ変数に退避して，複数のスレッドで共有すると，DeployScopeの「Session」が有効にならない場合があります。なお，DeployScopeが「Session」の場合は，クライアントプログラムからの呼び出し単位で，セッションが切り替わります。

このセッションは，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)」で記述している「J2EEサーバ間のセッション情報の引き継ぎ」には対応していません。

3.7.2　ManagementクラスとClientIDクラスの使用

Managementクラスは，トレースファイルおよびアプリケーションログの初期化処理と終了処理，クライアント識別子とスレッドの関連づけを行うクラスです。また，ClientIDクラスはクライアント識別子を表すクラスです。SOAP通信基盤でクライアントを開発する場合は，必ずManagementクラスとClientIDクラスを使用してください。

なお，サーバから別のSOAPアプリケーションを呼び出すような場合（サーバが別のサーバに対するクライアントとなる場合）は，このクラスのメソッドを使用する必要はありません。

ManagementクラスおよびClientIDクラスのAPI仕様については，「13.　SOAP通信基盤が提供するAPI」を参照してください。

ここでは，ManagementクラスおよびClientIDクラスのメソッドを呼び出すタイミングについて説明します。

(1)　コマンドラインを利用する場合

コマンドラインからSOAPアプリケーションを利用する場合，Managementクラスのメソッドは次の表に示すタイミングで呼び出します。

表3‒25　Managementクラスのメソッド呼び出しのタイミング（コマンドライン利用時）

メソッド名

呼び出し位置

initializeClient

起動時に1回だけ呼び出します。

connectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出す前に1回だけ呼び出します。マルチスレッド環境の場合は，各スレッドの開始時に1回だけ呼び出します。

disconnectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出したあとに1回だけ呼び出します。マルチスレッド環境の場合は，各スレッドの終了時に1回だけ呼び出します。

finalizeClient

終了時に1回だけ呼び出します。

(2)　サーブレットを利用する場合

サーブレットからSOAPアプリケーションを利用する場合，Managementクラスのメソッドは次の表に示すタイミングで呼び出します。

表3‒26　Managementクラスのメソッド呼び出しのタイミング（サーブレット利用時）

メソッド名

呼び出し位置

initializeClient

initメソッドで1回だけ呼び出します。

connectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出す前に1回だけ呼び出します。

disconnectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出したあとに1回だけ呼び出します。マルチスレッド環境の場合は，各スレッドの終了時に1回だけ呼び出します。

finalizeClient

destroyメソッドで1回だけ呼び出します。

(3)　EJBを利用する場合

EJBからSOAPアプリケーションを利用する場合，Managementクラスのメソッドは次の表に示すタイミングで呼び出します。

表3‒27　Managementクラスのメソッド呼び出しのタイミング（EJB利用時）

メソッド名

呼び出し位置

initializeClient

ejbCreateメソッドで1回だけ呼び出します。

connectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出す前に1回だけ呼び出します。

disconnectClientIDtoCurrentThread

スタブが提供するメソッドを呼び出したあとに1回だけ呼び出します。マルチスレッド環境の場合は，各スレッドの終了時に1回だけ呼び出します。

finalizeClient

ejbRemoveメソッドで1回だけ呼び出します。

3.8　DIIを使用したクライアントの開発

DIIを使用したSOAPアプリケーションを開発するには，WSDLに必要な情報を定義して，クライアント側の処理を実装する必要があります。

ここでは，DIIを使用してSOAPアプリケーションのクライアントを開発する方法について説明します。

3.8.1　DIIの使用時にWSDLに必要な情報

DIIを使用したSOAPアプリケーションでは，WSDLを読み込んで必要な情報を保持して，SOAPサービスのオペレーションを呼び出します。

DIIを使用する場合に，WSDLに必要な情報を示します。WSDLの例については，「4.5　DIIを使用して開発する場合」を参照してください。

WSDLのサービス名

名前空間URI…wsdl:service要素の名前空間URI

ローカル名…wsdl:service要素のname属性

WSDLのURL※

WSDLのポート名

名前空間URI…wsdl:port要素の名前空間URI

ローカル名…wsdl:port要素のname属性

WSDLのオペレーション名

名前空間URI…wsdl:operation要素の名前空間URI

ローカル名…wsdl:operation要素のname属性

オペレーションのパラメタ名

wsdl:part要素でtype属性を使用している場合

パラメタ名…wsdl:part要素のname属性

パラメタの型…wsdl:part要素のtype属性

wsdl:part要素でelement属性を使用している場合

パラメタ名…wsdl:part要素のelement属性で参照している要素のname属性

パラメタの型…wsdl:part要素のelement属性で参照している要素のtype属性

wrapped形式のWSDLの場合

パラメタ名…ラップされた要素のname属性

パラメタの型…ラップされた要素のtype属性

オペレーションの戻り値

wsdl:part要素でtype属性を使用している場合

戻り値の型…wsdl:part要素のtype属性

wsdl:part要素でelement属性を使用している場合

戻り値の型…wsdl:part要素のelement属性で参照している要素のtype属性

wrapped形式のWSDLの場合

戻り値の型…ラップされた要素のtype属性

XMLの複合型

複合型の名前空間URI…xsd:complexType要素の名前空間URI

複合型の名前…xsd:complexType要素のname属性

複合型に定義した子要素の名前…xsd:element要素のname属性

複合型に定義した子要素の型…xsd:element要素のtype属性

XMLの配列

maxOccurs属性にunboundedを指定した要素の場合

配列の名前…xsd:element要素のname属性

配列の要素型…xsd:element要素のtype属性

wsdl:arrayType属性を利用してsoapenc:Arrayを制限した複合型の場合

配列の名前…xsd:complexType要素のname属性

配列の要素型…xsd:attribute要素のwsdl:arrayType属性

注※

WSDLのURLには，ローカルファイルへのパスを設定してください。なお，Windows環境では大文字と小文字は区別されません。UNIX環境では大文字と小文字が区別されます。

3.8.2　DIIのクライアント側の処理を実装する

DIIを使用する場合，クライアント側にServiceオブジェクト，Callオブジェクト，およびパラメタを生成する処理を実装します。また，SOAPサービスを呼び出す処理を実装します。クライアント側の処理の実装例については，「4.5　DIIを使用して開発する場合」を参照してください。

(1)　Serviceオブジェクトの生成

Serviceオブジェクトは次の手順で生成します。

ServiceFactory#newInstanceメソッドを使用して，ServiceFactoryオブジェクトを生成します。

WSDLのURLを表すURLオブジェクトを生成します。引数にWSDLのURL文字列を指定します。

サービスのQNameオブジェクトを生成します。wsdl:service要素の名前空間URIを名前空間URIとして，wsdl:service要素のname属性をローカル名として，引数に指定します。

ServiceFactory#createService(URL wsdlDocumentation, QName serviceName)メソッドを使用して，Serviceインスタンスを生成します。引数に2.および3.で生成したオブジェクトを指定します。

URLには，ローカルファイルへのパスを設定する必要があります。Windows環境では大文字と小文字は区別されません。UNIX環境では大文字と小文字が区別されます。ローカルファイル以外のパスを設定した場合は，javax.xml.rpc.ServiceException例外がスローされます。

SOAPクライアントライブラリは，Serviceインスタンス生成時に，WSDLを読み込み，ServiceオブジェクトはWSDLの情報を保持します。

(2)　Callオブジェクトの生成

Callオブジェクトは次の手順で生成します。

ポートのQNameオブジェクトを生成します。wsdl:port要素の名前空間URIを名前空間URIとして，wsdl:port要素のname属性をローカル名として，引数に指定します。

オペレーションのQNameオブジェクトを生成します。wsdl:operation要素の名前空間URIを名前空間URIとして，wsdl:operation要素のname属性をローカル名として，引数に指定します。

Service#createCall(QName portName, QName operationName)メソッドを使用して，Callインスタンスを生成します。引数に1.および2.で生成したオブジェクトを指定します。

ここで生成されたCallオブジェクトは，Serviceオブジェクトが保持するWSDLの情報を保持します。

(3)　プロパティの設定

必要に応じて，Call#setPropertyメソッドを使用してプロパティを設定します。設定できるプロパティについては，「13.3　C4Propertyクラス（実行時オプションの設定）」のsetPropertyメソッドの説明を参照してください。

(4)　パラメタの生成

パラメタは次の手順で生成します。メソッドのパラメタには，「12.2.6　DII使用時のサポート範囲」に示すJavaデータ型を指定できます。

(2)で生成したCallオブジェクトをcom.cosminexus.cws.xml.rpc.Call型へキャストします。

com.cosminexus.cws.xml.rpc.CallインタフェースのgetParameterClassByName(String paramName)メソッドの引数に，オペレーションのパラメタのローカル名を指定し，パラメタのJava型のClassオブジェクトを取得します。

パラメタのJava型のオブジェクトを生成します。

パラメタでプリミティブ型およびJava標準クラスを使用する場合

1.取得したパラメタのJava型が，WSDLのパラメタのデータ型に対応するJava型と一致するか確認します。

2.Java型が一致した場合，Java型のオブジェクトを生成します。

パラメタでユーザ定義のデータ型クラスを使用する場合

1.XMLの複合型から完全修飾Javaクラス名を生成します。クラス名は複合型の名前空間URIと複合型の名前から生成します。

2.取得したパラメタのJava型のクラス名が，生成したクラス名と一致するか確認します。

3.クラス名が一致した場合，取得したパラメタのJava型のClassオブジェクトから，java.lang.Class#newInstance()メソッドを使用してオブジェクトを生成します。

4.複合型に定義した子要素の名前と型から，ユーザ定義のデータ型クラスのアクセサの名前を取得します。リフレクションを使用してアクセサを呼び出し，ユーザ定義のデータ型クラスのプロパティを設定します。なお，アクセサについては，「3.8.3(2)　WSDLとユーザ定義のデータ型クラスのマッピング」を参照してください。

パラメタで配列を使用する場合

1.取得したパラメタのJava型が，XMLの配列に対応するJava配列型と一致するか確認します。

2.Java型が一致した場合，リフレクションを使用して配列を生成します。

(5)　SOAPサービスの呼び出し

SOAPサービスは次の手順で呼び出します。

(4)で生成したパラメタを要素として持つObject配列を生成します。

Call#invoke(Object[] inputParams)メソッドを使用して，サービスを呼び出します。引数には，1.で生成したObject配列を指定します。

戻り値を取得します。

RemoteExceptionがスローされた場合は，必要な処理を行います。

(6)　戻り値の処理

戻り値は次の手順で処理します。メソッドの戻り値には，「12.2.6　DII使用時のサポート範囲」に示すJavaデータ型を指定できます。

戻り値のオブジェクトからjava.lang.Object#getClass()メソッドを使用して，戻り値のJava型のClassオブジェクトを取得します。

戻り値のオブジェクトから値を取得します。

戻り値でプリミティブ型およびJava標準クラスを使用する場合

1.取得した戻り値のJava型が，WSDLの戻り値のデータ型に対応するJava型と一致するか確認します。

2.Java型が一致した場合，リフレクションを使用して戻り値のオブジェクトから値を取得します。

戻り値でユーザ定義のデータ型クラスを使用する場合

1.XMLの複合型から完全修飾Javaクラス名を生成します。クラス名は複合型の名前空間URIと複合型の名前から生成します。

2.取得した戻り値のJava型のクラス名が，生成したクラス名と一致するか確認します。

3.クラス名が一致した場合，複合型に定義した子要素の名前と型から，ユーザ定義のデータ型クラスのアクセサの名前を取得します。リフレクションを使用してアクセサを呼び出し，ユーザ定義のデータ型クラスのプロパティを取得します。なお，アクセサについては，「3.8.3(2)　WSDLとユーザ定義のデータ型クラスのマッピング」を参照してください。

戻り値で配列を使用する場合

1.取得した戻り値のJava型が，XMLの配列に対応するJava配列型と一致するか確認します。

2.Java型が一致した場合，リフレクションを使用して配列の要素を生成します。

(7)　例外の処理

次の手順で例外を処理します。例外には，ユーザ定義例外クラスを指定できます。

RemoteExceptionからC4Fault例外を取得します。

C4Fault例外からユーザ定義例外を取得します。

C4Fault例外にユーザ定義例外が含まれる場合

リフレクションを使用してユーザ定義例外の情報を取得します。取得方法は，「3.8.2(6)　戻り値の処理」の2.「戻り値でユーザ定義のデータ型クラスを使用する場合」を参照してください。

C4Fault例外にユーザ定義例外が含まれない場合

C4Fault例外からSOAP Faultの情報を取得します。

3.8.3　DIIでのユーザ定義のデータ型クラスの使用

ユーザ定義のデータ型クラスとは，任意のデータ型を持つデータ型です。DIIでユーザ定義のデータ型クラスを使用する場合，データ数やデータの型は，WSDLの複合型として自由に定義できます。

ここでは，DIIでユーザ定義のデータ型クラスを使用する方法について説明します。

(1)　処理の流れ

ユーザ定義のデータ型クラスを使用する場合，必要な情報をWSDLの複合型として定義することで，対応するJavaクラスを生成できます。

ユーザ定義のデータ型クラスは，次の図に示す流れで使用します。

図3‒33　ユーザ定義のデータ型クラスの使用の流れ（DII）

複合型が定義されているWSDLファイル名と利用するサービス名をServiceFactory#createServiceメソッドの引数に指定し，Serviceオブジェクトを呼び出します。

Serviceオブジェクトの生成時にWSDLファイルからJavaソースファイルが生成されます。

2.と同時にJavaクラスにコンパイルされます。

3.でコンパイルされたJavaクラスは，DIIクラスローダによって読み込まれ，使用できる状態になります。

Javaソースおよびクラスファイルは，クラスローダに読み込まれたあとに削除されます。

(2)　WSDLとユーザ定義のデータ型クラスのマッピング

WSDLとユーザ定義のデータ型クラスのマッピング規則，およびgetter／setterのマッピング規則を示します。

表3‒28　WSDLとユーザ定義のデータ型クラスのマッピング規則（DII）

要素

属性

ユーザ定義のデータ型クラス

備考

xsd:schema

targetNamespace

パッケージ名

−

┗

xsd:complexType

name

クラス名

−

コンストラクタ

publicである引数なしコンストラクタが定義されます。

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

xsd:element

name

フィールド（プロパティ）名

−

メソッド（アクセサ）のパラメタ名

−

type

フィールド（プロパティ）の型

対応する型については，「12.2.6　DII使用時のサポート範囲」を参照してください。

メソッド（アクセサ）のパラメタと戻り値の型

┗

xsd:complexContent

−

継承

java.lang.Objectクラス，またはほかのユーザ定義のデータ型クラスを継承して定義されます。

┗

xsd:extension

base

（凡例）

−：特にありません。

表3‒29　getterのマッピング規則（DII）

要素

属性

ユーザ定義のデータ型クラス

備考

xsd:element

neme

メソッド（アクセサ）名

"get"+先頭を大文字にした名称で出力されます。戻り値がbooleanの場合は，"is"+先頭を大文字にした名称で出力されます。

type

戻り値

プロパティの値が返されます。

表3‒30　setterのマッピング規則（DII）

要素

属性

ユーザ定義のデータ型クラス

備考

xsd:element

neme

メソッド（アクセサ）名

"set"+先頭を大文字にしたプロパティ名で出力されます。

type

パラメタ

プロパティと同じ型のパラメタが一つだけ出力されます。

WSDLとユーザ定義のデータ型クラスのマッピング例を次に示します。

図3‒34　WSDLとユーザ定義のデータ型クラスのマッピング例（DII）

(3)　Javaソース生成時の出力先ディレクトリ

Javaソースファイルおよびクラスファイルの出力先ディレクトリを次に示します。

Windowsの場合

<Application Serverのインストールディレクトリ>/c4web/dii/temp

UNIXの場合

/opt/Cosminexus/c4web/dii/temp

Javaソースファイルおよびクラスファイルの出力先ディレクトリは，サーバ定義ファイルまたはクライアント定義ファイルの次のプロパティで変更できます。

サーバ定義ファイル

c4web.application.<識別子>.dii_temp_directory

クライアント定義ファイル

c4web.application.dii_temp_directory

サーバ定義ファイルについては，「10.2　サーバ定義ファイルの設定」を参照してください。クライアント定義ファイルについては，「10.3　クライアント定義ファイルの設定」を参照してください。

(4)　ユーザ定義のデータ型クラスのClassオブジェクトを取得する方法

ユーザ定義のデータ型クラスを使用する場合，リフレクションを使用してプロパティの値を取得したり設定したりします。リフレクションで必要なユーザ定義のデータ型クラスのClassオブジェクトは，次の方法で取得します。

表3‒31　ユーザ定義のデータ型クラスのClassオブジェクトを取得する方法

項番

ユーザ定義のデータ型クラスの使用個所

Classオブジェクトの取得方法

1

パラメタ

com.cosminexus.cws.xml.rpc.CallインタフェースのgetParameterClassByNameメソッドの引数に，パラメタのローカル名を指定して取得します。

2

戻り値

java.lang.ObjectクラスのgetClassメソッドを使用して，戻り値のオブジェクトから取得します。

3

ユーザ定義のデータ型クラスのプロパティ

java.lang.ClassクラスのgetMethodsメソッドを使用して，アクセサのjava.lang.reflect.Methodオブジェクトを取得します。アクセサによって，取得方法が次のように異なります。

アクセサがgetterの場合

java.lang.reflect.MethodインタフェースのgetReturnTypeメソッドを使用して，プロパティのClassオブジェクトを取得します。

アクセサがsetterの場合

java.lang.reflect.MethodインタフェースのgetParameterTypesメソッドを使用して，プロパティのClassオブジェクトを取得します。

4

配列の要素型

java.lang.ClassクラスのgetComponentTypeメソッドを使用して，配列クラスから取得します。

注

java.lang.ClassクラスのforNameメソッドの引数に，ユーザ定義のデータ型クラスの完全修飾名を指定して，ユーザ定義のデータ型クラスのClassオブジェクトを取得することはできません。

3.8.4　WSDLのキャッシュ

DIIではSOAPサービスを呼び出すときに，Serviceオブジェクトを生成します。Serviceオブジェクトを生成するたびにWSDLファイルを読み込むと，処理性能が低下してしまいます。そこで，WSDLをキャッシュし，再利用することで処理性能を向上させます。

JavaVM稼働中であればキャッシュしたWSDLが参照されます。ただし,キャッシュ後にWSDLファイルを変更した場合は，その情報は反映されません。キャッシュ後にWSDLを変更した場合は，JavaVMを再度開始してください。

3.8.5　WSDL解析とJavaソース生成のタイムアウト

DIIではWSDLの解析およびJavaソースの生成に時間が掛かると，タイムアウトが発生し処理が終了します。タイムアウトのデフォルトは45秒です。タイムアウト値は，サーバ定義ファイルまたはクライアント定義ファイルの次のプロパティでデフォルト値から変更できます。

サーバ定義ファイル

c4web.application.<識別子>.dii_wsdl_parse_timeout

クライアント定義ファイル

c4web.application.dii_wsdl_parse_timeout

サーバ定義ファイルについては，「10.2　サーバ定義ファイルの設定」を参照してください。クライアント定義ファイルについては，「10.3　クライアント定義ファイルの設定」を参照してください。

3.9　アーカイブ（WARファイル）の作成

SOAPサービスをJ2EEサーバにデプロイするには，アーカイブ（WARファイル）を作成する必要があります。WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

ここでは，SOAPアプリケーションの開発に必要な内容について説明します。

3.9.1　サービスデプロイ定義ファイル（server-config.xml）の格納

WSDL2JavaコマンドまたはJava2WSDDコマンドで生成したサービスデプロイ定義ファイル（server-config.xml）は，必ずWEB-INFディレクトリの直下に格納してください。

3.9.2　DD（web.xml）の記述

servlet要素およびservlet-mapping要素には，次のように記述してください。

表3‒32　<servlet>の設定項目

項番

<servlet-name>

<display-name>

<servlet-class>

<load-on-startup>

1

任意の文字列

任意の文字列

com.cosminexus.cws.transport.http.c4webServlet

指定しません。

2

任意の文字列

任意の文字列

com.cosminexus.cws.transport.http.AdminServlet

100

表3‒33　<servlet-mapping>の設定項目

<url-pattern>

<servlet-name>

/servlet/c4webServlet

<servlet>の設定項目の項番1で設定したサーブレット名

/services/*

<servlet>の設定項目の項番1で設定したサーブレット名

/servlet/AdminServlet

<servlet>の設定項目の項番2で設定したサーブレット名

DD（web.xml）での設定項目とサービスロケーションの関係について

「サーブレットクラス」が"com.cosminexus.cws.transport.http.c4webServlet"の場合，「URLパターン（/services/*）」がサービスロケーションの一部になります（サービスロケーションがhttp://localhost:8080/WebApp1/services/UserInfoの場合，services部分）。サービスロケーションの名称に合わせて，URLパターンを変更してください。サービスロケーションについては「3.3.1　サービスロケーションの指定」を参照してください。

3.9.3　アーカイブ（WARファイル）作成時の注意事項

一つのアーカイブ（WARファイル）には，一つのWSDLが対応します。複数のWSDLから生成したSOAPサービスを，同一のアーカイブ（WARファイル）に含めることはできません。

3.10　.NET Frameworkに対応したSOAPアプリケーションの開発

SOAPアプリケーション開発支援機能では，.NET Frameworkで開発したクライアントアプリケーションを利用するSOAPアプリケーションを開発できます。

ここでは，.NET Frameworkを使用して開発する場合の前提条件，およびSOAPアプリケーションで使用するファイルの生成について説明します。

3.10.1　.NET Framework使用時の前提条件

.NET Frameworkを使用して開発する場合の前提条件を示します。

(1)　インタフェース形態

.NET Frameworkを使用する場合，document/literalで開発してください。また，wrapped形式のWSDLを使用してください。

wrapped形式については，「3.3.3(3)　DOCUMENT／LITERALを指定した場合」を参照してください。

(2)　WSDLのサポート範囲

WSDLのサポート範囲については，「12.2.1　WSDL 1.1仕様のサポート範囲」を参照してください。XML Schemaのサポート範囲については，「12.2.7　.NET Framework使用時のサポート範囲」を参照してください。

.NET Frameworkを使用して開発する場合，soapencoding型は使用できません。

(3)　通信プロトコルについて

.NET Frameworkを使用して開発する場合，通信プロトコルにIPv6は使用できません。

3.10.2　.NET Framework使用時のWSDLの生成

.NET Frameworkに対応したWSDLは，Java2WSDLコマンドで生成できます。コマンド実行時は，次のオプション値を指定してください。

表3‒34　.NET Framework使用時のJava2WSDLコマンドの指定値

オプション

値

説明

-T

1.1

TypeMappingVersionを表す-Tオプションに，1.1を指定するか，このオプションの指定を省略してください。

-z

DOCUMENT

WSDLのバインディングスタイルを表す-zオプションに，DOCUMENTを指定してください。

-u

LITERAL

use属性を表す-uオプションに，LITERALを指定してください。

3.10.3　.NET Framework使用時のソースコードの生成

.NET Frameworkを使用して開発するクライアントアプリケーションに必要なソースコード（スタブ）は，.NET Framework SDKが提供するwsdlコマンドで生成してください。

3.10.4　.NET Framework使用時のサービスデプロイ定義の生成

.NET Frameworkを使用して開発したクライアントアプリケーションを利用する場合のサービスデプロイ定義は，Java2WSDDコマンドで生成できます。コマンド実行時は，次のオプション値を指定してください。

表3‒35　.NET Framework使用時のJava2WSDDコマンドの指定値

オプション

値

説明

-T

1.1

TypeMappingVersionを表す-Tオプションに，1.1を指定するか，このオプションの指定を省略してください。

-z

DOCUMENT

WSDLのバインディングスタイルを表す-zオプションに，DOCUMENTを指定してください。

-u

LITERAL

use属性を表す-uオプションに，LITERALを指定してください。

3.10.5　.NET Framework使用時の注意事項

.NET Frameworkで開発したクライアントアプリケーションから，SOAPアプリケーション開発支援機能で開発したサービスを呼び出す場合，メソッドの引数にnullオブジェクトを指定しないでください。また，サービスからの戻り値にnullオブジェクトを指定しないでください。メソッドの引数または戻り値にnullオブジェクトを指定すると，次の現象が発生する場合があります。

不正なSOAPメッセージが生成される。

対象オブジェクトに不正な値が設定される。

3.11　RPC形態のSOAPアプリケーション開発時の注意事項

RPC形態のSOAPアプリケーション開発時の注意事項について説明します。EJBを利用している場合は，「3.12　EJB利用時の注意事項」もあわせて参照してください。

3.11.1　SOAPアプリケーションのサービス名に関する注意

RPC形態，メッセージング形態，およびEJB形態のSOAPサービスで，同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると，予期しない動作をするおそれがあります。

3.11.2　WSDL定義とHolderクラスの対応について

WSDL中の<output>要素に記述されているデータ型は，ソース生成時にHolderクラスになります。

例えば，string(http://www.w3.org/2001/XMLSchema)を<output>要素に記述した場合，javax.xml.rpc.holders.StringHolderクラスが生成されます。

stringを例に，Holderクラスの使用例を次に示します。

Holderクラスから値を取得する場合

public void get(javax.xml.rpc.holders.StringHolder inout0)
{
    java.lang.String value = inout0.value;
}

Holderクラスに値を格納する場合

public void set(javax.xml.rpc.holders.StringHolder out0)
{
    out0.value = new java.lang.String("test");
}

3.11.3　anyType型のデータ型の送信に関する注意

WSDL定義でデータ型にanyTypeを使用した場合，実行時オプションのデータ型定義オプション（send_xsi_types）の設定に関係なく，送信するSOAPメッセージ中にデータ型が含まれます。SOAP通信基盤を他社のSOAP製品と接続する場合はSOAPメッセージ中にデータ型を含めるようにしてください。anyType型のデータを受信する場合に，SOAPメッセージ中にデータ型が含まれていないとC4Fault例外が発生する場合があります。

3.11.4　GETプロトコルを使用したWSDLファイルの取得に関する注意

SOAP通信基盤では，SOAPサービスのエンドポイントURLに「?WSDL」を付与したURLに対してHTTP GETプロトコルを使用しても，WSDLファイルを取得できません。HTTP GETプロトコルを使用してWSDLファイルを取得できるようにする場合は，SOAPサービスを含むWARファイルにWSDLファイルを格納し，該当するファイルを表すURLに対してHTTP GETプロトコルを使用するようにしてください。

3.11.5　LITERAL指定時のSOAPメッセージに関する注意

use属性にLITERAL，そしてTypeMappingVersionに1.2を指定して生成されたWSDLまたはWSDDを使用して通信する場合，SOAPメッセージ中の要素にxsi:type属性が付与されることがあります。

3.11.6　ENCODED指定時のSOAPメッセージに関する注意

use属性にENCODED，そしてTypeMappingVersionに1.1を指定して生成されたWSDLまたはWSDDを使用して通信する場合，SOAPメッセージ中の要素にSOAPエンコーディングのデータ型情報が付与されることがあります。

3.11.7　リテラルエンコーディングと多重参照オプション（do_multirefs）に関する注意

SOAP符号化規則にリテラルエンコーディングを使用したSOAPメッセージを送受信する場合，多重参照オプションにtrueを設定しても有効になりません。多階層となるようなSOAPメッセージが送受信できなくなることがあります。多階層となるようなSOAPメッセージを送受信したい場合は，SOAP符号化規則にSOAPエンコーディングを使用してください。

3.11.8　DeployScopeを「Session」にしたSOAPアプリケーションに関する注意

DeployScopeを「Session」にしたSOAPアプリケーションを開発する場合，SOAP通信基盤に対してセッション終了を要求するサービスメソッドを用意できます。このサービスメソッド内でSOAP通信基盤が提供する「C4Sessionのinvalidateメソッド」を呼び出すことで，SOAP通信基盤に対してセッション終了を要求できます。クライアント側の処理では，セッション終了を希望するタイミングでこのサービスメソッドを呼び出してください。

SOAPアプリケーションのインタフェースの例を次に示します。

package localhost;

public interface UserInfo extends java.rmi.Remote {
    // サービスメソッド
    localhost.UserData getUserData(java.lang.String user_no) throws java.rmi.RemoteException;

    // セッション終了用サービスメソッド
    public void endSession() throws java.rmi.RemoteException;
}

サービス側の処理の実装例を次に示します。

package localhost;

public class UserInfoSoapBindingImpl implements localhost.UserInfo {
    // サービスメソッド
    public localhost.UserData getUserData(java.lang.String user_No) throws java.rmi.RemoteException {
        // サービスメソッド実装を記述
    }

    // セッション終了用サービスメソッド
    public void endSession() throws java.rmi.RemoteException {
        // セッション終了時の処理を記述

        // セッション終了要求を通知するAPIを使用する
        try {
            C4Session session = C4Session.getInstance();
            if (session != null) {
                session.invalidate();
            }
        }
        catch (java.lang.RuntimeException e) {
            // エラー処理
        }
    }
}

クライアント側の処理の実装例を次に示します。

package localhost;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.cosminexus.cws.management.*;

public class RPCSampleClient extends HttpServlet
{

    ...

    // サービスのインタフェースクラスのオブジェクトを生成
    UserInfoServiceLocator uis = new UserInfoServiceLocator();

    // スタブのインタフェースクラスのオブジェクトを生成
    UserInfo ui = uis.getUserInfo();

    // サービスメソッドを呼び出す
    UserData ud1 = ui.getUserData(strUserNo1); // セッション開始
    UserData ud2 = ui.getUserData(strUserNo2); // セッション継続

    // セッション終了用サービスメソッドを呼び出す
    ui.endSession(); // セッション終了要求

    ...
}

3.11.9　クッキーについて

Webサーバから受け取ったクッキーは，SOAPサービスのインタフェースクラスのインスタンスで保持されます。クッキーを利用する場合，SOAPサービスのメソッドを呼び出すたびに，SOAPサービスのインタフェースクラスのインスタンスを破棄することなく，継続して使用してください。

3.11.10　クッキーの有効期限について

expires属性で設定したクッキーの有効期限に達しても，SOAPクライアントライブラリは保持しているクッキーを削除しません。期限切れのクッキーを受け取っても処理できるようにサーバで対処してください。

3.11.11　WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージに関する注意

SOAPアプリケーション開発支援機能で開発したSOAPクライアントおよびSOAPサービス以外と通信する場合，WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを送信させないでください。

RPC形態のアプリケーションで，WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを受信した場合，SOAPアプリケーションは，パラメタとしてnullを受け取ります。SOAPサービスがSOAPフォルトを返信する，またはSOAPクライアントが例外を受け取ることはありません。

3.12　EJB利用時の注意事項

SOAPアプリケーションのプログラムに，EJBを利用する場合の注意事項について説明します。

3.12.1　JNDI名前空間の指定について

JNDI名前空間に指定するEnterprise Beanの名称は，次のどれかの形式で指定してください。

JNDI名前空間の直接指定

（例）HITACHI_EJB/SERVERS/MyServer/EJB/UserInfo/UserInfoBean※1

リソース名（java:comp/env形式）による指定

（例）java:comp/env/ejb/UserInfoService※2

EJBHomeオブジェクトリファレンスの別名付与（ユーザ指定名前空間機能）による指定

（例）UserInfo※3

注※1

指定例では，J2EEサーバ名称を「MyServer」，J2EEアプリケーション名を「UserInfo」，Enterprise Bean名称を「UserInfoBean」としています。

注※2

指定例では，WebアプリケーションでのEJBリファレンス名称を「ejb/UserInfoService」としています。

注※3

指定例では，EJBHomeオブジェクトリファレンスの別名付与でEJBリファレンス名称を「UserInfo」としています。

JNDI名前空間については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」を参照してください。

3.12.2　EJBからSOAPサービスを呼び出す場合の注意事項

Stateful Session BeanおよびEntity Beanを利用する場合は，トランザクション（コンテナ管理トランザクションまたはBean管理トランザクション）の指定に関係なく，SOAPサービスへの要求，受信処理はトランザクションの制御外となります。したがって，トランザクションがロールバックされる場合でも，SOAPサービスへのリクエストは必ず実行されます。

3.12.3　EJBをSOAPサービスのエンドポイントとして利用する場合の注意事項

SOAPサービスのエンドポイントとして利用できるのは，EJB 2.1までです。EJB 3.0以降は利用できません。

ホームインタフェースに引数ありのcreateメソッドは使用できません。引数ありと引数なしのcreateメソッドが存在する場合は，引数なしのcreateメソッドが呼び出されます。引数なしのcreateメソッドがホームインタフェースにない場合は，次のメッセージが返されます。

KDCCP0004-EのC4Fault（SOAP Fault）メッセージ

Stateful Session BeanおよびEntity Beanを利用する場合，トランザクション（コンテナ管理トランザクションまたはBean管理トランザクション）の指定に関係なく，クライアントへの応答処理はトランザクションの制御外となります。したがって，トランザクションがロールバックされる場合でも，クライアントへの応答は必ず実行されます。

Entity Beanを利用する場合，ファインダメソッド（findByPrimaryKeyなど）は利用できません。

SOAPアプリケーションから呼び出すEJBの内容を変更した場合，J2EEアプリケーションのRMI-IIOPインタフェースおよびRMI-IIOPスタブを再取得し，WSDLを再生成する必要があります。ただし，呼び出すEJB内のメソッドの引数の数，データ型，および戻り値に変更がない場合は，再取得する必要はありません。

SOAPアプリケーションから呼び出すEJBを実装したEJB-JARファイルと，SOAPアプリケーションのWARファイルを同じJ2EEアプリケーションに含める場合は，J2EEアプリケーションのRMI-IIOPインタフェースおよびRMI-IIOPスタブをSOAPアプリケーションのWARファイルに含めないでください。

リモートインタフェースを利用する場合はメソッドのthrows節にjava.rmi.RemoteExceptionを定義しなければなりません。ユーザ定義例外を定義する場合は，「3.6.2　Java例外からWSDLへのマッピング」を参照してください。

throws節にjava.rmi.RemoteExceptionを定義していない場合

Java2WSDLコマンドによってKDCCC0228-Wのメッセージが出力され，処理は続行されます。

throws節にjava.rmi.RemoteExceptionおよびユーザ定義例外のどちらでもない例外を定義した場合

Java2WSDLコマンドによってKDCCC0229-Wのメッセージが出力されます。この例外はwsdl:fault要素にマッピングされません。

ローカルインタフェースを利用する場合はメソッドのthrows節にjava.rmi.RemoteExceptionを定義しないでください。ユーザ定義例外を定義する場合は，「3.6.2　Java例外からWSDLへのマッピング」を参照してください。

throws節にjava.rmi.RemoteExceptionを定義した場合

Java2WSDLコマンドによってKDCCC0230-Wのメッセージが出力され，処理は続行されます。

throws節にユーザ定義例外以外の例外（java.rmi.RemoteExceptionを除く）を定義した場合

Java2WSDLコマンドによってKDCCC0229-Wのメッセージが出力されます。この例外はwsdl:fault要素にマッピングされません。

3.12.4　ラウンドロビンポリシーによるCORBAネーミングサービスの検索機能を使用する場合の注意事項

ラウンドロビンポリシーによるCORBAネーミングサービスの検索機能を使用する場合，サービスデプロイ定義を再作成してください。ラウンドロビンポリシーによるCORBAネーミングサービスの検索については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」を参照してください。

3.12.5　EJBHomeオブジェクトリファレンスの別名付与（ユーザ指定名前空間機能）を使用する場合の注意事項

ユーザ指定名前空間機能を使用する場合，CORBAネーミングサービスの監視機能が持つ，無効なキャッシュ領域を定期的にクリアする機能を利用することを推奨します。ユーザ指定名前空間機能，および無効なキャッシュ領域のクリアについては，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」を参照してください。

3.12.6　DeployScopeに関する注意事項

SOAPサービスのDeployScopeを「Session」にする場合，クライアント側の処理ではセッションを終了する際にremoveメソッドを呼び出してください。「Session」以外のDeployScopeの場合，クライアント側の処理ではremoveメソッドを呼び出さないでください。

4　RPC形態のSOAPアプリケーションの開発例

この章では，RPC形態のSOAPアプリケーションの開発例を手順に沿って説明します。開発したSOAPアプリケーションの実行方法については，「7.　SOAPアプリケーションの実行と運用」を参照してください。

4.1　新規に開発する場合

RPC形態のSOAPアプリケーションを新規に開発します。開発例の概要と開発の流れを次に示します。

開発例の概要

社員番号，名前，所属，電話番号というユーザ情報を管理し，クライアントからの入力に対して，処理結果を返すSOAPアプリケーションを新規に開発します。

開発例では，スタブを生成して，クライアント側の処理を実装します。

開発の流れ

SOAPアプリケーションの設計

Javaインタフェースの作成

WSDLの生成

スケルトンおよびサービスデプロイ定義の生成

サーバ側の処理の実装

アーカイブ（WARファイル）の作成

スタブの生成

クライアント側の処理の実装

開発の流れに沿って，各ステップの作業について説明します。

4.1.1　SOAPアプリケーションを設計する

新規に開発するSOAPアプリケーションの仕様を設計します。開発例では，次のサービス名およびメソッド名を使用します。

サービス名

UserInfo

メソッド名

getUserData

クライアントからの入力時およびクライアントへの出力時の属性について次に示します。出力時の属性は，UserDataクラスが保持します。

表4‒1　入力時の属性（RPC・スタブで新規開発する場合）

属性名

変数名

データ型

社員番号

in0

String

表4‒2　出力時の属性（RPC・スタブで新規開発する場合）

属性名

変数名

データ型

名前

name

String

所属

section

String

電話番号

telephone

String

4.1.2　Javaインタフェースを作成する

設計したSOAPアプリケーションのWSDLを作成するために，Javaインタフェース，およびユーザ定義のデータ型クラスを作成します。

Javaインタフェースを作成します。

SOAPアプリケーションで公開するメソッドをJavaインタフェースに定義します。

メソッドを定義したJavaインタフェースの例を次に示します。

//UserInfo.java

package localhost;

public interface UserInfo extends java.rmi.Remote {
    localhost.UserData getUserData(java.lang.String in0) throws java.rmi.RemoteException;
}

ユーザ定義のデータ型クラスを作成します。

Javaインタフェースで使用するユーザ定義のデータ型クラスを作成します。

ユーザ定義のデータ型クラスの例を次に示します。

//UserData.java

package localhost;

public class UserData implements java.io.Serializable {
    private java.lang.String name;
    private java.lang.String section;
    private java.lang.String telephone;

    public UserData() {
    }

    public java.lang.String getName() {
        return name;
    }

    public void setName(java.lang.String name) {
        this.name = name;
    }

    public java.lang.String getSection() {
        return section;
    }

    public void setSection(java.lang.String section) {
        this.section = section;
    }

    public java.lang.String getTelephone() {
        return telephone;
    }

    public void setTelephone(java.lang.String telephone) {
        this.telephone = telephone;
    }
}

作成したJavaインタフェースおよびユーザ定義のデータ型クラスをコンパイルします。

注意事項

ここで作成したJavaインタフェースおよびユーザ定義のデータ型クラスは，WSDLを生成するためだけのもので，WSDL生成後は使用しません。SOAPアプリケーションとして使用するのは，「4.1.3　WSDLを生成する」で作成するJavaインタフェースとデータ型クラスです。

4.1.3　WSDLを生成する

Java2WSDLコマンドを使用して，「4.1.2　Javaインタフェースを作成する」で作成したインタフェースおよびユーザ定義のデータ型クラスから，SOAPアプリケーションのWSDLを生成します。

Java2WSDLコマンドの指定例を示します。

Java2WSDL.bat -l http://localhost:8080/WebApp1/services/UserInfo localhost.UserInfo

このコマンドを実行すると，カレントディレクトリにUserInfo.wsdlという名前のWSDLが生成されます。

この例では，-lオプションでSOAPサービスのエンドポイントURLを指定していますが，必要に応じてほかのオプションも使用してください。オプションについては，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

この操作によって，生成されたWSDLの例を次に示します。背景色付きの太字部分はこの操作によって設定された情報です。

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions name="UserInfo" targetNamespace="http://localhost"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:impl="http://localhost-impl"
    xmlns:intf="http://localhost"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <types>
    <schema targetNamespace="http://localhost"
        xmlns="http://www.w3.org/2001/XMLSchema">
      <complexType name="UserData">
        <sequence>
          <element name="name" nillable="true" type="xsd:string" />
          <element name="section" nillable="true" type="xsd:string" />
          <element name="telephone" nillable="true" type="xsd:string" />
        </sequence>
      </complexType>
      <element name="UserData" nillable="true" type="intf:UserData" />
    </schema>
  </types>
  <wsdl:message name="getUserDataResponse">
     <wsdl:part name="return" type="intf:UserData" />
  </wsdl:message>
  <wsdl:message name="getUserDataRequest">
     <wsdl:part name="in0" type="xsd:string" />
  </wsdl:message>
  <wsdl:portType name="UserInfo">
    <wsdl:operation name="getUserData" parameterOrder="in0">
        <wsdl:input message="intf:getUserDataRequest" />
        <wsdl:output message="intf:getUserDataResponse" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getUserData">
       <soap:operation soapAction="" />
       <wsdl:input>
           <soap:body namespace="http://localhost" use="literal" />
       </wsdl:input>
       <wsdl:output>
           <soap:body namespace="http://localhost" use="literal" />
       </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="UserInfoService">
    <wsdl:port binding="intf:UserInfoSoapBinding" name="UserInfo">
       <soap:address location="http://localhost:8080/WebApp1/services/UserInfo" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

注意事項

use属性に"encoded"を指定した場合，SOAP符号化規則はSOAPエンコーディングとなります。

use属性に"literal"を指定した場合，SOAP符号化規則はリテラルエンコーディングとなります。

SOAP符号化規則については「1.4.1　SOAPの概要」を参照してください。

4.1.4　スケルトンおよびサービスデプロイ定義を生成する

WSDL2Javaコマンドを使用して，生成されたWSDLからサーバ側に必要なソースコードであるスケルトンを生成します。同時に，生成したソースコードをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS -s UserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                カレントディレクトリ
 localhost/
   server-config.xml              サービスデプロイ定義
   UserData.java※                 ユーザ定義のデータ型クラス
   UserInfo.java                  リモートインタフェース
   UserInfoSoapBindingImpl.java   サービス実装クラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

この例では，-sオプションでサーバ側のソースコードを生成しています。-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードのうち，処理を加えるのはUserInfoSoapBindingImpl.javaだけです。UserInfoSoapBindingImpl.java以外のクラスを変更しないでください。変更した場合，誤動作するおそれがあります。

4.1.5　サーバ側の処理を実装する

スケルトン生成と同時に生成された実装クラス（UserInfoSoapBindingImpl.java）に，サービスの実装を記述します。サービスの実装を記述したあと，スケルトンをコンパイルします。

生成された実装クラスのソースコードの例を次に示します。

package localhost;

public class UserInfoSoapBindingImpl implements localhost.UserInfo {
    public localhost.UserData getUserData(java.lang.String in0) throws java.rmi.RemoteException {
        //
        // 実装を記述
        //

        return null;
    }
}

なお，これ以外のソースコードの例については，次に示すディレクトリに格納しているサンプルプログラムを参照してください。ただし，サンプルプログラムとして提供するのは，SOAPアプリケーション開発支援機能だけです。

<Application Serverのインストールディレクトリ>/c4web/samples

注意事項

WSDL2Javaコマンドで生成されたスタブ・スケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.1.6　アーカイブ（WARファイル）を作成する

J2EEサーバにデプロイするためのアーカイブを作成します。

WARファイルを作成する前に，ディレクトリ構成を整えます。

ディレクトリ構成を次に示すように整えます。

/
  WEB-INF/
    server-config.xml
    web.xml
    classes/
      localhost/
        UserData.class
        UserInfo.class
        UserInfoSoapBindingImpl.class

注意事項

UserData.classおよびUserInfo.classは，「4.1.4　スケルトンおよびサービスデプロイ定義を生成する」で作成したものを使用してください。「4.1.2　Javaインタフェースを作成する」で作成したものは使用しないでください。

DD（web.xml）に情報を追加します。

追加する情報については，「3.9.2　DD（web.xml）の記述」を参照してください。

WARファイルを作成します。

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

4.1.7　スタブを生成する

WSDL2Javaコマンドを使用して，WSDLからクライアント側に必要なソースコードであるスタブを生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS UserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                カレントディレクトリ
 localhost/
  UserData.java※                 ユーザ定義のデータ型クラス
  UserInfo.java                  リモートインタフェース
  UserInfoService.java           サービスインタフェース
  UserInfoServiceLocator.java    サービスクラス
                                 （サービスへの接続情報を保持）
  UserInfoSoapBindingStub.java   スタブクラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードの内容は変更しないでください。変更した場合，誤動作するおそれがあります。

不正なWSDL定義を指定してエラーになった場合，途中までソースファイルが出力されていることがあります。この場合，ソースファイルをカレントディレクトリから削除し，WSDL定義を正しく修正したあとに再実行してください。

WSDL2Javaコマンドで生成されたスタブ・スケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.1.8　クライアント側の処理を実装する

SOAPサービスを利用するクライアント側の処理を実装します。クライアント側の処理では，生成されたスタブのうち，UserInfoServiceLocator.javaおよびUserInfo.javaを利用します。スタブの内容および実装方法については，「3.7.1　スタブの使用」を参照してください。

ここでは，クライアント側の処理の実装例として，社員番号を入力とし，結果を標準出力に出す場合の例を示します。

package localhost;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.cosminexus.cws.management.*;

public class RPCSampleClient extends HttpServlet
{
    private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";

    // クライアント識別子
    private ClientID cltID = null;
    public void init() throws ServletException
    {
        // SOAPクライアントの開始
        cltID = Management.initializeClient();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // クライアント識別子と実行スレッドを関連づける
        Management.connectClientIDtoCurrentThread(cltID);

       // ブラウザからパラメタの取得
         String strUserNo = request.getParameter("UserNo");

        if (strUserNo == null) {
            strUserNo = "";
        }

        UserInfo ui = null;
        UserData ud = null;
        UserInfoServiceLocator uis = new UserInfoServiceLocator();
        try
        {
            ui = uis.getUserInfo();
        }
        catch (javax.xml.rpc.ServiceException e)
        {
            // エラー処理を記述
        }

        try
        {
            ud = ui.getUserData(strUserNo);
        }
        catch (java.rmi.RemoteException e)
        {
            // エラー処理を記述
        }

        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        // ブラウザに表示する内容を設定

        // クライアント識別子と実行スレッドの関連づけを解除する
        Management.disconnectClientIDtoCurrentThread(cltID);
    }

    public void destroy()
    {
        // SOAPクライアントの終了
        Management.finalizeClient(cltID);
    }
}

4.2　既存のJavaクラスを利用して開発する場合

既存のJavaクラスを利用して，RPC形態のSOAPアプリケーションを開発します。開発例の概要と開発の流れを次に示します。

開発例の概要

社員番号，名前，所属，電話番号というユーザ情報を管理し，クライアントからの入力に対して，処理結果を返すSOAPアプリケーションを開発します。

開発例では，サービスクラスとユーザ定義のデータ型クラスは，作成済みのJavaクラスを利用します。また，スタブを生成して，クライアント側の処理を実装します。

開発の流れ

SOAPアプリケーションの設計

サービスデプロイ定義の生成

アーカイブ（WARファイル）の作成

WSDLの生成

スタブの生成

クライアント側の処理の実装

開発の流れに沿って，各ステップの作業について説明します。

4.2.1　SOAPアプリケーションを設計する

RPC形態のSOAPアプリケーションの仕様を設計します。開発例では，次に示すサービスを，既存のJavaクラスを利用して開発します。

サービス名

UserInfo

メソッド名

getUserData

クライアントからの入力時およびクライアントへの出力時の属性について次に示します。出力時の属性は，UserDataクラスが保持します。

表4‒3　入力時の属性（RPCで既存のJavaクラスを利用する場合）

属性名

変数名

データ型

社員番号

in0

String

表4‒4　出力時の属性（RPCで既存のJavaクラスを利用する場合）

属性名

変数名

データ型

名前

name

String

所属

section

String

電話番号

telephone

String

開発例で使用する，既存のJavaクラス（サービスクラスとユーザ定義のデータ型クラス）を次に示します。

サービスクラス

package localhost;

public class UserInfo {
    public UserData getUserData(String in0)
    {
        UserData ud = new UserData();

        //
        // 業務ロジックの呼び出しや，EJBの呼び出しなどの実装を記述
        //

        return ud;
    }
}

ユーザ定義のデータ型クラス

package localhost;

public class UserData {
  private String name;
  private String section;
  private String telephone;

  public UserData(){}

  public void setName(String name)
  {
    this.name = name;
  }

  public String getName()
  {
    return this.name;
  }

  public void setSection(String section)
  {
    this.section = section;
  }

  public String getSection()
  {
    return this.section;
  }

  public void setTelephone(String telephone)
  {
    this.telephone = telephone;
  }

  public String getTelephone()
  {
    return this.telephone;
  }
}

4.2.2　サービスデプロイ定義を生成する

Java2WSDDコマンドを使用して，既存のJavaクラスをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

Java2WSDDコマンドの指定例を示します。

Java2WSDD.bat localhost.UserInfo

このコマンドを実行すると，カレントディレクトリにサービスデプロイ定義（server-config.xml）が生成されます。

この例では，オプションを指定していませんが，必要に応じてオプションを指定してください。オプションについては，「9.3　Java2WSDDコマンド（サービスデプロイ定義の生成）」を参照してください。

4.2.3　アーカイブ（WARファイル）を作成する

J2EEサーバにデプロイするためのアーカイブを作成します。

操作手順

WARファイルを作成する前に，ディレクトリ構成を整えます。

ディレクトリ構成を次に示すように整えます。

/
  WEB-INF/
    server-config.xml
    web.xml
    classes/
      localhost/
        UserData.class
        UserInfo.class

DD（web.xml）に情報を追加します。

追加する情報については，「3.9.2　DD（web.xml）の記述」を参照してください。

WARファイルを作成します。

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

4.2.4　WSDLを生成する

Java2WSDLコマンドを使用して，既存のJavaクラスをSOAPサービスとして公開するためのWSDLを生成します。WSDLは，クライアント側の実装に必要なファイルを生成するために必要です。

Java2WSDLコマンドの指定例を示します。

Java2WSDL.bat -l http://localhost:8080/WebApp1/services/UserInfo localhost.UserInfo

このコマンドを実行すると，カレントディレクトリにUserInfo.wsdlという名前のWSDLが生成されます。

この例では，-lオプションでSOAPサービスのエンドポイントURLを指定していますが，必要に応じてほかのオプションも指定してください。オプションについては，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

4.2.5　スタブを生成する

WSDL2Javaコマンドを使用して，生成したWSDLからクライアント側に必要なソースコードであるスタブを生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS UserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                カレントディレクトリ
 localhost/
  UserData.java※                 ユーザ定義のデータ型クラス
  UserInfo.java                  リモートインタフェース
  UserInfoService.java           サービスインタフェース
  UserInfoServiceLocator.java    サービスクラス
                                 （サービスへの接続情報を保持）
  UserInfoSoapBindingStub.java   スタブクラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードの内容は変更しないでください。変更した場合，誤動作するおそれがあります。

不正なWSDL定義を指定してエラーになった場合，途中までソースファイルが出力されていることがあります。この場合，ソースファイルをカレントディレクトリから削除し，WSDL定義を正しく修正したあとに再実行してください。

WSDL2Javaコマンドで生成されたスタブおよびスケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.2.6　クライアント側の処理を実装する

SOAPサービスを利用するクライアント側の処理を実装します。クライアント側の処理では，生成されたスタブのうち，UserInfoServiceLocator.javaおよびUserInfo.javaを利用します。スタブの内容および実装方法については，「3.7.1　スタブの使用」を参照してください。

クライアント側の処理の実装例については，「4.1.8　クライアント側の処理を実装する」を参照してください。

4.3　既存のEJBを利用して開発する場合

EJBを利用して，RPC形態のSOAPアプリケーションを開発します。開発例の概要と開発の流れを次に示します。

開発例の概要

社員番号，名前，所属，電話番号というユーザ情報を管理し，クライアントからの入力に対して，処理結果を返すSOAPアプリケーションを開発します。

開発例では，SOAPアプリケーションのサービスにEJB（Stateless Session Bean）を利用します。また，スタブを生成して，クライアント側の処理を実装します。

開発の流れ

SOAPアプリケーションの設計

EJB呼び出し環境の設定

サービスデプロイ定義の生成

アーカイブ（WARファイル）の作成

WSDLの生成

スタブの生成

クライアント側の処理の実装

開発の流れに沿って，各ステップの作業について説明します。

4.3.1　SOAPアプリケーションを設計する

EJBを利用したSOAPアプリケーションの仕様を設計します。開発例では，次に示すサービスの仕様を持つStateless Session Beanを，SOAPアプリケーションとして利用する場合について示します。なお，localhost.UserDataという名前のデータ型クラスは，Stateless Session Bean側で定義されているものとします。

サービス名

UserInfo

メソッド名

getUserData

クライアントからの入力時およびクライアントへの出力時の属性について次に示します。出力時の属性は，UserDataクラスが保持します。

表4‒5　入力時の属性（既存のEJBを利用する場合）

属性名

変数名

データ型

社員番号

user_no

String

表4‒6　出力時の属性（既存のEJBを利用する場合）

属性名

変数名

データ型

名前

name

String

所属

section

String

電話番号

telephone

String

ホームインタフェース

userinfo.SLBUserInfoHome

リモートインタフェース

userinfo.SLBUserInfo

Enterprise Bean

userinfo.SLBUserInfoBean

データ型クラス

localhost.UserData

JNDI名前空間

HITACHI_EJB/SERVERS/MyServer/EJB/UserInfoBean/SLBUserInfo

4.3.2　EJB呼び出し環境を設定する

J2EEアプリケーションのRMI-IIOPインタフェースおよびRMI-IIOPスタブを取得します。RMI-IIOPインタフェースおよびRMI-IIOPスタブの取得方法については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(EJBコンテナ)」を参照してください。

4.3.3　サービスデプロイ定義を生成する

Java2WSDDコマンドを使用して，読み込んだRMI-IIOPインタフェースをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

Java2WSDDコマンドの指定例を示します。

Java2WSDD.bat -p EJB -B userinfo.SLBUserInfoBean -H userinfo.SLBUserInfoHome  -J HITACHI_EJB/SERVERS/MyServer/EJB/UserInfoBean/SLBUserInfo userinfo.SLBUserInfo

このコマンドを実行すると，カレントディレクトリにサービスデプロイ定義（server-config.xml）が生成されます。

この例で指定しているオプションの意味を示します。

-pオプションでプロバイダ種別を指定します。EJBを指定することで，EJBのサービスデプロイ定義が生成されます。

-BオプションでBeanクラスを指定します。

-Hオプションでホームインタフェースを指定します。

-JオプションでJNDI名前空間を指定します。

必要に応じてほかのオプションも指定してください。オプションについては，「9.3　Java2WSDDコマンド（サービスデプロイ定義の生成）」を参照してください。

注意事項

EJBをSOAPサービスのエンドポイントとして利用する場合で，Stateful Session BeanおよびEntity Beanを利用する場合は，DeployScopeを「Session」にして，クライアント定義ファイルの「app_maintainsession」オプションをtrueにしてください。なお，次の場合は，SOAPサービスへのリクエストごとにEJBオブジェクトが生成されるためメモリ不足またはリソース不足が発生するおそれがあります。

DeployScopeを「Request」にしたとき

DeployScopeを「Session」にして，かつクライアント定義ファイルの「app_maintainsession」オプションがfalseのとき

このセッションは，マニュアル「アプリケーションサーバ 機能解説 拡張編」で記述している「J2EEサーバ間のセッション情報の引き継ぎ」には対応していません。

4.3.4　アーカイブ（WARファイル）を作成する

J2EEサーバにデプロイするためのアーカイブを作成します。

WARファイルを作成する前に，ディレクトリ構成を整えます。

ディレクトリ構成を次に示すように整えます。

/
  WEB-INF/
    server-config.xml
    web.xml
    classes/
    lib/
      *.jar※1
      stubs.jar※2

注※1

「4.3.2　EJB呼び出し環境を設定する」で取得したRMI-IIOPインタフェースです。

注※2

「4.3.2　EJB呼び出し環境を設定する」で取得したRMI-IIOPスタブです。

DD（web.xml）に情報を追加します。

追加する情報については，「3.9.2　DD（web.xml）の記述」を参照してください。

WARファイルを作成します。

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

4.3.5　WSDLを生成する

Java2WSDLコマンドを使用して，既存のEJBサービスをSOAPサービスとして公開するためのWSDLを生成します。WSDLは，クライアント側の実装に必要なファイルを生成するために必要です。

Java2WSDLコマンドの指定例を次に示します。

Java2WSDL.bat -l http://localhost:8080/WebApp1/services/SLBUserInfo userinfo.SLBUserInfo

このコマンドを実行すると，カレントディレクトリにSLBUserInfo.wsdlという名前のWSDLが生成されます。

この例では，-lオプションでSOAPサービスのエンドポイントURLを指定していますが，必要に応じてほかのオプションも指定してください。オプションについては，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

4.3.6　スタブを生成する

WSDL2Javaコマンドを使用して，WSDLからクライアント側に必要なソースコードであるスタブを生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS SLBUserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                   カレントディレクトリ
 userinfo/
  UserData.java※                    ユーザ定義のデータ型クラス
  SLBUserInfo.java                  リモートインタフェース
  SLBUserInfoService.java           サービスインタフェース
  SLBUserInfoServiceLocator.java    サービスクラス
                                   （サービスへの接続情報を保持）
  SLBUserInfoSoapBindingStub.java   スタブクラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードの内容は変更しないでください。変更した場合，誤動作するおそれがあります。

不正なWSDL定義を指定してエラーになった場合，途中までソースファイルが出力されていることがあります。この場合，ソースファイルをカレントディレクトリから削除し，WSDL定義を正しく修正したあとに再実行してください。

WSDL2Javaコマンドで生成されたスタブ・スケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.3.7　クライアント側の処理を実装する

実装用の新規クラスを作成し，クライアント側の処理を実装します。次に，クライアント側の処理の実装例を示します。

package userinfo;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.cosminexus.cws.management.*;

public class RPCSampleClient extends HttpServlet
{
    private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";
    private ClientID cltID = null;
    public void init() throws ServletException
    {
        cltID = Management.initializeClient();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // クライアントIDとスレッドの関連づけを行なう
        Management.connectClientIDtoCurrentThread(cltID);

        // ブラウザからパラメタの取得
        String strUserNo = request.getParameter("UserNo");

        if (strUserNo == null) {
            strUserNo = "";
        }

        SLBUserInfo ui = null;
        UserData ud = null;

        SLBUserInfoServiceLocator uis = new SLBUserInfoServiceLocator();

        try
        {
            ui = uis.getUserInfo();
        }
        catch (javax.xml.rpc.ServiceException e)
        {
            // エラー処理を記述
        }

        try
        {
            ud = ui.getUserData(strUserNo);
        }
        catch (java.rmi.RemoteException e)
        {
            // エラー処理を記述
        }

        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        // ブラウザに表示する内容を設定

        try
        {
            //EJBオブジェクトの削除※
            ui.remove();
        }
        catch (java.rmi.RemoteException e)
        {
            // エラー処理を記述
        }
        // クライアントとスレッドの関連づけを解除する
        Management.disconnectClientIDtoCurrentThread(cltID);
    }

    public void destroy()
    {
        Management.finalizeClient(cltID);
    }
}

注※

ui.remove（EJBオブジェクトの削除）の呼び出し処理は，DeployScopeが「Session」のSOAPサービスを呼び出すクライアントの，セッションを終了したい個所に実装してください。

4.4　添付ファイルを使用して開発する場合

RPC形態の添付ファイルを使用したSOAPアプリケーションを開発します。なお，添付ファイル付きSOAPメッセージを受信すると，メモリ使用量を抑制するために退避ファイルが作成されることがあります。退避ファイルの詳細については，「付録B　添付ファイル使用時に作成される退避ファイル」を参照してください。

開発例の概要と開発の流れを次に示します。

開発例の概要

社員番号，名前，所属というユーザ情報を管理し，クライアントからの入力に対して，処理結果を返すSOAPアプリケーションを新規に開発します。

開発例では，RPC形態の添付ファイルを使用します。また，スタブを生成して，クライアント側の処理を実装します。

開発の流れ

SOAPアプリケーションの設計

Javaインタフェースの作成

WSDLの生成

スケルトンおよびサービスデプロイ定義の生成

サーバ側の処理の実装

アーカイブ（WARファイル）の作成

スタブの生成

クライアント側の処理の実装

開発の流れに沿って，各ステップの作業について説明します。

4.4.1　SOAPアプリケーションを設計する

RPC形態の添付ファイルを使用したSOAPアプリケーションの仕様を設計します。開発例では，次のサービス名およびメソッド名を使用します。

サービス名

UserInfo

メソッド名

getUserData

クライアントからの入力時およびクライアントへの出力時の属性について次に示します。出力時の属性は，UserDataクラスが保持します。

表4‒7　入力時の属性（RPC形態の添付ファイルを使用した場合）

属性名

変数名

データ型

社員番号

in0

java.lang.String

顔写真

in1

javax.activation.DataHandler

表4‒8　出力時の属性（RPC形態の添付ファイルを使用した場合）

属性名

変数名

データ型

登録確認メッセージ

message

java.lang.String

名前

name

java.lang.String

所属

section

java.lang.String

4.4.2　Javaインタフェースを作成する

設計したSOAPアプリケーションのWSDLを作成するために，Javaインタフェース，およびユーザ定義のデータ型クラスを作成します。

Javaインタフェースを作成します。

SOAPアプリケーションで公開するメソッドをJavaインタフェースに定義します。

メソッドを定義したJavaインタフェースの例を次に示します。

//UserInfo.java

package localhost;

public interface UserInfo extends java.rmi.Remote{
    public localhost.UserData getUserData(java.lang.String in0,
        javax.activation.DataHandler in1)throws java.rmi.RemoteException;
}

ユーザ定義のデータ型クラスを作成します。

Javaインタフェースで使用するユーザ定義のデータ型クラスを作成します。

ユーザ定義のデータ型クラスの例を次に示します。

//UserData.java

package localhost;

public class UserData{

    private java.lang.String message;
    private java.lang.String name;
    private java.lang.String section;

    public UserData(){
    }

    public java.lang.String getMessage() throws java.rmi.RemoteException{
        return this.message;
    }

    public void setMessage(java.lang.String message) throws java.rmi.RemoteException{
        this.message = message;
    }

    public java.lang.String getName() throws java.rmi.RemoteException{
        return this.name;
    }

    public void setName(java.lang.String name) throws java.rmi.RemoteException{
        this.name = name;
    }

    public java.lang.String getSection() throws java.rmi.RemoteException{
        return this.section;
    }

    public void setSection(java.lang.String section) throws java.rmi.RemoteException{
        this.section = section;
    }
}

作成したJavaインタフェースおよびユーザ定義のデータ型クラスをコンパイルします。

注意事項

ここで作成したJavaインタフェースおよびユーザ定義のデータ型クラスは，WSDLを生成するためだけのもので，WSDL生成後は使用しません。SOAPアプリケーションとして使用するのは，「4.1.3　WSDLを生成する」で作成するJavaインタフェースとデータ型クラスです。

4.4.3　WSDLを生成する

Java2WSDLコマンドを使用して，「4.4.2　Javaインタフェースを作成する」で作成したインタフェースおよびユーザ定義のデータ型クラスから，SOAPアプリケーションのWSDLを生成します。

RPC形態の添付ファイルは，document/literalに対応したSOAPアプリケーションだけで使用できます。そのため，Java2WSDLコマンドの実行時には，-zオプションに「DOCUMENT」，-uオプションに「LITERAL」を指定してください。

Java2WSDLコマンドの指定例を示します。

Java2WSDL.bat -l http://localhost:8080/WebApp1/services/UserInfo -z DOCUMENT -u LITERAL localhost.UserInfo

このコマンドを実行すると，カレントディレクトリにUserInfo.wsdlという名前のWSDLが生成されます。

この例では，-lオプションでSOAPサービスのエンドポイントURLを指定していますが，必要に応じてほかのオプションも使用してください。オプションについては，「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

この操作によって，生成されたWSDLの例を次に示します。背景色付きの太字部分はこの操作によって設定された情報です。

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://localhost"
    xmlns:apachesoap="http://xml.apache.org/xml-soap"
    xmlns:impl="http://localhost-impl"
    xmlns:intf="http://localhost"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <schema elementFormDefault="qualified" targetNamespace="http://localhost"
xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="http://ws-i.org/profiles/basic/1.1/xsd"/>
      <element name="getUserData">
        <complexType>
          <sequence>
            <element name="in0" type="xsd:string"/>
            <element name="in1" type="wsi:swaRef"/>
          </sequence>
        </complexType>
      </element>
      <element name="getUserDataResponse">
        <complexType>
          <sequence>
            <element name="getUserDataReturn" type="intf:UserData"/>
          </sequence>
        </complexType>
      </element>
      <complexType name="UserData">
        <sequence>
          <element name="message" nillable="true" type="xsd:string"/>
          <element name="name" nillable="true" type="xsd:string"/>
          <element name="section" nillable="true" type="xsd:string"/>
        </sequence>
      </complexType>
    </schema>
  </wsdl:types>
  <wsdl:message name="getUserDataRequest">
    <wsdl:part element="intf:getUserData" name="parameters"/>
  </wsdl:message>
  <wsdl:message name="getUserDataResponse">
    <wsdl:part element="intf:getUserDataResponse" name="parameters"/>
  </wsdl:message>
  <wsdl:portType name="UserInfo">
    <wsdl:operation name="getUserData">
      <wsdl:input message="intf:getUserDataRequest" name="getUserDataRequest"/>
      <wsdl:output message="intf:getUserDataResponse" name="getUserDataResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getUserData">
      <soap:operation soapAction=""/>
      <wsdl:input name="getUserDataRequest">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getUserDataResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="UserInfoService">
    <wsdl:port binding="intf:UserInfoSoapBinding" name="UserInfo">
      <soap:address location="http://localhost:8080/WebApp1/services/UserInfo"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

注意事項

use属性に"literal"を指定した場合，SOAP符号化規則はリテラルエンコーディングとなります。

SOAP符号化規則については「1.4.1　SOAPの概要」を参照してください。

4.4.4　スケルトンおよびサービスデプロイ定義を生成する

WSDL2Javaコマンドを使用して，生成されたWSDLからサーバ側に必要なソースコードであるスケルトンを生成します。同時に，生成したソースコードをSOAPアプリケーションとして利用するためのサービスデプロイ定義を生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS -s UserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                カレントディレクトリ
 localhost/
   server-config.xml              サービスデプロイ定義
   UserData.java※                 ユーザ定義のデータ型クラス
   UserInfo.java                  リモートインタフェース
   UserInfoSoapBindingImpl.java   サービス実装クラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

この例では，-sオプションでサーバ側のソースコードを生成しています。-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードのうち，処理を加えるのはUserInfoSoapBindingImpl.javaだけです。UserInfoSoapBindingImpl.java以外のクラスを変更しないでください。変更した場合，誤動作するおそれがあります。

4.4.5　サーバ側の処理を実装する

スケルトン生成と同時に生成された実装クラス（UserInfoSoapBindingImpl.java）に，サービスの実装を記述します。サービスの実装を記述したあと，スケルトンをコンパイルします。

生成された実装クラスのソースコードの例を次に示します。

package localhost;

public class UserInfoSoapBindingImpl implements localhost.UserInfo {
    public localhost.UserData getUserData( java.lang.String id , javax.activation.DataHandler photo) throws java.rmi.RemoteException {
        //
        // 実装を記述
        //

        return null;
    }
}

なお，これ以外のソースコードの例については，次に示すディレクトリに格納しているサンプルプログラムを参照してください。ただし，サンプルプログラムとして提供するのは，SOAPアプリケーション開発支援機能だけです。

<Application Serverのインストールディレクトリ>/c4web/samples

注意事項

WSDL2Javaコマンドで生成されたスタブ・スケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.4.6　アーカイブ（WARファイル）を作成する

J2EEサーバにデプロイするためのアーカイブを作成します。

WARファイルを作成する前に，ディレクトリ構成を整えます。

ディレクトリ構成を次に示すように整えます。

/
  WEB-INF/
    server-config.xml
    web.xml
    classes/
      localhost/
        UserData.class
        UserInfo.class
        UserInfoSoapBindingImpl.class

注意事項

UserData.classおよびUserInfo.classは，「4.4.4　スケルトンおよびサービスデプロイ定義を生成する」で作成したものを使用してください。「4.4.2　Javaインタフェースを作成する」で作成したものは使用しないでください。

DD（web.xml）に情報を追加します。

追加する情報については，「3.9.2　DD（web.xml）の記述」を参照してください。

WARファイルを作成します。

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

4.4.7　スタブを生成する

WSDL2Javaコマンドを使用して，WSDLからクライアント側に必要なソースコードであるスタブを生成します。

WSDL2Javaコマンドの指定例を示します。

WSDL2Java.bat -C validS UserInfo.wsdl

このコマンドを実行すると，カレントディレクトリに次に示すディレクトリおよびファイルが生成されます。

/                                カレントディレクトリ
 localhost/
  UserData.java※                 ユーザ定義のデータ型クラス
  UserInfo.java                  リモートインタフェース
  UserInfoService.java           サービスインタフェース
  UserInfoServiceLocator.java    サービスクラス
                                 （サービスへの接続情報を保持）
  UserInfoSoapBindingStub.java   スタブクラス

注※

このクラスは，JavaBean形式のクラスとして生成されます。

-CオプションはWSDL検証機能を有効にするため，必ず指定してください。また，必要に応じてほかのオプションも指定してください。オプションについては，「9.2　WSDL2Javaコマンド（ソースコードの生成）」を参照してください。

注意事項

生成されたソースコードの内容は変更しないでください。変更した場合，誤動作するおそれがあります。

不正なWSDL定義を指定してエラーになった場合，途中までソースファイルが出力されていることがあります。この場合，ソースファイルをカレントディレクトリから削除し，WSDL定義を正しく修正したあとに再実行してください。

WSDL2Javaコマンドで生成されたスタブ・スケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

4.4.8　クライアント側の処理を実装する

SOAPサービスを利用するクライアント側の処理を実装します。

ここでは，クライアント側の処理の実装例として，社員番号と顔写真を入力とし，結果を標準出力に出す場合の例を示します。

package localhost;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.cosminexus.cws.management.*;

public class  RPCAttachmentsSampleClient extends HttpServlet
{
    private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";

    // クライアント識別子
    private ClientID cltID = null;
    public void init() throws ServletException
    {
        cltID = Management.initializeClient();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Management.connectClientIDtoCurrentThread(cltID);

       // ブラウザからパラメタの取得

        // 社員番号の取得
        String strUserNo = request.getParameter("UserNo");
        if (strUserNo == null) {
            strUserNo = "";
        }

        String strContextPath =
           (String)getServletConfig().getServletContext().getRealPath("/");
        String filepath = strContextPath + "attachment.txt";
        File imagefile = new File(filepath);
        FileDataSource fdSource = new FileDataSource(imagefile);
        DataHandler dhandler = new DataHandler(fdSource);

        UserInfo ui = null;
        UserData ud = null;
        UserInfoServiceLocator uis = new UserInfoServiceLocator();
        try
        {
            ui = uis.getUserInfo();
        }
        catch (javax.xml.rpc.ServiceException e)
        {
            // エラー処理を記述
        }

        try
        {
        ud = ui.getUserData(strUserNo, dhandler);
        }
        catch (java.rmi.RemoteException e)
        {
            // エラー処理を記述
        }

        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        // ブラウザに表示する内容を設定

        Management.disconnectClientIDtoCurrentThread(cltID);
    }

    public void destroy()
    {
        Management.finalizeClient(cltID);
    }
}

4.5　DIIを使用して開発する場合

次に示す場合のWSDLの例およびクライアント側の処理の実装例を示します。

WSDLをインポートしない場合

WSDLをインポートする場合

INOUTパラメタを使用する場合

ユーザ定義のデータ型クラスを使用する場合

配列を使用する場合

4.5.1　WSDLをインポートしない場合

WSDLをインポートしない場合のWSDLの例およびDIIのコーディング例を示します。なお，WSDLの例では次の情報が定義されています。

WSDLのサービス名

名前空間URI…http://example.com

ローカル名…StockQuoteService

WSDLのポート名

名前空間URI…http://example.com

ローカル名…StockQuote

WSDLのオペレーション名

名前空間URI…http://example.com

ローカル名…getLastTradePrice

オペレーションのパラメタ名…in0

(1)　WSDLの例（StockQuote.wsdl）

<wsdl:definitions
targetNamespace="http://example.com"
xmlns:intf="http://example.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<wsdl:message name="getLastTradePriceResponse">
  <wsdl:part name="getLastTradePriceReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="getLastTradePriceRequest">
<wsdl:part name="in0" type="xsd:string"/>
  </wsdl:message>

<wsdl:portType name="StockQuote">
<wsdl:operation name="getLastTradePrice" parameterOrder="in0">
<wsdl:input message="intf:getLastTradePriceRequest" name="getLastTradePriceRequest"/>
<wsdl:output message="intf:getLastTradePriceResponse" name="getLastTradePriceResponse"/>
</wsdl:operation>
 </wsdl:portType>

<wsdl:binding name="StockQuoteSoapBinding" type="intf:StockQuote">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getLastTradePrice">
<soap:operation soapAction=""/>
<wsdl:input name="getLastTradePriceRequest">
<soap:body namespace="http://example.com" use="literal"/>
</wsdl:input>
<wsdl:output name="getLastTradePriceResponse">
<soap:body namespace="http://example.com" use="literal"/>
</wsdl:output>
</wsdl:operation>
 </wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port binding="intf:StockQuoteSoapBinding" name="StockQuote">
<soap:address location="http://localhost:8080/StockQuote/services/StockQuote"/>
  </wsdl:port>
</wsdl:service>
</wsdl:definitions>

(2)　DIIのコーディング例

//SOAPクライアントの開始
ClientID cltID = Management.initializeClient();

// クライアント識別子と実行スレッドを関連づける
Management.connectClientIDtoCurrentThread(cltID);

try {
// Serviceオブジェクトの生成
QName serviceName = new QName(
        "http://example.com",
        "StockQuoteService");
URL wsdlDocumentLocation = null;
try {
        wsdlDocumentLocation = new URL("file:///C:/foo/StockQuote.wsdl");
} catch(MalFormedURLException e) {
// 異常時の処理
}

ServiceFactory factory = null;
Service service = null;
try {
factory = ServiceFactory.newInstance();
        service = factory.createService(wsdlDocumentLocation, serviceName)
} catch(ServiceException e) {
// 異常時の処理
}

// Callオブジェクトの生成
QName portName = new QName(
        "http://example.com",
        "StockQuote");
QName operationName = new QName {
        "http://example.com",
        "getLastTradePrice");

javax.xml.rpc.Call call = null;
try {
call = service.createCall(portName, operationName);
} catch(ServiceException e) {
        // 異常時の処理
}

// サービス呼び出し
// 入力パラメタを生成
Class inputClass = ((com.cosminexus.cws.xml.rpc.Call) call ).getParameterClassByName("in0");
Object in0 = null;
in(inputClass == String.class) {
        in0 = "foo";
}
Object inParams = new Object[] {in0};

Object ret = null;
try {
        Object ret = call.invoke(inParams);
} catch(RemoteException e) {
// 異常時の処理
Throwable cause = e.getCause();
if(cause != null) {
// 原因例外が存在する場合の処理
             System.out.println(cause.getMessage());
}
}

//戻り値の処理
Class retClass = ret.getClass();
int price = 0;
if(retClass == Integer.class) {
        price = ((Integer)ret).intValue();
}
System.out.println("price : " + price);

} finally {
   // クライアント識別子と実行スレッドの関連づけを解除する
   Management.disconnectClientIDtoCurrentThread(cltID);

   // SOAPクライアントの終了
   Management.finalizeClient(cltID);
}

例では，javax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスという二つのCallクラスが使われています。Javaでは，別パッケージに存在する，同じ名前のクラスをimport宣言に書けないため，同じクラス内でjavax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスを使用する場合には，例のように完全修飾名で指定する必要があります。

4.5.2　WSDLをインポートする場合

WSDLのインタフェース定義（portType要素）をインポートする場合のWSDLの例およびDIIのコーディング例を示します。なお，WSDLの例では次の情報が定義されています。

WSDLのサービス名

名前空間URI…http://example.com

ローカル名…StockQuoteService

WSDLのポート名

名前空間URI…http://example.com

ローカル名…StockQuote

WSDLのオペレーション名

名前空間URI…http://portType.example.com

ローカル名…getLastTradePrice

オペレーションのパラメタ名…in0

(1)　WSDLの例（StockQuote.wsdl）

<wsdl:definitions
targetNamespace="http://example.com"
xmlns:intf="http://example.com"
xmlns:portType="http://portType.example.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:import
      namespace="http://portType.example.com"
      location="StockQuotePortType.wsdl"/>

<wsdl:binding name="StockQuoteSoapBinding" type="portType:StockQuote">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getLastTradePrice">
<soap:operation soapAction=""/>
<wsdl:input name="getLastTradePriceRequest">
<soap:body namespace="http://example.com" use="literal"/>
</wsdl:input>
<wsdl:output name="getLastTradePriceResponse">
<soap:body namespace="http://example.com" use="literal"/>
</wsdl:output>
</wsdl:operation>
 </wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port binding="intf:StockQuoteSoapBinding" name="StockQuote">
<soap:address location="http://localhost:8080/StockQuote/services/StockQuote"/>
  </wsdl:port>
</wsdl:service>
</wsdl:definitions>

wsdl:import要素のlocation属性には，インポートするWSDLへの相対パスを記述してください。

(2)　インポートされるWSDLの例（StockQuotePortType.wsdl）

<wsdl:definitions
targetNamespace="http://portType.example.com"
xmlns:intf="http://portType.example.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<wsdl:message name="getLastTradePriceResponse">
  <wsdl:part name="getLastTradePriceReturn" type="xsd:int"/>
</wsdl:message>
<wsdl:message name="getLastTradePriceRequest">
<wsdl:part name="in0" type="xsd:string"/>
  </wsdl:message>
<wsdl:portType name="StockQuote">
<wsdl:operation name="getLastTradePrice" parameterOrder="in0">
<wsdl:input message="intf:getLastTradePriceRequest" name="getLastTradePriceRequest"/>
<wsdl:output message="intf:getLastTradePriceResponse" name="getLastTradePriceResponse"/>
</wsdl:operation>
 </wsdl:portType>
</wsdl:definitions>

(3)　DIIのコーディング例

//SOAPクライアントの開始
ClientID cltID = Management.initializeClient();

// クライアント識別子と実行スレッドを関連づける
Management.connectClientIDtoCurrentThread(cltID);

try {
// Serviceオブジェクトの生成
QName serviceName = new QName(
        "http://example.com",
        "StockQuoteService");
URL wsdlDocumentLocation = null;
try {
        wsdlDocumentLocation = new URL("file:///C:/foo/StockQuote.wsdl");
} catch(MalFormedURLException e) {
// 異常時の処理
}

ServiceFactory factory = null;
Service service = null;
try {
factory = ServiceFactory.newInstance();
        service = factory.createService(wsdlDocumentLocation, serviceName)
} catch(ServiceException e) {
// 異常時の処理
}

// Callオブジェクトの生成
QName portName = new QName(
        "http://example.com",
        "StockQuote");
QName operationName = new QName {
        "http://portType.example.com",
        "getLastTradePrice");

javax.xml.rpc.Call call = null;
try {
call = service.createCall(portName, operationName);
} catch(ServiceException e) {
        // 異常時の処理
}

// サービス呼び出し
// 入力パラメタを生成
Class inputClass = ((com.cosminexus.cws.xml.rpc.Call) call ).getParameterClassByName("in0");
Object in0 = null;
in(inputClass == String.class) {
        in0 = "foo";
}
Object inParams = new Object[] {in0};

Object ret = null;
try {
        Object ret = call.invoke(inParams);
} catch(RemoteException e) {
// 異常時の処理
Throwable cause = e.getCause();
if(cause != null) {
// 原因例外が存在する場合の処理
             System.out.println(cause.getMessage());
}
}

//戻り値の処理
Class retClass = ret.getClass();
int price = 0;
if(retClass == Integer.class) {
        price = ((Integer)ret).intValue();
}
System.out.println("price : " + price);

} finally {
   // クライアント識別子と実行スレッドの関連づけを解除する
   Management.disconnectClientIDtoCurrentThread(cltID);

   // SOAPクライアントの終了
   Management.finalizeClient(cltID);
}

例では，javax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスという二つのCallクラスが使われています。Javaでは，別パッケージに存在する，同じ名前のクラスをimport宣言に書けないため，同じクラス内でjavax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスを使用する場合には，例のように完全修飾名で指定する必要があります。

4.5.3　INOUTパラメタを使用する場合

INOUTパラメタを使用する場合のWSDLの例およびDIIのコーディング例を示します。なお，WSDLの例では次の情報が定義されています。

WSDLのサービス名

名前空間URI…http://example.com

ローカル名…StockQuoteService

WSDLのポート名

名前空間URI…http://example.com

ローカル名…StockQuote

WSDLのオペレーション名

名前空間URI…http://example.com

ローカル名…getLastTradePrice

オペレーションのパラメタ名…in0

(1)　WSDLの例（StockQuote.wsdl）

<wsdl:definitions
targetNamespace="http://example.com"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://example.com-impl"
xmlns:intf="http://example.com"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:message name="getLastTradePriceResponse">
  <wsdl:part name="getLastTradePriceReturn" type="xsd:int"/>
  <wsdl:part name="in0" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="getLastTradePriceRequest">
  <wsdl:part name="in0" type="xsd:string"/>
 </wsdl:message>
 <wsdl:portType name="StockQuote">
  <wsdl:operation name="getLastTradePrice" parameterOrder="in0">
   <wsdl:input message="intf:getLastTradePriceRequest" name="getLastTradePriceRequest"/>
   <wsdl:output message="intf:getLastTradePriceResponse" name="getLastTradePriceResponse"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="StockQuoteSoapBinding" type="intf:StockQuote">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="getLastTradePrice">
   <soap:operation soapAction=""/>
   <wsdl:input name="getLastTradePriceRequest">
    <soap:body namespace="http://example.com" use="literal"/>
   </wsdl:input>
   <wsdl:output name="getLastTradePriceResponse">
    <soap:body namespace="http://example.com" use="literal"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="StockQuoteService">
  <wsdl:port binding="intf:StockQuoteSoapBinding" name="StockQuote">
   <soap:address location="http://localhost:8081/StockQuote/services/StockQuote"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>

(2)　DIIのコーディング例

ClientID cltID = null;

try {
// SOAPクライアントの開始
cltID = Management.initializeClient();
// クライアント識別子と実行スレッドを関連づける
Management.connectClientIDtoCurrentThread(cltID);

// Serviceオブジェクトの生成
QName serviceName = new QName(
        "http://example.com",
        "StockQuoteService");
URL wsdlDocumentLocation = null;
try {
        wsdlDocumentLocation = new URL("file:///F:/soap/V71/test/dii/module/fsSample/out/StockQuote.wsdl");
} catch (MalformedURLException e) {
System.out.println(e.getMessage());
}

ServiceFactory factory = null;
Service service = null;
try {
factory = ServiceFactory.newInstance();
          service = factory.createService(wsdlDocumentLocation,
serviceName);
} catch (ServiceException e) {
System.out.println(e.getMessage());
}

// Callオブジェクトの生成
QName portName = new QName(
        "http://example.com",
        "StockQuote");
QName operationName = new QName(
        "http://example.com",
        "getLastTradePrice");
javax.xml.rpc.Call call = null;
try {
call = service.createCall(portName, operationName);
} catch (ServiceException e) {
System.out.println(e.getMessage());
}

// サービスメソッドの呼出し
// 入力パラメタを生成
Class inputClass = ((com.cosminexus.cws.xml.rpc.Call) call ).getParameterClassByName("in0");
Object in0 = null;
if(inputClass == String.class) {
        in0 = "foo";
}
Object[] inParams = new Object[] {in0};

Object ret = null;
try {
        Object ret = call.invoke(inParams);
} catch(RemoteException e) {
// 異常時の処理
Throwable cause = e.getCause();
if(cause != null) {
// 原因例外が存在する場合の処理
             System.out.println(cause.getMessage());
}
}

// 出力パラメタの処理
Map out = call.getOutputParams();
Iterator itr = out.entrySet().iterator();
while(itr.hasNext()) {
Map.Entry entry = (Map.Entry) itr.next();
String key = (String) entry.getKey();
if(key.equals("in0")) {
    System.out.println(entry.getValue());
}
}

// 戻り値の処理
Class retClass = ret.getClass();
int price = 0;
if(retClass == Integer.class) {
price = ((Integer)ret).intValue();
}
System.out.println("price: " + price);

} finally {
// クライアント識別子と実行スレッドの関連づけを解除する
Management.disconnectClientIDtoCurrentThread(cltID);

// SOAPクライアントの終了
Management.finalizeClient(cltID);
}

例では，javax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスという二つのCallクラスが使われています。Javaでは，別パッケージに存在する，同じ名前のクラスをimport宣言に書けないため，同じクラス内でjavax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスを使用する場合には，例のように完全修飾名で指定する必要があります。

DIIでは，引数にHolderクラスを指定しません。Holderクラスに対応するJavaの基本型クラスを指定してください。例では，javax.xml.rpc.holders.StringHolderに対応するjava.lang.Stringクラスを指定しています。

4.5.4　ユーザ定義のデータ型クラスを使用する場合

ユーザ定義のデータ型クラスを使用する場合のWSDLの例およびDIIのコーディング例を示します。なお，WSDLの例では次の情報が定義されています。

WSDLのサービス名

名前空間URI…http://example.com

ローカル名…StockQuoteService

WSDLのポート名

名前空間URI…http://example.com

ローカル名…StockQuote

WSDLのオペレーション名

名前空間URI…http://example.com

ローカル名…getLastTradePrice

オペレーションのパラメタ名…in0

XMLスキーマの複合型（パラメタに定義）

名前空間URI…http://example.com

ローカル名…TradeDate

XMLスキーマの複合型（戻り値に定義）

名前空間URI…http://example.com

ローカル名…TradePrice

XMLスキーマの複合型（ユーザ定義例外に定義）

名前空間URI…http://example.com

ローカル名…TradePriceException

(1)　WSDLの例（StockQuote.wsdl）

<wsdl:definitions
targetNamespace="http://example.com"
xmlns:intf="http://example.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<wsdl:types>
  <schema elementFormDefault="qualified"
   targetNamespace="http://example.com"
 xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="getLastTradePrice">
      <complexType>
        <sequence>
          <element name="in0" type="intf:TradeDate"/>
        </sequence>
      </complexType>
    </element>

    <complexType name="TradeDate">
      <sequence>
        <element name="date" nillable="true" type="xsd:string"/>
      </sequence>
    </complexType>

    <element name="getLastTradePriceResponse">
      <complexType>
        <sequence>
          <element name="getLastTradePriceReturn" type="intf:TradePrice"/>
        </sequence>
      </complexType>
    </element>

    <complexType name="TradePrice">
      <sequence>
        <element name="price" type="xsd:int"/>
      </sequence>
    </complexType>

    <element name="TradePriceException" type="intf:TradePriceException"/>

    <complexType name="TradePriceException">
      <sequence>
        <element name="errcode" type="xsd:int"/>
      </sequence>
    </complexType>

 </schema>
</wsdl:types>

<wsdl:message name="getLastTradePriceResponse">
  <wsdl:part name="parameters" element="intf:getLastTradePrice"/>
</wsdl:message>

<wsdl:message name="getLastTradePriceRequest">
  <wsdl:part name="parameters" element="intf:getLastTradePriceResponse"/>
</wsdl:message>

<wsdl:message name="TradePriceException">
  <wsdl:part name="fault" type="intf:TradePriceException"/>
</wsdl:message>

<wsdl:portType name="StockQuote">
  <wsdl:operation name="getLastTradePrice">
    <wsdl:input message="intf:getLastTradePriceRequest" name="getLastTradePriceRequest"/>
    <wsdl:output message="intf:getLastTradePriceResponse" name="getLastTradePriceResponse"/>
    <wsdl:fault message="intf:TradePriceException" name="TradePriceException"/>
  </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="StockQuoteSoapBinding" type="intf:StockQuote">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

  <wsdl:operation name="getLastTradePrice">
    <soap:operation soapAction=""/>

    <wsdl:input name="getLastTradePriceRequest">
      <soap:body use="literal"/>
    </wsdl:input>

    <wsdl:output name="getLastTradePriceResponse">
      <soap:body use="literal"/>
    </wsdl:output>

    <wsdl:fault name="TradePriceException">
      <soap:fault name="TradePriceException" use="literal"/>
    </wsdl:fault>
  </wsdl:operation>
</wsdl:binding>

<wsdl:service name="StockQuoteService">
  <wsdl:port binding="intf:StockQuoteSoapBinding" name="StockQuote">
   <soap:address location="http://localhost:8080/StockQuote/services/StockQuote"/>
  </wsdl:port>
</wsdl:service>

</wsdl:definitions>

(2)　DIIのコーディング例

// SOAPクライアントの開始
ClientID cltID = Management.initializeClient();

// クライアント識別子と実行スレッドを関連づける
Management.connectClientIDtoCurrentThread(cltID);

try {
// Serviceオブジェクトの生成
QName serviceName = new QName(
    "http://example.com",
    "StockQuoteService");
URL wsdlDocumentLocation = null;
try {
wsdlDocumentLocation = new URL("file:///C:/foo/StockQuote.wsdl");
} catch (MalformedURLException e) {
// 異常時の処理
}

ServiceFactory factory = null;
Service service = null;
try {
    factory = ServiceFactory.newInstance();
    service = factory.createService(wsdlDocumentLocation, serviceName);
} catch (ServiceException e) {
// 異常時の処理
}

// Callオブジェクトの生成
QName portName = new QName(
        "http://example.com",
        "StockQuote");
QName operationName = new QName(
        "http://example.com",
        "getLastTradePrice");
javax.xml.rpc.Call call = null;
try {
call = service.createCall(portName, operationName);
} catch (ServiceException e) {
// 異常時の処理
}

// サービス呼び出し
// 入力パラメータを生成
Class inputClass =((com.cosminexus.cws.xml.rpc.Call)
call).getParameterClassByName("in0");
Object in0 = null;

try {
    if (inputClass != null) {
        if (inputClass.getName().equals("com.example.TradeDate")) {
            in0 = inputClass.newInstance();

// メンバメソッドをリフレクトするMethodオブジェクトを取得
            Class[] parameterTypes = {String.class};
            Method method = inputClass.getMethod("setDate", parameterTypes);

// メンバメソッドを実行
            Object[] initargs = {"20070101"};
            method.invoke(in0, initargs);
        }
    }
} catch (Exception e) {
// 異常時の処理
}
Object[] inParams = new Object[]{in0};

Object ret = null;
try {
    ret = call.invoke(inParams);
} catch (RemoteException e) {
// 異常時の処理
    Throwable cause = e.getCause();
    if (cause instanceof C4Fault) {
        C4Fault fault = (C4Fault)cause;

// 例外メッセージの取得
        String msg = fault.getMessage();
        System.out.println(msg);

        Throwable uerr = fault.getCause();
        if (uerr != null) {
// ユーザ定義例外が含まれる場合
            Class errClass = uerr.getClass();

            int errcode = 0;
            try {
                if (errClass != null) {
                    if (errClass.getName().equals(
                        "com.example.TradePriceException")) {
                        Class[] clParam = {};
                        Object[] objParam = {};

 // メンバメソッドをリフレクトするMethodオブジェクトを取得
                        Method method = errClass.getMethod(
                                       "getErrcode", clParam);

// メンバメソッドを実行し，戻り値を取得
                        Object retErrcode = method.invoke(uerr, objParam);
                        if (retErrcode.getClass() == Integer.class) {
                            errcode = ((Integer)retErrcode).intValue();
                        }
                    }
                }
            } catch (Exception ex) {
// 異常時の処理
            }
            System.out.println("errcode : " + errcode);
        } else {
// ユーザ定義例外が含まれない場合
// C4Fault例外からSOAP Faultの情報を取得する
        }
    }
}

// 戻り値の処理
Class retClass = ret.getClass();
int price = 0;
try {
if (retClass != null) {
    if (retClass.getName().equals("com.example.TradePrice")) {
        Class[] clParam = {};
        Object[] objParam = {};

// メンバメソッドをリフレクトするMethodオブジェクトを取得
            Method method = retClass.getMethod("getPrice", clParam);

// メンバメソッドを実行し，戻り値を取得
            Object retPrice = method.invoke(ret, objParam);
            if (retPrice.getClass() == Integer.class) {
                price = ((Integer)retPrice).intValue();
            }
        }
    }
} catch (Exception e) {
// 異常時の処理
}
System.out.println("price : " + price);

} finally {
// クライアント識別子と実行スレッドの関連づけを解除する
Management.disconnectClientIDtoCurrentThread(cltID);

// SOAPクライアントの終了
Management.finalizeClient(cltID);
}

例では，javax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスという二つのCallクラスが使われています。Javaでは，別パッケージに存在する，同じ名前のクラスをimport宣言に書けないため，同じクラス内でjavax.xml.rpc.Callクラスとcom.cosminexus.cws.xml.rpc.Callクラスを使用する場合には，例のように完全修飾名で指定する必要があります。

4.5.5　配列を使用する場合

配列を使用する場合のWSDLの例およびDIIのコーディング例を示します。なお，WSDLの例では次の情報が定義されています。

WSDLのサービス名

名前空間URI…http://example.com

ローカル名…StockQuoteService

WSDLのポート名

名前空間URI…http://example.com

ローカル名…StockQuote

WSDLのオペレーション名

名前空間URI…http://example.com

ローカル名…getLastTradePrice

オペレーションのパラメタ名…in0

配列（パラメタに定義）

ローカル名…getLastTradePrice

配列（戻り値に定義）

ローカル名…getLastTradePriceResponse

(1)　WSDLの例（StockQuote.wsdl）

<wsdl:definitions
targetNamespace="http://example.com"
xmlns:intf="http://example.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<wsdl:types>
  <schema elementFormDefault="qualified"
   targetNamespace="http://example.com"
   xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="getLastTradePrice">
      <complexType>
        <sequence>
          <element name="in0" maxOccurs="unbounded" minOccurs="0" type="xsd:string"/>
        </sequence>
      </complexType>
    </element>

    <element name="getLastTradePriceResponse">
      <complexType>
        <sequence>
          <element name="getLastTradePriceReturn" maxOccurs="unbounded" minOccurs="0" type="xsd:in/>
        </sequence>
      </complexType>
    </element>

  </schema>
</wsdl:types>

<wsdl:message name="getLastTradePriceRequest">
  <wsdl:part element="intf:getLastTradePrice" name="parameters"/>
</wsdl:message>

<wsdl:message name="getLastTradePriceResponse">
  <wsdl:part element="intf:getLastTradePriceResponse" name="parameters"/>
</wsdl:message>

<wsdl:portType name="StockQuote">
  <wsdl:operation name="getLastTradePrice">
    <wsdl:input message="intf:getLastTradePriceRequest" name="getLastTradePriceRequest"/>
    <wsdl:output message="intf:getLastTradePriceResponse" name="getLastTradePriceResponse"/>
  </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="StockQuoteSoapBinding" type="intf:StockQuote">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

  <wsdl:operation name="getLastTradePrice">
    <soap:operation soapAction=""/>

    <wsdl:input name="getLastTradePriceRequest">
      <soap:body use="literal"/>
    </wsdl:input>

    <wsdl:output name="getLastTradePriceResponse">
      <soap:body use="literal"/>
    </wsdl:output>
  </wsdl:operation>
</wsdl:binding>

<wsdl:service name="StockQuoteService">
  <wsdl:port binding="intf:StockQuoteSoapBinding" name="StockQuote">
    <soap:address location="http://localhost:8080/StockQuote/services/StockQuote"/>
  </wsdl:port>
</wsdl:service>

</wsdl:definitions>

(2)　DIIのコーディング例

// SOAPクライアントの開始
ClientID cltID = Management.initializeClient();
// クライアント識別子と実行スレッドを関連づける
Management.connectClientIDtoCurrentThread(cltID);

try {
// Serviceオブジェクトの生成
QName serviceName = new QName(
    "http://example.com",
    "StockQuoteService");
    URL wsdlDocumentLocation = null;
try {
    wsdlDocumentLocation = new URL("file:///C:/foo/StockQuote.wsdl");
} catch (MalformedURLException e) {
// 異常時の処理
}

ServiceFactory factory = null;
Service service = null;
try {
    factory = ServiceFactory.newInstance();
    service = factory.createService(wsdlDocumentLocation, serviceName);
} catch (ServiceException e) {
// 異常時の処理
}

// Callオブジェクトの生成
QName portName = new QName(
        "http://example.com",
        "StockQuote");
QName operationName = new QName(
        "http://example.com",
        "getLastTradePrice");
javax.xml.rpc.Call call = null;
try {
call = service.createCall(portName, operationName);
} catch (ServiceException e) {
// 異常時の処理
}

// サービス呼び出し
// 入力パラメータを生成
Class inputClass = ((com.cosminexus.cws.xml.rpc.Call)call).getParameterClassByName("in0");
Object in0 = null;
if (inputClass == String[].class) {
    in0 = new String[]{"20070101", "20070201"};
}

Object[] inParams = new Object[]{in0};
Object ret = null;
try {
    ret = call.invoke(inParams);
} catch (RemoteException e) {
// 異常時の処理
    Throwable cause = e.getCause();
    if (cause != null) {
// 原因例外が存在する場合の処理
        System.out.println(cause.getMessage());
    }
}

// 戻り値の処理
Class retClass = ret.getClass();
int price = 0;
if (retClass == Integer[].class) {
    Integer[] prices = (Integer[])ret;
    if (prices.length > 0) {
        price = prices[0].intValue();
    }
}
System.out.println("price : " + price);
} finally {
// クライアント識別子と実行スレッドの関連づけを解除する
Management.disconnectClientIDtoCurrentThread(cltID);
// SOAPクライアントの終了
Management.finalizeClient(cltID);
}

5　メッセージング形態のSOAPアプリケーションの開発

メッセージング形態のSOAPアプリケーションは，SAAJや開発支援コマンドを使用して開発できます。

この章では，メッセージング形態のSOAPアプリケーションの開発の流れについて説明します。また，添付ファイル付きSOAPメッセージを実装する方法，およびXML Processorを使用して開発する方法についても説明します。

5.1　メッセージング形態のSOAPアプリケーション開発の流れ

メッセージング形態のSOAPアプリケーションを新規に開発する場合の流れを示します。

図5‒1　メッセージング形態のSOAPアプリケーションの新規開発

メッセージング形態のSOAPアプリケーションを新規に開発する場合，サーバ側の処理を実装し，実装したJavaクラスからサービスデプロイ定義を生成します。また，SAAJを使用して，クライアント側の処理を実装します。

SOAPアプリケーションを新規に開発する場合の手順を示します。括弧内の数字は，開発例の参照先を示します。

サーバ側の処理を実装する（6.2）

ReqResListenerインタフェースを実装します。

サービスデプロイ定義を生成する（6.3）

実装したJavaクラスをSOAPアプリケーションとして利用するための定義ファイルを生成します。

クライアント側の処理を実装する（6.5）

SAAJを使用して，SOAPサービスを利用するクライアント側の処理を実装します。

5.2　メッセージング形態での添付ファイルの使用

メッセージング形態のSOAPアプリケーションでは，SAAJを利用することで，添付ファイル付きのSOAPメッセージを送受信できます。ここでは，添付ファイル付きSOAPメッセージを実装するために必要な内容について説明します。

なお，添付ファイル付きSOAPメッセージを受信すると，メモリ使用量を抑制するために退避ファイルが作成されることがあります。退避ファイルの詳細については，「付録B　添付ファイル使用時に作成される退避ファイル」を参照してください。

5.2.1　添付できるファイル

メッセージング形態では，SOAPメッセージで添付できるファイルの種類に制限はありません。ここでは，添付ファイルのサイズおよび添付ファイルの個数の上限値を示します。また，添付ファイルに対応するMIMEタイプ，および添付ファイル使用時の注意事項について説明します。

(1)　添付ファイルのサイズの上限値

添付できるファイルサイズは，デフォルトで100MB（104,857,600バイト）までです。この値は次に示す動作定義ファイルで変更できます。

サーバ定義ファイル

c4web.attachment.<識別子>.send_max_attachment_size

c4web.attachment.<識別子>.receive_max_attachment_size

クライアント定義ファイル

c4web.attachment.send_max_attachment_size

c4web.attachment.receive_max_attachment_size

なお，上限値を超える添付ファイルを送信しようとした場合，javax.xml.soap.SOAPConnectionクラスのcallメソッドの呼び出しで，javax.xml.soap.SOAPException例外が発生します。

(2)　添付ファイルの個数の上限値

添付できるファイル個数は，デフォルトで100個までです。この値は次に示す動作定義ファイルで変更できます。

サーバ定義ファイル

c4web.attachment.<識別子>.send_max_attachment_count

c4web.attachment.<識別子>.receive_max_attachment_count

クライアント定義ファイル

c4web.attachment.send_max_attachment_count

c4web.attachment.receive_max_attachment_count

なお，上限値を超える添付ファイルを送信しようとした場合，javax.xml.soap.SOAPConnectionクラスのcallメソッドの呼び出しで，javax.xml.soap.SOAPException例外が発生します。

(3)　添付ファイルに対応するMIMEタイプ

添付したファイルに対応するMIMEタイプは，添付したファイルの拡張子によって決まります。次の表に，SOAP通信基盤が提供するインタフェース（AttachmentPartクラスのsetContentメソッド）で添付ファイルを設定した場合に，デフォルトで設定されるMIMEタイプを示します。なお，SOAP通信基盤が提供するインタフェース（AttachmentPartクラスのsetContentTypeメソッド）を利用することで，任意のMIMEタイプを設定できますが，その場合でも添付したファイルに対応したタイプを設定してください。

表5‒1　添付ファイルの拡張子とMIMEタイプの対応（メッセージング）

添付ファイルとして設定したファイルの拡張子

設定されるMIMEタイプ

html，htm

text/html

txt，text

text/plain

gif，GIF

image/gif

ief

image/ief

jpeg，jpg，jpe，JPG

image/jpeg

tiff，tif

image/tiff

xwd

image/x-xwindowdump

ai，eps，ps

application/postscript

rtf

application/rtf

tex

application/x-tex

texinfo，texi

application/x-texinfo

t，tr，roff

application/x-troff

au

audio/basic

midi，mid

audio/midi

aifc

audio/x-aifc

aif，aiff

audio/x-aiff

wav

audio/x-wav

mpeg，mpg，mpe

video/mpeg

qt，mov

video/quicktime

avi

video/x-msvideo

この表にない拡張子のファイルを設定した場合，MIMEタイプは「application/octet-stream」となります。

(4)　添付ファイルの文字コードと改行コード

SOAP通信基盤では，テキストベースの添付ファイルの文字コードと改行コードを意識しないで，そのままSOAPメッセージを転送します。SOAPアプリケーション間で文字コードや改行コードの情報を受け渡したい場合は，MIMEヘッダのユーザ定義フィールド（「X-」で始まる定義フィールド）に，受け渡すコードの情報を設定してください。

(5)　MIMEヘッダの扱い

SOAP通信基盤で設定されるMIMEヘッダ値は，RFC822に従って，すべてUS-ASCIIとして扱います。US-ASCII以外の文字列をMIMEヘッダ内に指定する場合，RFC2047に準拠したMIMEヘッダのエンコーディングやデコーディングをSOAPアプリケーション側で実装する必要があります。

5.2.2　添付ファイル付きSOAPメッセージの実装

メッセージング形態のSOAPアプリケーションでは，SAAJを利用して必要な処理を実装します。SAAJが提供するAPIの詳細については，SAAJに関するドキュメントを参照してください。

5.3　XML Processorを使用したSOAPメッセージの送受信

送受信するXMLデータが複雑な構造をしている場合や，あらかじめ別のプログラムでDOMオブジェクトを生成してある場合など，SAAJを使わないでDOMのデータを直接利用したい場合があります。その場合，XML Processorを利用して，XMLデータを生成／解析できます。

XMLデータを操作するという点では，XML Processorの提供するDOMインタフェースは，SAAJインタフェースに比べ自由度が高く，機能も充実しています。

ここでは，XML Processorを使用した場合の送信メッセージの生成方法，および受信メッセージの解析方法について説明します。

5.3.1　XML Processorを使用した送信メッセージの生成

複雑なXMLデータを生成する必要がある場合や，あらかじめ用意されたXMLデータを利用する場合は，XML Processorで必要なXMLデータを生成したあとに，SAAJに取り込む方法を推奨します。

XML Processorで作成したDOMオブジェクト（XMLデータ）を埋め込んだSOAPメッセージを作成する場合，次の手順で処理してください。

XML Processorを使用して，DOMドキュメントのデータを作成します。

送信するメッセージのSOAPPartオブジェクトにあるimportNodeメソッドで，データを変換します。

SAAJを使用して，変換したデータを追加します。

追加先は，SOAPボディ要素の下，SOAPヘッダ要素の下，またはSOAP FaultのDetail要素の下にしてください。SOAPボディ要素やSOAPヘッダ要素そのものを変換することはできません。

作成したメッセージを送信します。

SAAJに変換したデータは，SAAJのインタフェースを使って変更しないで，そのまま送信してください。

インポートしたデータに，SOAPヘッダのヘッダ属性が含まれる場合は，その値がそのまま送信されます。ただし，SOAPヘッダ要素の直下の要素で，mustUnderstand属性を省略した場合には，次のデフォルト定義が自動的に付加されます。

mustUnderstand="0"

ヘッダ属性を利用する場合，デフォルト値を意識して，定義がある場合でもない場合でも，正しく処理できるようにユーザプログラムを作成してください。

送信メッセージのSOAPボディ要素の下にXMLを追加する場合のコーディング例を次に示します。

import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample1 {
    /**
     * Documentオブジェクトのルート要素をSOAPボディ要素の下に格納する。
     *
     * @param msg 格納先の SOAPMessage (MessageFactoryで作成しただけのもの)
     * @param doc 格納元の Document (XML Processorで作成したもの)
     * @return    格納先の SOAPMessage
     */
    public SOAPMessage sample(SOAPMessage msg, Document doc) {
        try {
            SOAPPart part = msg.getSOAPPart();

            // DOMのNodeオブジェクトを取り出しSAAJオブジェクトに変換する
            Node source = doc.getDocumentElement();
            SOAPElement e = (SOAPElement)part.importNode(source, true);

            // メッセージのSOAPBodyの下に追加する
            SOAPBody body = msg.getSOAPBody();
            e = body.addChildElement(e);
        }
        catch (Exception e) {
            // 省略
        }
        return msg;
    }
}

送信メッセージのSOAP FaultのDetail要素下に，XMLを追加する場合のコーディング例を次に示します。

import javax.xml.soap.Detail;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample2 {
    /**
     * Documentオブジェクトのルート要素をDetail要素の下に格納する。
     *
     * @param msg 格納先の SOAPMessage (MessageFactoryで作成しただけのもの)
     * @param doc 格納元の Document (XML Processorで作成したもの)
     * @return    格納先の SOAPMessage
     */
    public SOAPMessage sample(SOAPMessage msg, Document doc) {
        try {
            SOAPPart part = msg.getSOAPPart();

            // DOMのNodeオブジェクトを取り出しSAAJオブジェクトに変換する
            Node source = doc.getDocumentElement();
            SOAPElement e = (SOAPElement)part.importNode(source, true);

            // メッセージのSOAPFault中のDetail要素の下に追加する
            SOAPBody body = msg.getSOAPBody();
            SOAPFault fault = body.addFault();
            Detail detail = fault.addDetail();
            e = detail.addChildElement(e);

            // faultString, faultActor, faultCodeなどを設定する
            fault.setFaultString("sample error");
            // 省略
        }
        catch (Exception e) {
            // 省略
        }
        return msg;
    }
}

5.3.2　XML Processorを使用した受信メッセージの解析

受信したメッセージをXMLデータとして処理する場合は，XML Processorのオブジェクトに変換して解析する方法を推奨します。

SOAP通信基盤でXMLデータを埋め込んだSOAPメッセージを受信し，データを取り出す場合，次の手順で処理してください。

XML Processorを利用し，Documentオブジェクトを作成します。

作成したDocumentオブジェクトのimportNodeメソッドで，受信したSAAJのデータを変換します。

取得したNodeオブジェクトを操作して，必要な要素を取得します。

受信メッセージを解析する場合のコーディング例を次に示します。

import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample3 {
    /**
     * 受信したSOAPMessageオブジェクト全体を，DOMのオブジェクトに変換する
     * @param doc 変換先のDocument (XML Processorで作成したもの)
     * @param msg 変換元のSOAPMessage(受信したもの)
     * @return    変換した要素
     */
    public Node sample(Document doc, SOAPMessage msg) {
        Node n = null;
        try {
            // SAAJのデータを，XML Processorにインポートする
            SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
            n = doc.importNode(env, true);
        }
        catch (Exception e) {
            // 省略
        }
        return n;
    }
}

受信メッセージがSOAP Faultメッセージである場合も，DOMとして解析できます。また，SOAPFaultインタフェースを利用して，faultStringなどにアクセスすることもできます。

SOAPFaultインタフェースを利用する場合でも，Detail要素以下にXMLデータを格納している場合は，XML Processorのオブジェクトに変換して解析してください。

SOAP Faultメッセージである受信メッセージを解析する場合のコーディング例を次に示します。

import javax.xml.soap.Detail;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample4 {
    /**
     * 受信したSOAPFaultのdetail要素をDOMのNodeオブジェクトに変換する。
     *
     * @param doc 変換先の Document (XML Processorで作成したもの)
     * @param msg 変換元の SOAPMessage (受信したもの)
     * @return    変換した要素
     */
    public Node sample(Document doc, SOAPMessage msg) {
        Node n = null;
        try {
            SOAPBody body = msg.getSOAPBody();
            if (body.hasFault()) {
                SOAPFault fault = body.getFault();
                // SOAPFaultのほかの要素(faultStringなど)にアクセスする
                String faultString = fault.getFaultString();
                // 省略

                // DetailだけはDOMとして取得する
                Detail detail = fault.getDetail();
                n = doc.importNode(detail, true);
            }
            else {
                // 省略
            }
        }
        catch (Exception e) {
            // 省略
        }
        return n;
    }
}

5.4　SAAJを使用したSOAPアプリケーション開発時の注意事項

SAAJを使用して，SOAPアプリケーションを開発する場合の注意事項について説明します。

5.4.1　SOAPアプリケーションのサービス名に関する注意

RPC形態，メッセージング形態，およびEJB形態のSOAPサービスで，同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると，予期しない動作をするおそれがあります。

5.4.2　複数個のAttachmentPartオブジェクトを追加する場合の注意

複数個のAttachmentPartオブジェクトを追加する場合，AttachmentPartオブジェクトを追加する個数分，生成するようにしてください。同一のAttachmentPartオブジェクトをSOAPMessage#addAttachmentPart（AttachmentPart AttachmentPart）メソッドの引数として指定し，処理を複数回実行しても，SOAPメッセージ上には一つしか存在しない場合があります。

5.4.3　setPropertyメソッドで指定するプロパティのデフォルト値

SOAPMessage#setProperty（java.lang.String property,java.lang.Object value）メソッドで指定できるプロパティは次の二つだけです。

CHARACTER_SET_ENCODING

WRITE_XML_DECLARATION

CHARACTER_SET_ENCODINGのデフォルト値は"utf-8"，WRITE_XML_DECLARATIONのデフォルト値は"false"です。CHARACTER_SET_ENCODING，WRITE_XML_DECLARATION以外をプロパティとして指定しても，javax.xml.soap.SOAPException例外は発生しません。

5.4.4　setPropertyメソッドで指定するプロパティ値に関する注意

SOAPMessage#setProperty（java.lang.String property,java.lang.Object value）メソッドで指定できるCHARACTER_SET_ENCODING，およびWRITE_XML_DECLARATIONのvalue値には，Stringオブジェクトを指定してください。Stringオブジェクト以外を設定した場合，java.lang.ClassCastException例外が発生することがあります。

5.4.5　MimeHeaderオブジェクトで指定できる文字コードに関する注意

MimeHeaderオブジェクト生成時に，引数で，name，およびvalueに非US-ASCII文字列を指定しないでください。MimeHeaderオブジェクト生成時の引数で，name，およびvalueに非US-ASCII文字列を指定しても，java.lang.IllegalArgumentException例外が発生しない場合があります。

5.4.6　各メソッドで発生する例外

各APIに関して不正な引数を与えた場合にスローされる例外を次に示します。

表5‒2　各APIに関して不正な引数を与えた場合にスローされる例外

SAAJ仕様書に記載されている各メソッドのthrows：の内容

各APIでスローされる例外

javax.xml.soap.SOAPException

javax.xml.soap.SOAPException

java.lang.IllegalArgumentException

java.lang.IllegalArgumentException

javax.xml.soap.SOAPException

java.lang.IllegalArgumentException

java.lang.IllegalArgumentException

javax.xml.soap.SOAPException

java.lang.IllegalArgumentException以外

javax.xml.soap.SOAPException

記述なし

java.lang.IllegalArgumentException

5.4.7　SOAPPartクラスのsetContentメソッドの引数に関する注意

SOAPPart#setContent（javax.xml.transform.Source source）メソッドの引数には，正しいSOAPメッセージを表すソースオブジェクトを指定してください。正しいSOAPメッセージを表すソースオブジェクトを指定しなかった場合，不正なSOAPメッセージを送信してしまう場合があります。

5.4.8　AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合の上限サイズ

AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合，送受信できる添付ファイルのサイズの上限は1MBです。1MBより大きいサイズの添付ファイルを受信してAttachmentPartのContentを取得すると，1MBを超えた部分が切り捨てられたStringオブジェクトが返されます。

5.4.9　クッキーについて

Webサーバから受け取ったクッキーは，SOAPConnectionオブジェクトが保持します。クッキーを利用する場合，メッセージングサービスを呼び出すたびに，SOAPConnectionオブジェクトを破棄することなく，継続して使用してください。

5.4.10　クッキーの有効期限について

expires属性で設定したクッキーの有効期限に達しても，SOAPクライアントライブラリは保持しているクッキーを削除しません。

期限切れのクッキーを受け取っても処理できるようにサーバで対処してください。

5.4.11　マルチスレッドでの動作について

SAAJの各メソッドは，スレッドセーフではありません。SAAJのオブジェクトをマルチスレッドで共有しないでください。共有した場合には，動作を保証できません。

5.4.12　受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合の注意

受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合，兄弟ノードのすべてのテキストノードを連結し，そのテキストノードを同じ階層の最後に追加します。

受信電文のBody要素に対するjavax.xml.soap.SOAPElement#getChildElementsおよびorg.w3c.dom.Node#getChildNodesの結果を示します。

受信電文のBody要素

<soapenv:Body><a/>△△foo△△<b/>△△bar△△</soapenv:Body>

javax.xml.soap.SOAPElement#getChildElementsの戻り値

Iteratorの最初の要素 : Elementノード <a/>
Iteratorの二番目の要素 : Elementノード <b/>
Iteratorの三番目の要素 : Textノード △△foo△△△△bar△△

org.w3c.dom.Node#getChildNodesの戻り値

NodeListの最初のノード : Elementノード <a/>
NodeListの二番目のノード : Elementノード <b/>
NodeListの三番目のノード : Textノード △△foo△△△△bar△△

注　△は半角スペースを表します。

5.4.13　名前空間に属さない要素を追加する場合の注意

SOAPボディの子要素以下の要素（SOAPボディの子要素を含む）に，その子要素として名前空間に属さない要素を追加する場合，javax.xml.soap.SOAPFactoryクラスのcreateElementメソッドでjavax.xml.soap.SOAPElementオブジェクトを生成し，生成したオブジェクトを指定して，javax.xml.soap.SOAPElementクラスのaddChildElementメソッドを呼び出してください。例を次に示します。

SOAPFactory soapFactory = SOAPFactory.newInstance();

// 名前空間に属さない"entry"という要素名の要素をsoapElementに追加する例
// soapElementは，子要素を追加するSOAPボディの子要素以下の要素（SOAPボディの子要素を含む）
soapElement.addChildElement( soapFactory.createElement( "entry" ) );

5.4.14　SOAPメッセージの要素の名前空間プレフィクスに関する注意

同じ名前空間URIで異なる名前空間プレフィクスは使用しないでください。

要素の名前空間プレフィクスに，同じ名前空間URIで異なる名前空間プレフィクスを付けたメッセージを作成した場合，送信されるSOAPメッセージ内の要素の名前空間プレフィクスが作成時と異なることがあります（いちばん近い名前空間宣言の名前空間プレフィクスが付けられます）。作成したメッセージと送信されるSOAPメッセージの例を次に示します。

＜作成したメッセージ＞
<prefix01:elm1 xmlns:prefix01="http://localhost">
<prefix02:elm2 xmlns:prefix02="http://localhost">
<prefix01:elm3>
<prefix02:elm4/>
</prefix01:elm3>
</prefix02:elm2>
</prefix01:elm1>

＜送信されるSOAPメッセージ＞
<prefix01:elm1 xmlns:prefix01="http://localhost">
<prefix02:elm2 xmlns:prefix02="http://localhost">
<prefix02:elm3>
<prefix02:elm4/>
</prefix02:elm3>
</prefix02:elm2>
</prefix01:elm1>

5.4.15　setPropertyメソッドで指定したエンコード方式に関する注意

SOAPMessage#setProperty()メソッドの引数で，CHARACTER_SET_ENCODINGプロパティに指定できる値は"utf-8"だけです。

SOAPMessage#setProperty()メソッドの引数で，CHARACTER_SET_ENCODINGプロパティに"utf-16"を指定してSOAPメッセージを作成し，送信した場合，実際の送信メッセージにあるSOAPメッセージのエンコード方式が"utf-16"と異なることがあります。

5.4.16　SOAPPartクラスから取得したMimeHeaderに関する注意

SOAPPartクラスから取得したMimeHeaderは有効にならないため，利用しないことを推奨します。

SOAPPart#getAllMimeHeaders()メソッドを発行して値を取得した場合，実際の送信メッセージにあるSOAPメッセージに含まれるMIMEヘッダと異なることがあります。

5.4.17　MIMEヘッダに関する注意

SOAPPartクラスに対し指定したMimeHeaderは有効にならないため，利用しないでください。

SOAPPart#addMimeHeader()メソッド，SOAPPart#setMimeHeader()メソッドでMIMEヘッダを追加した場合，またはSOAPPart#setContentId()メソッド，SOAPPart#setContentLocation()メソッドで値を指定した場合，実際の送信メッセージにあるSOAPメッセージに含まれるMIMEヘッダに反映されないことがあります。

5.4.18　SOAPFaultクラスのsetFaultCodeメソッドの引数に関する注意

SOAPFaultクラスのsetFaultCodeメソッドの引数に，"prefix:localName"形式のStringオブジェクトを指定する場合は，SOAPFault#setFaultCode(String faultCode)メソッドではなく，SOAPFault#setFaultCode（Name faultCodeQName）メソッドを使用してください。

SOAPFault#setFaultCode(String faultCode)メソッドの引数に"prefix:localName"形式のStringオブジェクトを指定した場合，javax.xml.soap.SOAPException例外が発生することがあります。

5.4.19　AttachmentPartクラスのsetContentメソッドの引数に関する注意

AttachmentPart#setContent（Object object, String contentType）メソッドの引数objectには，JAF仕様に準拠する型のオブジェクトを指定し，引数contentTypeには，RFC2045に準拠するContent-Typeヘッダの値を指定してください。

AttachmentPart#setContent（Object object, String contentType）メソッドの引数objectにJAF仕様に準拠する型のオブジェクト以外を指定した場合，または引数contentTypeにRFC2045に準拠するContent-Typeヘッダの値以外を指定した場合，タイムアウト待ちが発生し，不正なSOAPメッセージが送信されることがあります。

5.4.20　名前空間プレフィクスを引数として渡すメソッドを発行した場合の注意

名前空間プレフィクスを引数として渡すメソッドを発行した場合，次の現象が発生することがあります。

名前空間プレフィクスが付与されない。

指定した名前空間プレフィクスと異なるプレフィクスが付与される。

5.4.21　引数にnullオブジェクトを指定した場合の注意

メソッドを発行する前に，引数がnullオブジェクトでないことを確認してください。メソッドの引数にnullオブジェクトを指定した場合，次の現象が発生することがあります。

不正なSOAPメッセージが生成される。

java.lang.NullPointerException例外が発生する。

対象オブジェクトに不正な値が設定される。

対象オブジェクトに対して何も処理をしない。

nullオブジェクトを指定後，取得系のメソッドを発行しても正しい値が取得できない。

5.4.22　CHARACTER_SET_ENCODINGプロパティの値の取得に関する注意

マルチパート形式のSOAPメッセージを受信した場合，SOAPMessage#getProperty()メソッドを使用して，CHARACTER_SET_ENCODINGプロパティの値を取得することはできません。nullオブジェクトが返されます。

5.4.23　SOAPMessageクラスのsaveChangesメソッドおよびsaveRequiredメソッドの発行に関する注意

SOAPMessage#saveChanges()メソッドおよびSOAPMessage#saveRequired()メソッドを発行しないでください。

SOAPMessage#saveChanges()メソッドおよびSOAPMessage#saveRequired()メソッドを発行した場合，生成されるSOAPメッセージが予期しない形式になることがあります。

5.4.24　SOAPMessageクラスのwriteToメソッドの発行に関する注意

SOAPMessage#writeTo()メソッドは発行しないでください。

SOAPMessage#writeTo()メソッドを発行後に，SOAPConnection#call()メソッドを実行した場合，SOAPConnection#call()メソッド発行の延長でjavax.xml.soap.SOAPException例外が発生することがあります。

また，SOAPMessage#writeTo()メソッドの引数に，すでにcloseされたOutputStreamオブジェクトを指定した場合，java.io.IOException例外が発生しないで処理が続行することがあります。

5.4.25　NodeクラスのdetachNodeメソッドの発行に関する注意

Node#detachNode()メソッドの発行によって，対象オブジェクトが存在しない状態でメソッドを発行すると，例外が発生します。Node#detachNode()メソッドの発行対象となったオブジェクトを包含しているオブジェクトに対してメソッドを発行すると，例外が発生することがあります。

Node#detachNode()メソッドを発行した場合は，包含するオブジェクトを再生成してからメソッドを発行してください。

5.4.26　添付ファイルの削除に関する注意

次に示す表（MIMEヘッダのコンテントタイプの分類）の項番1〜3の場合を除いて，AttachmentPart#getContent()メソッド発行後に，取得した入力ストリームをユーザプログラムで閉じていない場合，添付ファイルを削除できなくなることがあります。

なお，AttachmentPart#getDataHandler()メソッドの延長で，java.io.InputStreamオブジェクトを取得した場合も同様です。

表5‒3　MIMEヘッダのコンテントタイプの分類

項番

MIMEヘッダの

コンテントタイプ

AttachmentPart#getContent()

メソッドの戻り値

入力ストリームを明示的にユーザプログラムで閉じる必要の有無

1

"text/plain"

java.lang.String

×

2

"image/gif"

java.awt.Image

×

3

"image/jpeg"

java.awt.Image

×

4

"text/xml"

javax.xml.transform.stream.StreamSource

○

5

上記以外

java.io.InputStream

○

（凡例）

×：入力ストリームを明示的にユーザプログラムで閉じる必要はありません。

○：入力ストリームを明示的にユーザプログラムで閉じる必要があります。

添付ファイルを削除できない場合，J2EEサーバを停止後，手動でファイルを削除してください。なお，入力ストリームを閉じないで連続稼働した場合，ファイルディスクリプタなどのOS資源が枯渇するおそれがあります。

5.4.27　引数の名前空間URIまたは名前空間プレフィクスの指定に関する注意

名前空間URIまたは名前空間プレフィクスを引数として指定する場合は，引数がnullオブジェクトまたは""（空文字列）でないことを確認してください。

引数の名前空間URIまたは名前空間プレフィクスとしてnullオブジェクトまたは""（空文字列）を指定した場合，次の現象が発生することがあります。

予期しない名前空間URIまたは名前空間プレフィクスが設定される。

名前空間URIまたは名前空間プレフィクスが不正なSOAPメッセージを送信する。

5.4.28　SOAPElementクラスのaddChildElementメソッドの指定に関する注意

SOAPElement#addChildElement()メソッドの引数にSOAP名前空間（"http://schemas.xmlsoap.org/soap/envelope/"）に属するSOAPエンベロープ，SOAPヘッダ，SOAPボディ，および自分自身を含む要素を指定した場合，java.lang.StackOverflowError例外が発生することがあります。

5.4.29　SOAPHeaderクラスのexamineHeaderElementsメソッドおよびextractHeaderElementsメソッドの実行に関する注意

SOAPHeader#examineHeaderElements()メソッドおよびSOAPHeader#extractHeaderElements()メソッドを実行すると，次のSOAPHeaderElementオブジェクトを含むIteratorが返されます。

引数で指定したactorを持つSOAPHeaderElementオブジェクト

actorとして"http://schemas.xmlsoap.org/soap/actor/next"を持つSOAPHeaderElementオブジェクト

actor属性が存在しないSOAPHeaderElementオブジェクト

SOAPHeader#examineHeaderElements()メソッドの場合，取得したIteratorの各要素から要求するactorを持つSOAPHeaderElementを抽出してください。

SOAPHeader#extractHeaderElements()メソッドの場合，引数で指定したactorを持つSOAPHeaderElementオブジェクト以外に，actorとして"http://schemas.xmlsoap.org/soap/actor/next"を持つSOAPHeaderElementオブジェクト，およびactor属性が存在しないSOAPHeaderElementオブジェクトが，SOAPHeaderオブジェクトから削除されます。指定したactorを持つSOAPHeaderElementオブジェクトだけを削除するには，いったんSOAPHeader#examineHeaderElements()メソッドでIteratorを取得後，要求するactorを持つSOAPHeaderElementを抽出して削除してください。

5.4.30　MessageFactoryクラスのcreateMessageメソッドの引数に関する注意

SOAPアプリケーションでは，引数にcloseしたInputStreamオブジェクトを指定しないでください。

MessageFactory#createMessage（MimeHeaders, InputStream）で，closeしたInputStreamオブジェクトを指定すると，java.lang.RuntimeException例外が発生します。

5.4.31　SOAPElementクラスのgetVisibleNamespacePrefixesメソッドの指定に関する注意

SOAPEnvelopeの子孫ノードに対して，SOAPElement#getVisibleNamespacePrefixes()を発行すると，戻り値のIteratorに名前空間プレフィクスsoapenvが二つ含まれます。二つの名前空間プレフィクスは同じ名前空間URIを指します。

5.4.32　添付オブジェクトに対応するContent-Typeヘッダの設定に関する注意

メソッドを使用してContent-Typeヘッダを設定する場合は，添付オブジェクトに対応するContent-Typeを指定してください。

次のメソッドを使用して添付オブジェクトに対応しないContent-Typeを指定した場合，タイムアウト待ちが発生する，または不正なSOAPメッセージが送信されることがあります。

AttachmentPart#setContentType（String）

AttachmentPart#addMimeHeader（String, String）

AttachmentPart#setMimeHeader（String, String）

5.4.33　MIMEヘッダまたはSOAPヘッダを取得するメソッドに関する注意

次のメソッドを使用してMIMEヘッダまたはSOAPヘッダを取得する場合，該当するMIMEヘッダまたはSOAPヘッダが存在しないと，nullオブジェクトが返されます。

MimeHeaders#getHeader（String）

SOAPPart#getMimeHeader（String）

AttachmentPart#getMimeHeader（String）

SOAPHeader#examineMustUnderstandHeaderElements（String）

5.4.34　送信メッセージのHTTPヘッダについて

Content-Lengthヘッダ，およびContent-Typeヘッダの値は自動で付与されます。Content-Typeヘッダのcharsetに文字コードを設定する場合は，javax.xml.soap.SOAPMessage#setPropertyメソッドを使用して，CHARACTER_SET_ENCODINGを設定してください。

javax.xml.soap.SOAPMessageオブジェクトのMimeHeadersにContent-Lengthヘッダ，およびContent-Typeヘッダを設定していても，送信されるメッセージのHTTPヘッダにはMimeHeadersで設定した値は付与されません。

5.4.35　Managementクラスの使用に関する注意事項

クライアントプログラムでは必ずManagementクラスを使用してください。SAAJを利用して添付ファイルを送受信するときに生成される退避ファイルが，削除されないで残ることがあります。

5.4.36　toStringメソッドの使用に関する注意事項

detail entry以外の内容を含むdetail要素を利用しているSOAP Faultの受信メッセージから得られたjavax.xml.soap.SOAPBodyオブジェクト，およびjavax.xml.soap.SOAPFaultオブジェクトに対して，toStringメソッドを呼び出さないでください。toStringメソッドを呼び出した場合，オブジェクトの内容を表現するXML文字列ではなく，オブジェクトのクラス名とハッシュコードから構成される文字列を返すことがあります。

6　メッセージング形態のSOAPアプリケーションの開発例

この章では，メッセージング形態のSOAPアプリケーションの開発例を手順に沿って説明します。開発したSOAPアプリケーションの実行方法については，「7.　SOAPアプリケーションの実行と運用」を参照してください。

6.1　SOAPアプリケーションを設計する

メッセージング形態のSOAPアプリケーションを新規に開発します。開発例の概要と開発の流れを次に示します。

開発例の概要

SAAJを使用して，任意のXMLデータを送受信するSOAPアプリケーションを新規に開発します。

開発の流れ

SOAPアプリケーションの設計

サーバ側の処理の実装

サービスデプロイ定義の生成

アーカイブ（WARファイル）の作成

クライアント側の処理の実装

最初に，SAAJを使用したSOAPアプリケーションの仕様を設計します。開発例では，次に示すSOAPアプリケーションを新規に開発します。

サービス名

MsgService

入出力

任意のXMLデータ

6.2　サーバ側の処理を実装する

新しくクラスを作成して，処理を実装します。新しく作成したクラスは，SOAP通信基盤が提供するReqResListenerインタフェースを実装します。実装後に，新しく作成したクラスをコンパイルします。

ReqResListenerインタフェースの実装例を次に示します。

package msgservice;

import com.cosminexus.cws.xml.soap.ReqResListener;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPException;

public class MessageServiceImpl implements ReqResListener
{
     public SOAPMessage onMessage(SOAPMessage soapmessage) throws SOAPException
     {
          //
          // メッセージングサービスの実装を行う
          //
     }
}

なお，これ以外の実装例については，次に示すディレクトリに格納しているサンプルプログラムを参照してください。ただし，サンプルプログラムとして提供するのは，SOAPアプリケーション開発支援機能だけです。

<Application Serverのインストールディレクトリ>/c4web/samples

6.3　サービスデプロイ定義を生成する

Java2WSDDコマンドを使用して，作成したJavaプログラムをSOAPアプリケーションとして利用するための定義ファイルを生成します。

Java2WSDDコマンドの指定例を示します。

Java2WSDD.bat -p C4MSG -s MsgService msgservice.MessageServiceImpl

このコマンドを実行すると，カレントディレクトリにサービスデプロイ定義ファイル（server-config.xml）が生成されます。

この例では，-pオプションでC4MSGを指定することでメッセージングのサービスデプロイ定義ファイルを生成し，-sオプションでサービス名を指定していますが，必要に応じてほかのオプションも指定してください。オプションについては，「9.3　Java2WSDDコマンド（サービスデプロイ定義の生成）」を参照してください。

SOAPヘッダ項目の解釈処理をSOAPサービスに実装している場合は，-Sオプションで"true"を指定してください。また，SOAPメッセージをほかのSOAPサービスに中継し，そこでSOAPヘッダを処理する場合も-Sオプションで"true"を指定してください。

注意事項

-Sオプションで"true"を指定した場合，SOAP通信基盤はmustUnderstand属性をチェックしません。このため，次の処理をサーバ側で実装してください。

すべてのSOAPヘッダ項目のうち，処理が必須であると設定されているSOAPヘッダ項目※に対して，処理を実装してください。

処理が必須であると設定されているSOAPヘッダ項目※の処理に失敗した場合は，SOAP Faultを送信する処理を実装してください。

SOAPメッセージを中継する場合は，中継先で処理されるように，未処理のSOAPヘッダ項目は削除しないでください（処理済のSOAPヘッダ項目は削除してください）。

中継先からSOAP Faultを受けた場合は，クライアントにSOAP Faultを送信する処理を実装してください。

注※

「処理が必須であると設定されているSOAPヘッダ項目」とは，actor属性値がSOAPサービス自身を示すURIであり，かつmustUnderstand属性値での処理が必須であると設定されているSOAPヘッダ項目のことを示します。

次に，送信するSOAP Faultの詳細について示します。

表6‒1　送信するSOAP Faultの詳細（-Sオプションで"true"を指定した場合）

SOAP Faultの要素

指定値

faultcode

名前空間識別子：MustUnderstand

（名前空間識別子は，「http://schemas.xmlsoap.org/soap/envelope/」を推奨します）

faultstring

Did not understand "MustUnderstand" header(s):{名前空間識別子：ヘッダ項目のローカル名}

faultactor

SOAP Fault発生元を識別するURI

detail

null

-Sオプションで"false"を指定した場合，SOAP通信基盤はサーバ側の実装を呼び出す前にmustUnderstand属性をチェックします。mustUnderstand属性が「1」となっているSOAPヘッダが存在した場合，サーバ側の実装を呼び出さないでクライアントにSOAP Faultを送信します。

次にクライアントに送信するSOAP Faultの詳細について示します。

表6‒2　送信するSOAP Faultの詳細（-Sオプションで"false"を指定した場合）

SOAP Faultの要素

指定値

faultcode

名前空間識別子：MustUnderstand

（名前空間識別子は，「http://schemas.xmlsoap.org/soap/envelope/」）

faultstring

Did not understand "MustUnderstand" header(s):{名前空間識別子：ヘッダ項目のローカル名}

faultactor

null

detail

null

6.4　アーカイブ（WARファイル）を作成する

J2EEサーバにデプロイするためのアーカイブを作成します。

WARファイルを作成する前に，ディレクトリ構成を整えます。

ディレクトリ構成を次に示すように整えます。

/
  WEB-INF/
    server-config.xml
    web.xml
    classes/
      messagesampleservice/
        MessageSampleService.class

DD（web.xml）に情報を追加します。

追加する情報については，「3.9.2　DD（web.xml）の記述」を参照してください。

WARファイルを作成します。

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

6.5　クライアント側の処理を実装する

実装用の新規クラスを作成し，クライアント側の処理を実装します。クライアント側の処理の実装は，SAAJを使用してください。実装後に新しく作成したクラスをコンパイルします。

クライアント側の処理の実装例を次に示します。

package messagesampleclient;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPMessage;

import com.cosminexus.cws.management.Management;
import com.cosminexus.cws.management.ClientID;

public class MessageSampleClient extends HttpServlet
{
    private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";

    //Client Identifier
    private ClientID cltID = null;

    public void init() throws ServletException
    {
        //Initializing the client
        cltID = Management.initializeClient();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        //Service endpoint url
        String SERVICE_URL = "http://localhost:8080/MessageSampleServer/services/MsgService";

        //Response message output
        String strResultMessage = null;
        String strResultMessageAttach = null;

        //Connecting client to the current thread
        Management.connectClientIDtoCurrentThread(cltID);

        //Getting the parameters set by user
        String strName = request.getParameter("Name");
        if (strName == null)
        {
            strName = "";
        }

        String strSection = request.getParameter("Section");
        if (strSection == null)
        {
            strSection = "";
        }

        String strTelephone = request.getParameter("Telephone");
        if (strTelephone == null)
        {
            strTelephone = "";
        }

        //Request and Response message
        SOAPMessage msgRequest, msgResponse;

        try
        {
            //Creating the soapmessage using MessageFactory
            MessageFactory msgfactory = MessageFactory.newInstance();
            msgRequest = msgfactory.createMessage();

            //Creating the factory instance
            SOAPFactory factory = SOAPFactory.newInstance();

            //Adding retrieved parameters to the body
            SOAPBody bdy = msgRequest.getSOAPBody();
            SOAPElement bdyElmName = bdy.addChildElement("Name", "", "http://localhost");
            bdyElmName.addTextNode(strName);
            SOAPElement bdyElmSection = bdy.addChildElement("Section", "", "http://localhost");
            bdyElmSection.addTextNode(strSection);
            SOAPElement bdyElmTelephone = bdy.addChildElement("Telephone", "", "http://localhost");
            bdyElmTelephone.addTextNode(strTelephone);
            SOAPElement bdyElmAttachment = bdy.addChildElement("Attachment");
            bdyElmAttachment.setAttribute("href","attachment.txt");

            //Getting the path of the file to be attached
            String UserDir = System.getProperty("user.dir");
            String strFileSeperator=File.separator;
            String strContextPath =  (String)getServletConfig().getServletContext().getRealPath("/");
            String strAttachment_c4webcl_Dir = strContextPath + "attachment.txt";
            //Adding an attachment to the request message
            AttachmentPart apPart = msgRequest.createAttachmentPart(new java.io.FileInputStream(new File(strAttachment_c4webcl_Dir)),"text/plain");
            apPart.setContentLocation("attachment.txt");
            msgRequest.addAttachmentPart(apPart);

            //Create Connection
            SOAPConnectionFactory connFactory = SOAPConnectionFactory.newInstance();
            SOAPConnection conn = connFactory.createConnection();
            //Invoke the Service
            msgResponse = conn.call(msgRequest, SERVICE_URL);

            //Retrieving the body elements
            SOAPBody body = msgResponse.getSOAPBody();
            Iterator itr = body.getChildElements();

            if (itr.hasNext())
            {
                SOAPElement elmResult = (SOAPElement)itr.next();
                strResultMessage = elmResult.getFirstChild().getNodeValue();
                if ( itr.hasNext() )
                {
                    SOAPElement elmResultAttach = (SOAPElement)itr.next();
                    strResultMessageAttach = elmResultAttach.getFirstChild().getNodeValue();
                }
            }
        }
        catch( Exception exp )
        {
            //Displaying the exception
            response.setContentType(CONTENT_TYPE);
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head><title>MessageSampleClient</title></head>");
            out.println("<body>");
            out.println("Exception Occurred");
            out.println("<BR>Message ： "+exp.getMessage());
            out.println("</body></html>");
            return;
        }
        finally
        {
            //Disconnecting the client thread
            Management.disconnectClientIDtoCurrentThread(cltID);
        }

        //Displaying the required output message
        response.setContentType(CONTENT_TYPE);
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>MessageSampleClient</title></head>");
        out.println("<body>");
        out.println("¥"" + strResultMessage + "¥" was sent by Client.");
        out.println("<BR><BR>Service is invoked.<BR>");
        out.println("<BR>Attachment's contents are : ¥n" + strResultMessageAttach + "<BR>");
        out.println("</body></html>");

    }

    public void destroy()
    {
        //Finalizing the client
        Management.finalizeClient(cltID);
    }
}

なお，これ以外の実装例については，次に示すディレクトリに格納しているサンプルプログラムを参照してください。ただし，サンプルプログラムとして提供するのは，SOAPアプリケーション開発支援機能だけです。

<Application Serverのインストールディレクトリ>/c4web/samples

7　SOAPアプリケーションの実行と運用

開発したSOAPアプリケーションは，実行環境にデプロイして，SOAPアプリケーションを開始することで利用できます。開始したSOAPアプリケーションは，Webブラウザまたはコマンドラインから利用します。

この章では，SOAPアプリケーションの実行方法と，コマンドラインからの利用方法について説明します。また，SOAPアプリケーション運用時の注意事項についても説明します。

7.1　SOAPアプリケーションの開始と停止

SOAPアプリケーションの開始または停止は，J2EEサーバ上で実行します。

サーバ管理コマンドで，SOAPアプリケーションをJ2EEサーバにデプロイしてから開始してください。サーバ管理コマンドの使用方法については，マニュアル「アプリケーションサーバ アプリケーション設定操作ガイド」を参照してください。

7.2　SOAPサービスの表示

SOAPサービスを提供しているアプリケーションは，サーバ管理コマンドを使用して一覧表示できます。

サーバ管理コマンドの使用方法については，マニュアル「アプリケーションサーバ アプリケーション設定操作ガイド」を参照してください。

7.3　コマンドラインを利用したSOAPアプリケーションの実行

RPC形態のSOAPアプリケーションでは，コマンドラインで動作するJavaアプリケーションを，SOAPアプリケーションのクライアントとして利用できます。

ここでは，コマンドラインによるクライアントSOAPアプリケーションの利用時に必要な設定，コマンドラインの指定例，および注意事項について示します。また，参考として，コマンドラインを利用する場合のクライアントの実装例を示します。

7.3.1　コマンドライン利用時の設定

コマンドラインによるクライアントSOAPアプリケーションを利用するために必要な，次の設定について説明します。

Javaアプリケーション用オプション定義ファイルの設定

Javaアプリケーション用ユーザプロパティファイルの設定

パスの追加

クライアント定義ファイルの設定

(1)　Javaアプリケーション用オプション定義ファイルの設定

Javaアプリケーション用オプション定義ファイルを，クライアントSOAPアプリケーションを実行するカレントディレクトリに作成し，次のキーと値を追加します。

Javaアプリケーション用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.cfg（Javaアプリケーション用オプション定義ファイル）を参照してください。

add.class.path=<クライアントSOAPアプリケーションのクラスファイルが格納されたJARまたはディレクトリのパス>

add.class.path=<クライアント定義ファイルが格納されたJARまたはディレクトリのパス>

add.class.path=<Application Serverのインストールディレクトリ>/c4web/lib/hitc4web.jar

add.class.path=<Application Serverのインストールディレクトリ>/c4web/lib/hitsaaj.jar

add.class.path=<Application Serverのインストールディレクトリ>/c4web/lib/hitjaxrpc.jar

add.class.path=<Application Serverのインストールディレクトリ>/c4web/lib/wsdl4j.jar

add.class.path=hntrlib2j64.jarのパス※1

add.jvm.arg=-Dcosminexus.home=<Application Serverのインストールディレクトリ>※2

add.jvm.arg=-Dejbserver.server.prf.PRFID=<PRF識別子>※3

注※1

クラスパスの指定内容を示します。

<HNTRLib2インストールディレクトリ>¥classes¥hntrlib2j64.jar

<HNTRLib2インストールディレクトリ> の部分は，次に示すコマンドの実行結果を指定します。

> "%COSMINEXUS_HOME%¥common¥bin¥gethntr2conf64.exe" HNTR2INSTDIR

Windows以外の場合：

/opt/hitachi/HNTRLib2/classes/hntrlib2j64.jar

注※2

プロパティcosminexus.homeを指定しなかった場合は，KDCCE0608-Wのメッセージが出力され，処理が続行されます。

注※3

cprfstartで指定したPRF識別子と同じものを指定します。指定しない場合のデフォルト値は，PRF_IDです。

(2)　Javaアプリケーション用ユーザプロパティファイルの設定

Javaアプリケーション用ユーザプロパティファイルを，クライアントSOAPアプリケーションを実行するカレントディレクトリに作成し，必要に応じて設定します。

Javaアプリケーション用ユーザプロパティファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.properties（Javaアプリケーション用ユーザプロパティファイル）を参照してください。

(3)　パスの追加

<Application Serverのインストールディレクトリ>/PRF/binを環境変数PATHに追加します。

(4)　クライアント定義ファイルの設定

クライアント定義ファイルでクライアントSOAPアプリケーションの動作を変更する場合，クライアント定義ファイルを格納したディレクトリ名を，クラスパスに追加します。詳細については，「7.3.1(1)　Javaアプリケーション用オプション定義ファイルの設定」を参照してください。

注意事項

クライアント定義ファイルがない場合，またはクライアント定義ファイルを格納したディレクトリ名をクラスパスに追加していない場合は，クライアント定義ファイルは読み込まれません。この場合，実行時オプションの値はすべてデフォルト値で動作します。

クライアント定義ファイルを格納したディレクトリ名を，クラスパスに複数追加した場合は，先に指定したディレクトリ下にあるクライアント定義ファイルが利用されます。

7.3.2　コマンドラインの実行

SOAPアプリケーションのクライアントを，コマンドラインから実行する場合の指定例を次に示します。次の例では，<prfid>はPRF識別子を示します。PRF識別子は，Javaアプリケーション用オプション定義ファイルに指定したPRF識別子と同じものを指定してください。異なる場合は，KDCCT0001-Eのメッセージが出力されますが，処理は続行されます。

(1)　PRFデーモンの起動

PRF識別子としてデフォルト値を使用する場合：

<Application Serverのインストールディレクトリ>/PRF/bin/cprfstart

PRF識別子としてデフォルト値以外を使用する場合：

<Application Serverのインストールディレクトリ>/PRF/bin/cprfstart <prfid>

cprfstartコマンドの詳細については，マニュアル「アプリケーションサーバ リファレンス コマンド編」を参照してください。

(2)　SOAPアプリケーションのクライアントの実行

Javaアプリケーションの開始コマンド（cjclstartap）で実行します。Javaアプリケーションの開始コマンドの詳細については，マニュアル「アプリケーションサーバ リファレンス コマンド編」を参照してください。

実行例を次に示します。

cjclstartap localhost.testMain

7.3.3　コマンドライン利用時の注意事項

(1)　トレースファイルおよびアプリケーションログの出力について

トレースファイルおよびアプリケーションログは，デフォルトでは「<カレントディレクトリ>/logs/system/ejbcl/WS」以下に出力されます。

次の条件にあてはまる場合は，トレースファイルおよびアプリケーションログが出力されません。

クライアント動作定義ファイル中の「c4web.logger.log_file_prefix」の指定によって出力パスがOSの最大長を超える

アクセス権のないパスを含む

デバイスが用意されていないパスを含む（A:¥など）

パスとして許可されない文字を含む

この場合，デフォルトトレースファイルおよびデフォルトアプリケーションログに出力されます。

デフォルトトレースファイル，およびデフォルトアプリケーションログに出力できない場合は，アプリケーションの起動に失敗します。

Windows系以外のOS上で実行する場合，umaskの設定値を"000"にしてください。"000"以外の値を設定すると，トレースファイルおよびアプリケーションログが出力されないことがあります。

コマンドライン使用時のPRFトレースを取得する場合は，SOAPアプリケーション実行前にPRFデーモンを起動しておく必要があります。PRFデーモンが起動されていない場合はエラーメッセージおよび警告メッセージが出力され，PRFトレースが取得されないまま処理が続行されます。

7.4　コネクションプーリング

コネクションプーリングとは，SOAPクライアントがSOAPサーバと通信するときに，接続された一つのコネクションを複数の通信で再利用する機能です。一度接続されたSOAPクライアントとSOAPサーバ間のコネクションをプールしておき，再度通信するときに，そのコネクションをプールから取り出して利用します。コネクション利用後は，コネクションを解放しないでプールに戻し，再度通信できる状態にします。コネクションプーリングによって，データの通信が発生するたびにコネクションの確立処理および解放処理を行わなくなるため，レスポンスタイムを短縮できます。

注意事項

Application Server 08-00およびDeveloper 08-00から，コネクションプーリングのデフォルト設定を無効（使用しない）に変更しています。コネクションプーリング機能を使用する場合，次に示す内容を十分に理解した上で使用してください。

コネクションプーリングを使用する場合，SOAPクライアント側だけでなく，接続先SOAPサービスが稼働するWebサーバや中継するネットワーク機器などの設定も見直す必要があります。また，WebサーバがTCP接続を保持したままの状態となり，Webサーバを正常停止できなくなることがあります。

Webサーバや中継するネットワーク機器などの設定を適切に変更しなかった場合，クライアント側で<状態コード>が0，<詳細>がnull，および<コンテントタイプ>がnullであるメッセージを保持するKDCCP0005-Eのエラーが発生することがあります。また，SOAPクライアントと接続先SOAPサービスの間にあるネットワーク経路などでコネクションが切断されることでも同様のエラーが発生することがあります。

7.4.1　コネクションプーリングの概要

コネクションプーリングの概要を次の図に示します。

図7‒1　コネクションプーリングの概要

コネクションプールは，接続先サーバごとに作成されます。すべてのコネクションプールは，コネクションマネージャが管理しています。

サーバAに対するコネクションプールは，サーバAと接続されたコネクションを幾つか含んでいます。同様に，サーバBおよびサーバCに対するコネクションプールも，サーバBおよびサーバCと接続されたコネクションを幾つか含んでいます。

SOAPクライアントの実行スレッドの処理で，サーバAとの通信が必要になった場合，サーバAに対するコネクションプールの中から，接続されたコネクションを取り出して通信します。

なお，コネクションプールには，最大コネクション数までコネクションを生成できます。最大コネクション数を超えないかぎり，一つのサーバに対するコネクションプールに生成できるコネクションの数は制限されません。最大コネクション数の設定値および変更については，「7.4.2　コネクションプーリングに関する設定」を参照してください。

7.4.2　コネクションプーリングに関する設定

コネクションプーリングに関する設定は，共通定義ファイルで変更できます。共通定義ファイルで変更できる項目を次に示します。なお，共通定義ファイルの詳細については，「10.4　共通定義ファイルの設定」を参照してください。

なお，コネクションプールを使用する場合，「7.4　コネクションプーリング」に記載された注意事項を十分に理解した上で使用してください。

(1)　コネクションプーリングの有効化

コネクションプーリングはデフォルトで無効に設定されています。コネクションプーリングを有効にするには，共通定義ファイルに「c4web.common.connection_pool.enable=true」を追加し，J2EEサーバを停止・再起動してください。

なお，SSL通信の場合，「c4web.common.connection_pool.enable=true」を追加しても，コネクションプーリングは使用できません。

(2)　コネクションの利用回数

コネクションを再利用できる最大数を変更できます。コネクションを再利用した回数がこの値を超えると，コネクションは切断および破棄されます。共通定義ファイルの「c4web.common.connection_pool.max_use」で変更します。デフォルトは，10,000（回）です。0を指定すると，利用回数によるコネクションの切断および破棄は行われません。

(3)　コネクションのタイムアウト

コネクションを最後に利用してから，コネクションのタイムアウトが発生するまでの時間を変更できます。コネクションのタイムアウトが発生すると，そのコネクションは切断および破棄されます。共通定義ファイルの「c4web.common.connection_pool.timeout」で変更します。デフォルトは，1,800（秒）です。0を指定すると，タイムアウトによるコネクションの切断および破棄は行われません。

コネクションのタイムアウトは，SOAPクライアント側では，共通定義ファイルの「c4web.common.connection_pool.timeout」で設定でき，Webサーバ側では，Webサーバ固有の設定方法で設定できます。SOAPクライアントとWebサーバの両方でタイムアウトが発生した場合は，コネクションは切断および破棄されます。そのため，Webサーバ側のコネクションタイムアウトの時間は，共通定義ファイルの「c4web.common.connection_pool.timeout」で設定した時間の倍以上を設定し，Webサーバ側のタイムアウトによってコネクションが切断されることのないようにしてください。例えば，共通定義ファイルの「c4web.common.connection_pool.timeout」の設定が1,800（秒）の場合は，Webサーバ側のコネクションタイムアウトの設定を3,600（秒）以上に設定してください。

(4)　最大コネクション数

各コネクションプールに生成できるコネクションの合計値である最大コネクション数を変更できます。例えば，コネクションプールA，B，Cがあり，最大コネクション数に10（本）を設定した場合，コネクションプールA，B，Cの三つに生成できるコネクション数の合計が10（本）になります。共通定義ファイルの「c4web.common.connection_pool.max_connection」で変更します。デフォルトは，150（本）です。

7.4.3　コネクションが維持された状態でのHTTP Serverの終了方法

コネクションプーリングによってコネクションが維持された状態で，HTTP Serverの終了処理を実行すると，HTTP Serverは，維持されたコネクションが解放されるまで最大30秒待機します。そのため，WebサーバにHTTP Serverを利用している場合は，HTTP Serverの終了処理を実行しても，すぐに終了しないことがあります。このような場合に，HTTP Serverをすぐに終了させる方法を次に示します。

(1)　コマンドで終了させる方法

コマンドで終了させる方法を次に示します。

HTTP ServerのHWSGracefulStopTimeoutディレクティブに，HTTP Serverが終了するまでの最大待ち時間を設定します。

gracefulstopオプションを指定して，次のコマンドを実行します。

httpsd.exe -k gracefulstop

gracefulstopオプションを指定してコマンドを実行すると，最大でHWSGracefulStopディレクティブに設定した時間だけ待機して，HTTP Serverが終了します。HWSGracefulStopディレクティブに小さい値を設定することで，コネクションプーリングによってコネクションが維持された状態でも，すぐにHTTP Serverが終了します。

(2)　Management Serverから終了させる方法

Management Serverから終了させる方法を次に示します。

運用管理ポータルで［論理サーバの起動/停止］アンカーをクリックします。

［サーバビュー］タブの［論理Webサーバ］−［Webサーバ］−［<Webサーバ名>］をクリックします。

［起動/停止］タブをクリックします。

［強制停止］ボタンをクリックします。

7.4.4　コネクションの再利用条件

コネクションの再利用の可否は，SOAPクライアントとSOAPサーバが通信したときの状態によって異なります。

コネクションを再利用できる条件（コネクションを解放しない）

クライアントからのリクエストに含まれるHTTPバージョン，およびサーバからのレスポンスに含まれるHTTPバージョンが1.1の場合に，次のどちらかの状態のとき

ConnectionヘッダがKeep-Aliveである

Connectionヘッダが存在しない

コネクションを再利用できない条件（コネクションを解放する）

次のどれかの状態のとき

サーバからのレスポンスに含まれるHTTPバージョンが1.1で，Connectionヘッダがcloseとなっている場合

サーバからのレスポンスに含まれるHTTPバージョンが1.0の場合

SSL通信（リクエストURLに"https"を使用）の場合

サーバからコネクションを切断された場合※1

ソケット通信で例外が発生した場合※2

HTTP 1.1仕様に従っていないChunkフォーマットがレスポンスデータに含まれている場合※2

レスポンスデータが"HTTP"で開始されていない場合※2

注※1

切断されたコネクションは破棄されたあと再作成されます。再作成されたコネクションを利用して，サーバに再接続します。

注※2

ユーザプログラムにはC4Faultが返されます。

7.5　SOAPアプリケーション運用時の注意事項

SOAPアプリケーション運用時の注意事項について説明します。

7.5.1　他社製品と接続する場合の多重配列送受信形式の確認

SOAP通信基盤では，多重配列のデータ型を通信する場合，次に示すようなSOAPメッセージが送受信されます。他社製品と接続する場合は，この形式が扱えるかどうかを確認して，多重配列のデータ型を送受信してください。他社製品と通信できない場合があります。

<in xsi:type="soapenc:Array" soapenc:arrayType="ns1:UserData[][2]"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <item xsi:type="soapenc:Array"
       soapenc:arrayType="ns1:UserData[3]">
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key00</Key>
   <Value xsi:type="xsd:string">value00</Value>
  </item>
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key01</Key>
   <Value xsi:type="xsd:string">value01</Value>
  </item>
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key02</Key>
   <Value xsi:type="xsd:string">value02</Value>
  </item>
 </item>
 <item xsi:type="soapenc:Array"
       soapenc:arrayType="ns1:UserData[3]">
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key10</Key>
   <Value xsi:type="xsd:string">value10</Value>
  </item>
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key11</Key>
   <Value xsi:type="xsd:string">value11</Value>
  </item>
  <item xsi:type="ns1:UserData">
   <Key xsi:type="xsd:string">key12</Key>
   <Value xsi:type="xsd:string">value12</Value>
  </item>
 </item>
</in>

7.5.2　SOAP Faultに関する注意事項

(1)　faultactor要素について

SOAPサービスから返されるFaultメッセージには，faultactor要素は含まれません。ただし，ユーザ実装でfault生成者を指定したC4Fault例外をスローした場合は除きます。

(2)　detail要素について

SOAPヘッダ要素に関係するエラーによって，SOAPサービスからFaultメッセージが返される場合，返されるFaultメッセージは<detail/>を含む場合があります。また，SOAPボディ要素に関係するエラーによって，SOAPサービスからFaultメッセージが返される場合，ユーザ実装でFault詳細を指定したC4Fault例外をスローした場合を除いて，返されるFaultメッセージにdetail要素は含まれません。

(3)　faultcode要素について

SOAPでは，Client，Server，VersionMismatch，MustUnderstandの四つのfaultcodeを定めていますが，SOAP通信基盤ではVersionMismatch，MustUnderstandだけ使用します。Client，Serverに代わるfaultcodeとして，SOAP通信基盤独自の名前空間（http://c4web.cosminexus.com）を持つClient，Serverを使用します。また，これらSOAP通信基盤独自のfaultcodeは，ドット表記による詳細コードを持つものがあります。

7.5.3　不正リクエストメッセージ受信時の動作について

リクエストのメッセージがHTTPリクエストとして正しい形式ではない，またはXMLが整形式（well-formed）ではないメッセージを受信した場合，HTTP状態コードとして"400 Bad Request"を返します。その時，faultメッセージも送信しますので，他社製品と接続するときは注意してください。他社製品と通信できない場合があります。

7.5.4　エラーページ委任機能を使用する場合の注意事項

SOAPサービスが動作する環境（URL）でApplication Serverが提供するエラーページの委任機能を使用する場合，SOAPサービスが動作するURLに対しては，エラーコード500のエラーページ委任機能を設定しないようにしてください。

SOAPでは，SOAPサービスでエラーが発生した場合に，SOAP Fault電文を作成し，エラーコード500でSOAPクライアントに返信します。そのため，エラーページ委任機能で，エラーコード500を委任すると，プロトコル違反となり，SOAPクライアント側に不正な電文が送信されることになります。

なお，プロトコル違反のSOAP Fault電文をSOAPクライアントが受け付けた場合の動作については，SOAPクライアント開発元に確認してください。エラーページ委任機能については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

7.5.5　サーブレットのデフォルトマッピングについて

SOAPクライアント，およびSOAPサービスを，Application Serverが提供するデフォルトマッピングで呼び出さないでください。SOAPエンジン，またはSOAPクライアントライブラリが予期しない動作をするおそれがあります。サーブレットのデフォルトマッピングについては，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)」を参照してください。

7.5.6　リロード機能について

SOAPアプリケーションをApplication Serverが提供するリロード機能で入れ替えないでください。正しくアプリケーションが入れ替わらない場合があります。リロード機能については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」を参照してください。

7.5.7　異常発生時のアプリケーションログ出力機能について

SOAP通信基盤では，SOAP FaultやC4Fault例外が発生した場合など，異常を検出した場合にアプリケーションログを出力する機能を動作定義オプションで指定できます。障害発生時のトラブルシュート機能を強化するため，SOAP通信基盤の動作定義オプションを使用することを強く推奨します。なお，動作定義ファイルの設定方法については，「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照してください。

7.5.8　DD（web.xml）ファイルの記述内容について

SOAPアプリケーションの開発時に作成するDD（web.xml）ファイルの記述については，「3.9.2　DD（web.xml）の記述」を参照してください。

7.5.9　旧バージョンの環境の移行について

旧バージョンの環境で開発したSOAPアプリケーションを利用する場合，移行手順に従い，SOAPアプリケーションを移行する必要があります。移行手順については，「付録A　SOAPアプリケーションの移行」を参照してください。

7.5.10　受信時サイズチェック機能について

受信したマルチパートメッセージの最初にSOAPEnvelopeが含まれない場合，SOAPEnvelopeより前に位置する添付データに対して，受信時サイズチェック機能が機能しません。

7.5.11　SOAPメッセージのエンコードに関する注意

UTF-16でエンコードしたSOAPメッセージを受信した場合，予期しないエラーまたは例外が発生することがあります。UTF-16ではなく，UTF-8を使用するようにしてください。

8　UDDIクライアントの開発と実行

UDDIクライアントは，UDDIクライアントライブラリを使用して開発します。

この章では，UDDIクライアントライブラリを使用したUDDIクライアントの開発手順について説明します。また，実行時の環境設定，および実行手順についても説明します。

8.1　UDDIクライアントライブラリとは

UDDIクライアントライブラリとは，UDDIレジストリにアクセスするための機能を提供するためのライブラリです。UDDIクライアントライブラリが提供するAPIを使用して，UDDIレジストリにアクセスするUDDIクライアントを開発できます。

UDDIクライアントライブラリは，JAXR 1.0（Capability Profile Level 0）に準拠したJavaの標準APIをサポートしています。JAXR 1.0のサポート範囲については，「12.4　JAXR 1.0との対応」を参照してください。

8.2　UDDIクライアントの開発手順

8.2.1　開発手順の詳細

ソースファイルを作成してから，UDDIクライアントとして実行するまでの流れを説明します。

(1)　ソースファイルの作成

UDDIクライアントライブラリを使用して，ソースファイルを作成する一般的な手順を説明します（[ ]内は使用するメソッドを示します）。

注意事項

UDDIクライアントはSOAPクライアントとして動作するため，SOAPクライアントの開始，終了時にSOAP通信基盤が提供するManagementクラスの各メソッドを呼び出す必要があります。Managementクラスに関しては「13.10　Managementクラス（クライアントの開始，終了）」を参照してください。

ConnectionFactoryオブジェクトを作成します。[ConnectionFactory#newInstance( )]

ConnectionFactoryに接続する次のプロパティを設定します。[ConnectionFactory#setProperties( )]

javax.xml.registry.queryManagerURL

javax.xml.registry.lifeCycleManagerURL

ConnectionFactoryオブジェクトからConnectionオブジェクトを入手します。[ConnectionFactory#createConnection( )]

接続モードを同期または非同期に設定します。[Connection#setSynchronous( )]

認証が必要な操作をする場合は認証情報を設定します。[Connection#setCredentials( )]

ConnectionオブジェクトからRegistryServiceオブジェクトを入手します。[Connection#getRegistryService( )]

RegistryServiceオブジェクトからBusinessQueryManagerまたはBusinessLifeCycleManagerオブジェクトを入手します。[RegistryService#getBusinessQueryManager( )]または[RegistryService#getBusinessLifeCycleManager( )]

操作に関する処理を実装します。

検索（find）および取得（get）をする場合

BusinessQueryManagerオブジェクトのfind系およびget系メソッドを呼び出します。

登録（save）および削除（delete）をする場合

BusinessLifeCycleManagerオブジェクトのsave系およびdelete系メソッドを呼び出します。登録の場合には，save系メソッドのパラメタに渡すオブジェクトをBusinessLifeCycleManagerオブジェクトのcreate系メソッドで作成します。

各操作を行うAPIからBulkResponseオブジェクトを取得します。APIが正常に実行された場合は，結果のCollectionオブジェクトを取得します。[BulkResponse#getCollection( )]

APIが正常に実行できたかどうかは，getStatusメソッドで確認します。

(2)　ソースファイルのコンパイル

クラスパスに次のJARファイルを追加し，作成したソースファイルをコンパイルします。

<Application Serverのインストールフォルダ>/c4web/lib/hitjaxr.jar

<Application Serverのインストールフォルダ>/c4web/lib/hitc4web.jar

(3)　UDDIクライアントの実行

環境設定を行い，UDDIクライアントを実行します。環境設定とプログラムの実行については以降で説明します。

8.3　UDDIクライアント実行時の環境設定

8.3.1　環境設定の詳細

UDDIクライアントを実行するには，事前に環境設定が必要になります。ここでは，設定が必要なJARファイルや接続プロパティについて説明します。また，UDDIクライアント実行時のトレースプロパティの設定や，動作定義ファイルの設定についても説明します。

(1)　クラスパスに追加するJARファイル

UDDIクライアントを実行する場合に，クラスパスに追加するJARファイルを示します。追加する方法については，「8.4　UDDIクライアントの実行」を参照してください。

<Application Serverのインストールフォルダ>/c4web/lib/hitjaxr.jar

<Application Serverのインストールフォルダ>/c4web/lib/hitc4web.jar

<Application Serverのインストールフォルダ>/c4web/lib/hitsaaj.jar

<Application Serverのインストールフォルダ>/c4web/lib/hitjaxrpc.jar

<Application Serverのインストールフォルダ>/c4web/lib/wsdl4j.jar

hntrlib2j.jarのパス※

注※

クラスパスの指定内容を示します。

<HNTRLib2インストールディレクトリ>¥classes¥hntrlib2j64.jar

<HNTRLib2インストールディレクトリ> の部分は，次に示すコマンドの実行結果を指定します。

> "%COSMINEXUS_HOME%¥common¥bin¥gethntr2conf64.exe" HNTR2INSTDIR

Windows以外の場合：

/opt/hitachi/HNTRLib2/classes/hntrlib2j64.jar

また，必要に応じて次のシステムプロパティを追加する必要があります。

接続プロパティ

トレースプロパティ

具体的な追加方法については，「8.4　UDDIクライアントの実行」を参照してください。

(2)　接続プロパティの設定

レジストリへの接続に関するプロパティをシステムプロパティで指定できます。

接続プロパティはJAXR APIのConnectionFactory#setProperties(Properties)メソッドを使用して，UDDIクライアントのプログラム内から動的に変更することもできます。この場合，setPropertiesメソッドで設定される値がシステムプロパティで指定した値よりも優先されます。

次に接続プロパティに関するシステムプロパティの一覧を示します。

表8‒1　接続プロパティ一覧

プロパティ名称

指定値

デフォルト値

javax.xml.registry.queryManagerURL

アクセスする先のUDDIレジストリサーバの問い合わせURLを指定します。URL形式として正しく指定する必要があります。

このプロパティは必ず指定してください。

−

javax.xml.registry.lifeCycleManagerURL

アクセスする先のUDDIレジストリサーバの発行URLを指定します。URL形式として正しく指定する必要があります。

このプロパティを指定しない場合，queryManagerURLプロパティの値が使用されます。

−

javax.xml.registry.semanticEquivalences

同じ意味を持つConceptのIDの組を次の形式で指定します。

<id1>,<id2>|<id3>,<id4>|…

ここで，<id1>と<id2>および<id3>と<id4>が同じ意味を持つIDの組です。主にUDDIにユーザ定義の郵便住所体系を持つ場合に使用します。

−

javax.xml.registry.postalAddressScheme

郵便住所体系を示すClassificationSchemeオブジェクトのIDを指定します。

−

javax.xml.registry.security.authenticationMethod

レジストリサーバとの認証で使用する認証方法を指定します。

"UDDI_GET_AUTHTOKEN"は固定です。これ以外の認証方法はサポートされません。

"UDDI_GET_AUTHTOKEN"

javax.xml.registry.uddi.maxRows

UDDI APIのfind操作で返却される最大エントリ数を0以上の整数値で指定します。

指定しない場合，最大エントリ数はレジストリサーバのデフォルト値に従います。※

−

（凡例）

−：デフォルト値がないことを示します。

注※

このプロパティはUDDI APIのmaxRows属性を指定するプロパティです。したがって，JAXRのfind系APIの最大取得件数を指定する値ではありません。特にfindConceptsやfindClassificationSchemesメソッドでは指定したエントリ数より少なくなる場合があります。

(3)　トレースプロパティの設定

トレース出力に関するプロパティをシステムプロパティに設定できます。

注意事項

トレースプロパティが設定されない場合や，指定した値が有効でない場合には，トレースファイルに警告メッセージが記録され，そのプロパティのデフォルト値で処理が続行されます。

次にトレースプロパティに関するシステムプロパティの一覧を示します。

表8‒2　トレースプロパティ一覧

プロパティ名称

指定値

デフォルト値

com.cosminexus.xml.registry.trace.trace_level

トレースレベルをERROR，WARN，INFO，DEBUGのどれかを指定します。トレースレベルについては「14.4.3　トレースファイル出力の重要度」を参照してください。

WARN

com.cosminexus.xml.registry.trace.file_path

トレースメッセージを記録するため作成されるログファイルのパスと名前を文字列で指定します。

<Application Serverのインストールフォルダ>/c4web/logs/

JAXRAPITrace

com.cosminexus.xml.registry.trace.file_num

トレースファイルの面数を1〜16の数値で指定します。

2

com.cosminexus.xml.registry.trace.file_size

一つのトレースファイルの最大サイズをバイト単位で指定します。4,096〜2,147,483,647の数値を設定します。

2,097,152

(4)　 SOAPアプリケーションの動作定義ファイルの設定

UDDIクライアントはSOAPクライアントとして動作するため，必要に応じてSOAPアプリケーションのクライアント定義ファイル，共通定義ファイルを設定します。

特に，HTTPプロキシサーバ経由でレジストリサーバにアクセスする場合，クライアント定義ファイルに次のキーを設定する必要があります。

c4web.application.proxy_host

c4web.application.non_proxy_hosts

c4web.application.proxy_port

c4web.application.proxy_user

c4web.application.proxy_password

SOAPアプリケーションの動作定義ファイルの設定については，「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照してください。

8.4　UDDIクライアントの実行

8.4.1　実行手順の詳細

UDDIクライアントライブラリを使用するには，J2EEサーバ上で実行する場合と，コマンドラインから実行する場合があります。次に，各場合でのプログラムの実行手順を説明します。

ここではUDDIクライアントライブラリに関係のある手順だけを説明します。そのほかの詳細については，次のマニュアルを参照してください。

アプリケーションサーバ システム構築・運用ガイド

アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)

アプリケーションサーバ 機能解説 基本・開発編(EJBコンテナ)

(1)　J2EEサーバ上で実行する場合

J2EEサーバ上で動作するサーブレット，JSP，EJBなどのコンポーネントからUDDIクライアントライブラリを使用する場合は，次の手順で実行します。

システムプロパティの設定

usrconf.propertiesファイルにシステムプロパティを設定します。

（例）com.cosminexus.xml.registry.trace.trace_level=INFO

実行

J2EEサーバに，サーブレット，JSP，EJBなどを配置し，サーバを実行します。

(2)　コマンドラインから実行する

コマンドラインから実行するプログラムからUDDIクライアントライブラリを使用する場合，次の手順で実行します。

クラスパスを設定します。

「8.3　UDDIクライアント実行時の環境設定」でクラスパスに追加するすべてのJARファイルを，コンテナ拡張ライブラリ用のJARとして，Javaアプリケーション用オプション定義ファイルのadd.class.pathキーに設定し，追加します。

Javaアプリケーション用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.cfg（Javaアプリケーション用オプション定義ファイル）を参照してください。

環境変数PATHを設定します。

<Application Serverのインストールフォルダ>/PRF/binを環境変数PATHに設定します。

PRFトレースに関するプロパティを設定します。

PRFトレース使用時は，PRFトレースに関するプロパティの指定をする必要があります。次のプロパティを，JavaVMを起動するオプションとして，Javaアプリケーション用オプション定義ファイルのadd.jvm.argキーに設定し，追加します。

プロパティ名称：ejbserver.server.prf.PRFID

値：cprfstartコマンドで指定したPRF識別子

デフォルト値：PRF_ID

なお，PRFデーモンを起動しないでプログラムを実行した場合，KDCCT0001-EおよびKDCCT0004-Wのメッセージが出力されますが，プログラムの動作に影響はありません。

Javaアプリケーション用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.cfg（Javaアプリケーション用オプション定義ファイル）を参照してください。

接続プロパティおよびトレースプロパティを設定します。

「8.3　UDDIクライアント実行時の環境設定」に示したシステムプロパティを，JavaVMを起動するオプションとして，必要に応じてJavaアプリケーション用オプション定義ファイルのadd.jvm.argキーに設定し，追加します。

Javaアプリケーション用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.cfg（Javaアプリケーション用オプション定義ファイル）を参照してください。

Application Serverのインストールディレクトリをプロパティに設定します。

次のプロパティを，JavaVMを起動するオプションとして，Javaアプリケーション用オプション定義ファイルのadd.jvm.argキーに設定し，追加します。

プロパティ名称：cosminexus.home

値：Application Serverのインストールディレクトリ

デフォルト値：なし

Javaアプリケーション用オプション定義ファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.cfg（Javaアプリケーション用オプション定義ファイル）を参照してください。

Javaアプリケーション用ユーザプロパティファイルを設定します。

Javaアプリケーション用ユーザプロパティファイルを，クライアントSOAPアプリケーションを実行するカレントディレクトリに作成し，必要に応じて設定します。

Javaアプリケーション用ユーザプロパティファイルの詳細については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」のusrconf.properties（Javaアプリケーション用ユーザプロパティファイル）を参照してください。

Javaアプリケーションの開始コマンド（cjclstartap）を実行します。

Javaアプリケーションの開始コマンドの詳細については，マニュアル「アプリケーションサーバ リファレンス コマンド編」を参照してください。

実行例を次に示します。

cjclstartap SampleClass

8.5　UDDIインタフェースおよびクラス

UDDIクライアントライブラリが提供するJAXR APIのパッケージ，およびJAXR APIの一覧を示します。

8.5.1　JAXRのパッケージ

JAXR APIは，主に次の二つのパッケージから成り立ちます。

レジストリ

このパッケージは，レジストリの情報内容について接続，問い合わせ，保存，更新，削除を行うためのクラスとインタフェースを含みます。パッケージ名称は，javax.xml.registryです。

インフォモデル

このパッケージは，リポジトリ内容のためのメタデータを記述して表現する，JAXR APIのためのデータモデルを含みます。パッケージ名称は，javax.xml.registry.infomodelです。

8.5.2　JAXR APIの一覧

JAXR APIが提供するインタフェースとクラスの一覧を次に示します。

表8‒3　インタフェース／クラス一覧

種類

インタフェース／クラス名

説明

レジストリ

BulkResponse

APIの実行結果（複数）を格納します。

BusinessLifeCycleManager

ライフサイクル管理の上位APIを提供します。

BusinessQueryManager

問い合わせ管理の上位APIを提供します。

CapabilityProfile

JAXR実装の機能範囲に関する情報を提供します。

Connection

JAXR実装と接続します。

ConnectionFactory

JAXRの接続に関するファクトリを提供します。

DeclarativeQueryManager

SQLなどの明示的な形式で問い合わせます。

FederatedConnection

複数のレジストリを単一の接続情報で扱います。

FindQualifier

検索条件を示す定数を提供します。

JAXRResponse

APIの実行結果を格納するベースインタフェースです。

LifeCycleManager

ライフサイクル管理のベースAPIを提供します。

Query

明示的な形式の問い合わせ（SQLなど）を管理します。

QueryManager

問い合わせ管理のベースAPIを提供します。

RegistryService

レジストリアクセスの基本となるインタフェースです。

インフォモデル

Association

UDDIのpublisherAssertionに相当します。

AuditableEvent

履歴を表します。UDDIでは使用しません。

Classification

UDDIのcategoryBag/keyedReferenceに相当します。

ClassificationScheme

UDDIのtModelのうち分類を表現するものに相当します。

Concept

UDDIのtModelのうち識別を表現するものに相当します。

EmailAddress

UDDIのcontact/emailに相当します。

ExtensibleObject

属性の拡張ができるオブジェクトのベースインタフェースです。

ExternalIdentifier

UDDIのidentifierBag/keyedReferenceに相当します。

ExternalLink

UDDIのdiscoveryURL, overviewDocに相当します。

ExtrinsicObject

レジストリ外で管理するデータです。UDDIでは使用しません。

InternationalString

複数のロケール情報付き文字列（LocalizedString）の集合です。

Key

RegistryObjectを一意に識別するキーです。

LocalizedString

ロケール情報付きの文字列です。

Organization

UDDIのbusinessEntityに相当します。

PersonName

UDDIのcontact/personNameに相当します。

PostalAddress

UDDIのcontact/addressに相当します。

RegistryEntry

オブジェクトの状態や期限を表します。UDDIでは使用しません。

RegistryObject

レジストリのオブジェクトを表すベースインタフェースです。

RegistryPackage

RegistryEntryの集合です。UDDIでは使用しません。

Service

UDDIのbusinessServiceに相当します。

ServiceBinding

UDDIのbindingTemplateに相当します。

Slot

任意の属性を表現します。

SpecificationLink

技術仕様に対するリンクです。UDDIのtModelInstanceInfoやinstanceDetailに相当します。

TelephoneNumber

UDDIのcontact/phoneに相当します。

URIValidator

URIの検証を行うベースインタフェースです。

User

UDDIのcontactに相当します。

Versionable

バージョンを表します。UDDIでは使用しません。

例外

DeleteException

削除操作に関する例外です。

FindException

検索操作に関する例外です。

InvalidRequestException

不正なAPIメソッドを実行した場合の例外です。

JAXRException

すべての例外の基本クラスです。

RegistryException

レジストリ側で検出される例外です。

SaveException

保存操作に関する例外です。

UnexpectedObjectException

不正な型のオブジェクトが指定された場合の例外です。

UnsupportedCapabilityException

JAXR実装がサポートしていないレベルのメソッドが発行された場合の例外です。

8.6　UDDIクライアント開発，実行時の注意事項

8.6.1　APIリファレンスについて

SOAP通信基盤は，レジストリアクセスのAPIであるJAXR1.0に準拠しています。APIの使用方法は，http://java.sun.com/j2ee/1.4/docs/api/index.htmlを参照してください。JAXR1.0に対応したパッケージ名を次に示します。

javax.xml.registry

javax.xml.registry.infomodel

8.6.2　Associationでbooleanを返すメソッドについて

Associationインタフェースで，次に示すbooleanを返すメソッドに対する正しい値を必要とする場合は，BusinessQueryManager#findCallerAssociationsメソッド，またはBusinessQueryManager#findAssociationsメソッドを発行してください。

LifeCycleManager#createAssociationメソッドから生成されたAssociationのインスタンスに対して次のメソッドを呼び出すと，一部のUDDIレジストリ環境では正しい結果が取得できない場合があります。

boolean isConfirmed()

boolean isConfirmedBySourceOwner()

boolean isConfirmedByTargetOwner()

boolean isExtramural()

8.6.3　findCallerAssociationsメソッドのfindQualifiersパラメタについて

BusinessQueryManager#findCallerAssociationsメソッドの第一パラメタであるfindQualifiersの値は使用されません。値を指定した場合の動作は，値を指定していない場合の動作と同様になります。

8.6.4　findServiceBindingsメソッドのclassificationsパラメタについて

BusinessQueryManager#findServiceBindingsメソッドの第三パラメタであるclassificationsの値は使用されません。値を指定した場合の動作は，値を指定していない場合の動作と同様になります。

8.6.5　Collectionを返すメソッドについて

次に示すインタフェース，またはインタフェースを継承するインタフェースでのCollectionのインスタンスを返すメソッドについては，Collectionの要素はコピーされません。そのため，要素自体の内容を変更しないようにしてください。

javax.xml.registry.BulkResponse

javax.xml.registry.infomodel.ClassificationScheme

javax.xml.registry.infomodel.Concept

javax.xml.registry.infomodel.ExtensibleObject

javax.xml.registry.infomodel.ExternalLink

javax.xml.registry.infomodel.InternationalString

javax.xml.registry.infomodel.Organization

javax.xml.registry.infomodel.RegistryObject

javax.xml.registry.infomodel.Service

javax.xml.registry.infomodel.ServiceBinding

javax.xml.registry.infomodel.Slot

javax.xml.registry.infomodel.SpecificationLink

javax.xml.registry.infomodel.User

Collectionの要素自体を変更した場合，Collectionを取得したインスタンスの状態も変更されるため，そのインスタンスの，ほかのメソッドの動作が不正になるおそれがあります。

8.6.6　SOAPアプリケーションを運用する場合の注意

UDDIクライアントライブラリを利用して運用する場合，固有の注意事項はありません。共通の注意事項を参照してください。共通の注意事項については，「7.5　SOAPアプリケーション運用時の注意事項」を参照してください。

第3編　リファレンス

9　開発支援コマンド

SOAPアプリケーション開発支援機能では，Java2WSDLコマンド（WSDLの生成），WSDL2Javaコマンド（ソースコードの生成），およびJava2WSDDコマンド（サービスデプロイ定義の生成）という3種類の開発支援コマンドを提供しています。

この章では，開発支援コマンドの使用方法および注意事項について説明します。

9.1　Java2WSDLコマンド（WSDLの生成）

WSDLの生成は次のコマンドを使用します。

形式

Java2WSDL.bat -l <サービスロケーション> ［その他のオプション群］<対象となるクラス名>

必須の-lオプションおよび任意に指定するオプションの一覧を示します。

表9‒1　Java2WSDLコマンドの-lオプション（必須）

オプション

意味

-l

サービスロケーションを指定します（service要素のaddress location属性）。サービスロケーションの指定方法については，「3.3.1　サービスロケーションの指定」を参照してください。

表9‒2　Java2WSDLコマンドのオプション一覧（任意）

オプション

意味

-h

ヘルプが表示されます。

-o

WSDLの出力先ファイル名を指定します。

省略時："servicePort名.wsdl"の名称でカレントディレクトリに生成されます。

-P

portType名を指定します（portType要素のname属性）。

省略時：指定クラス名が設定されます。

-b

binding名を指定します（binding要素のname属性）。

省略時："servicePort名"＋"SOAPBinding"が設定されます。

-S

serviceElement名を指定します（service要素のname属性）。

省略時："portType名"＋"Service"が設定されます。

-s

servicePort名を指定します（service要素内のport要素のname属性）。

省略時：サービス名（サービスロケーションの最終ノード名）が設定されます。

-n

targetNamespaceを指定します。

省略時：クラスのパッケージ名から生成されます。

クラスにパッケージ名の指定がない場合は，"http://DefaultNamespace"が設定されます。

-p

パッケージ名と名前空間の関係をpackage=namespaceの形式で指定します（名前空間の変更）。

-m

対象となるメソッドを空白またはコンマ（,）区切りで指定します。

省略時：すべてのメソッドが対象になります。

-w

WSDLの生成モードをAll，Interface，Implementationのどれかで指定します。

省略時：Allが設定されます。

-x

非対象メソッドを空白またはコンマ（,）区切りで指定します。

省略時：非対象メソッドは設定されません。

-T

TypeMappingVersionを1.1または1.2で指定します。

typeMappingVersion値によって，Javaクラスから生成されるWSDL内のデータ型が異なります。詳細は次の表を参照してください。

省略時：1.1が設定されます。

-A

soapActionの値を指定します。DEFAULTを指定した場合は""を設定します。NONEを指定した場合，soapActionは生成されません。

省略時：DEFAULTが設定されます。

-z

WSDLのバインディングスタイルをRPCまたはDOCUMENTで指定します。大文字／小文字は区別されません。

省略時：RPCを設定します。

DOCUMENTを指定した場合は，wrapped形式※のWSDLが生成されます。

-u

use属性をLITERALまたはENCODEDで指定します。大文字／小文字は区別されません。

省略時：LITERALが設定されます。

注※

wrapped形式については，「3.3.3(3)　DOCUMENT／LITERALを指定した場合」を参照してください。

表9‒3　typeMappingVersion値とデータ型の関係

クラス名

WSDL内のデータ型

1.1指定時

1.2指定時

データ型

名前空間名

データ型

名前空間名

java.lang.String

string

xsd

string

soapenc

java.lang.Boolean

boolean

xsd

boolean

soapenc

java.lang.Double

double

xsd

double

soapenc

java.lang.Float

float

xsd

float

soapenc

java.lang.Integer

int

xsd

int

soapenc

java.math.BigInteger

integer

xsd

integer

soapenc

java.math.BigDecimal

decimal

xsd

decimal

soapenc

java.lang.Long

long

xsd

long

soapenc

java.lang.Short

short

xsd

short

soapenc

java.lang.Byte

byte

xsd

byte

soapenc

byte[]

base64Binary

xsd

base64

soapenc

（凡例）

xsdは名前空間URIが"http://www.w3.org/2001/XMLSchema"であることを示します。

soapencは名前空間URIが"http://schemas.xmlsoap.org/soap/encoding/"であることを示します。

終了コード

0：正常終了

1：異常または警告終了

メッセージ

メッセージの詳細については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」の開発支援コマンドによって出力されるメッセージの記述を参照してください。

注意事項

対象となるメソッドの引数または戻り値に，ユーザ定義のデータ型クラスを含む場合，WSDL内でユーザ定義のデータ型クラスを表す型が定義されますが，このときの要素の並び順は，ユーザ定義のデータ型クラス内でのフィールドの順序に関係なく，アルファベット順となります。

-zオプションでDOCUMENT，-uオプションでENCODEDの組み合わせは指定できません。

Java2WSDLコマンドを実行してJavaインタフェースからWSDLを生成する場合，Javaインタフェースのメソッドのパラメタ名は，WSDLに「inXX」（XXは整数）の名称でマッピングされます。生成例については，「3.3.9(2)　Javaインタフェースのメソッドのパラメタ名と生成されるWSDLの対応」を参照してください。

Java2WSDLコマンドを実行する場合，指定するJavaインタフェースへのクラスパスを環境変数CLASSPATHに設定してください。CLASSPATHの設定がない場合，Java2WSDLコマンドは，カレントディレクトリをクラスパスに設定し，指定されたJavaインタフェースを検索します。

9.2　WSDL2Javaコマンド（ソースコードの生成）

WSDLからのソースコード生成は次のコマンドを使用します。

形式

WSDL2Java.bat -C validS ［その他のオプション群］ <対象となるWSDLファイル名>

必須の-Cオプションおよび任意に指定するオプションの一覧を示します。

表9‒4　WSDL2Javaコマンドの-Cオプション（必須）

オプション

意味

-C

WSDLを検証するかどうかを指定します。検証モードにvalidS，validOnlySのどちらかを指定します。validSを指定した場合，指定したWSDLの検証が行われ，Javaソースコードが生成されます。validOnlySを指定した場合，WSDLの検証だけが行われます。WSDLを検証した結果，WSDLに不正がある場合はエラーとなります。

省略時：WSDLは検証されません。

-Cオプションの指定について

-Cオプション（WSDL検証機能）の指定は必須です。このオプションは入力されたWSDL内で，サポートされていない要素を使用していないかどうかを検証する機能です。

このオプションを指定しなかった場合，入力されたWSDL内でサポートされていない要素を使用していても，WSDL2Javaコマンドが正常に終了することがあります。

表9‒5　WSDL2Javaコマンドのオプション一覧（任意）

オプション

意味

-h

ヘルプが表示されます。

-v

生成過程が画面に表示されます。

-O

タイムアウト値を秒で指定します。

省略時：45が設定されます。

-s

スケルトン（サーバ側に必要なソースコード）とサービスデプロイ定義が生成されます。

省略時：スタブ（クライアント側に必要なソースコード）が生成されます。

-N

名前空間とパッケージ名の関係をnamespace=packageの形式で指定します（パッケージ名）。

省略時：パッケージ名は変更されません。

-f

ファイル指定で名前空間とパッケージ名の関係を指定します。

省略時：パッケージ名は変更されません。

-p

すべてのクラスのパッケージ名を変更します。

省略時：パッケージ名は変更されません。

-o

ソース出力先ディレクトリを指定します。

省略時：カレントディレクトリが設定されます。

-d

deployScopeをApplication，Request，Sessionのどれかで指定します。

省略時：Requestが設定されます。

-a

メソッドのパラメタや，パラメタのクラスで参照されないユーザ定義のデータ型についても，ソースコードが生成されます。

省略時：参照されないユーザ定義のデータ型については，ソースコードは生成されません。

-L

入力されたWSDLの記述内容に対するチェック機能を緩和します。

省略時：チェック機能は緩和されません。

WSDL2Javaコマンドで生成されるソースコード

ソースコードは，カレントディレクトリ下にあるパッケージ名のフォルダ下に生成されます。例えば，カレントディレクトリが「C:¥SOAP」でパッケージ名が「jp.co.hitachi.soft」の場合は，「C:¥SOAP¥jp¥co¥hitachi¥soft」に生成されます。WSDL2Javaコマンドで生成されるファイルの一覧を次の表に示します。

表9‒6　WSDL2Javaコマンドで生成されるファイル一覧

生成ファイル名

名称

説明

<portType要素のname属性>.java

リモートインタフェース

スタブ，スケルトン共通インタフェースクラスです。

<service要素のname属性>.java

サービスインタフェース

サービスのインタフェースクラスです。

<service要素のname属性>Locator.java

サービスクラス

サービスへの接続情報を保持するクラスです。

<binding要素のname属性>Impl.java

スケルトンクラス

サーバ側に処理を実装するためのクラスです。

<binding要素のname属性>Stub.java

スタブクラス

Callオブジェクト生成などを行うスタブクラスです。

<types要素に定義したデータ型名>.java

ユーザ定義のデータ型クラス

ユーザ作成のデータ型クラスです。0または1個以上のデータ型クラスを作成します。

生成されるファイル名称に関して，次の注意が必要です。

生成されるフォルダ内にすでに同じ名称のソースコードがある場合，<binding要素のname属性>Impl.java（スケルトンクラス）以外は上書きされます。したがって，上書きされないようにするには，各要素のname属性を変更したあとに，再度生成し直してください。

生成されるフォルダ内にすでに同じ名称のソースコードがある場合，<binding要素のname属性>Impl.java（スケルトンクラス）だけは上書きされません。したがって，インタフェースを変更するときは，<binding要素のname属性>Impl.java（スケルトンクラス）を直接修正するか，<binding要素のname属性>Impl.java（スケルトンクラス）を削除してから再度生成し直してください。

終了コード

0：正常終了

1：異常または警告終了

メッセージ

メッセージの詳細については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」の開発支援コマンドによって出力されるメッセージの記述を参照してください。

注意事項

-sオプションを指定して生成したサービスデプロイ定義（server-config.xml）は編集しないでそのままご使用ください。

指定するWSDLファイルにはローカルファイルを指定してください。

実行中にエラーが発生した場合，ソースが途中まで生成されている場合があります。必要に応じて削除してください。

WSDLファイルのパスには，次の文字は使用できません。

?　:　*　#　%　|　<　>　"

WSDL定義のmessage要素に含まれるpart要素に，element属性とtype属性の両方を指定して，コマンドを実行したときの挙動を次に示します。

WSDLのスタイルおよびuse属性が「RPC／LITERAL」または「RPC／ENCODED」の場合：

element属性を無視し，type属性の記述に従ってJavaソースコードが生成されます。

WSDLのスタイルおよびuse属性が「DOCUMENT／LITERAL」の場合：

WSDL2Javaコマンドの実行時に，KDCCC0240-Eメッセージが出力されて異常終了します。

XML Schemaに同じ名前の要素と型を定義する場合，wsdl:portType，wsdl:binding，およびwsdl:serviceには同じ名前を使用しないでください。同じ名前を使用した場合，コンパイルできないソースコードが生成されます。

WSDLには，同じ名前を設定できる要素があるため，生成されるJavaインタフェースおよびJavaクラスの名前が衝突することがあります。名前が衝突した場合，WSDL2Javaコマンドは，衝突したすべてのJavaインタフェースおよびJavaクラスの名前に次のようなサフィックスを追加します。

表9‒7　名前衝突時に追加されるサフィックス

項番

WSDLまたはXML Schemaの要素および型

Javaインタフェースおよびクラスに追加されるサフィックス

例

1

JavaクラスにマッピングされるXML Schemaの型

_Type

（例1）

XML Schema:

<xsd:complexType name="Shared">

　<xsd:sequence>

　　<xsd:element name="elem" type="xsd:string"/>

　</xsd:sequence>

</xsd:complexType>

Java:

Shared_Type.java

（例2）

XML Schema：

<xsd:simpleType name="Shared">

　<xsd:restriction base="xsd:string">

　　<xsd:enumeration value="foo"/>

　</xsd:restriction>

</xsd:simpleType>

Java：

Shared_Type.java

2

JavaクラスにマッピングされるXML Schemaの要素

_ElemType

XML Schema:

<xsd:element name="Shared">

　<xsd:complexType>

　　<xsd:sequence>

　　　<xsd:element name="elem" type="xsd:string"/>

　　</xsd:sequence>

　</xsd:complexType>

</xsd:element>

Java:

Shared_ElemType.java

3

wsdl:portType要素

_Port

WSDL:

<wsdl:portType name="Shared">

　...

Java:

Shared_Port.java

4

wsdl:service要素

_Service

WSDL：

<wsdl:service name="Shared">

　...

Java：

Shared_Service.java

5

wsdl:fault要素が参照しているXML Schemaの型

_Exception

WSDL：

<wsdl:types>

　<xsd:schema ...>

　　<xsd:complexType name="Shared">

　　　...

　　</xsd:complexType>

　</xsd:schema>

</wsdl:types>

<wsdl:message name="UserException">

　　<wsdl:part name="fault" type="intf:Shared"/>

</wsdl:message>

...

<wsdl:portType name="UserInfo">

　<wsdl:operation name="getUserInfo" parameterOrder="in0">

　　...

　　<wsdl:fault message="intf:UserException" name="UserException"/>

　</wsdl:operation>

</wsdl:portType>

Java：

Shared_Exception.java

wsdl:definitions要素のtargetNamespace属性値からマッピングされるJavaパッケージの名前と，次の要素および型の名前が同じ場合，Javaパッケージの名前にサフィックスとして"_pkg"を追加します。

・JavaクラスにマッピングされるXML Schemaの型

・JavaクラスにマッピングされるXML Schemaの要素

・wsdl:portType要素

・wsdl:service要素

・wsdl:fault要素が参照しているXML Schemaの型

-pオプションでIPv6アドレスを指定した場合，指定した文字列がそのままパッケージ名になります。このとき，生成したクラスのパッケージ名が不正になり，コンパイルできないことがあります。コンパイルできない場合は，生成したクラスのパッケージ名を修正してください。

スタブおよびスケルトンファイルをコンパイルすると，次に示す警告メッセージが出力されることがあります。

注：入力ファイルの操作のうち，未チェックまたは安全ではないものがあります。
注：詳細については，-Xlint:unchecked オプションを指定して再コンパイルしてください。

この警告メッセージが出力された場合の対処は不要です。

なお，「入力ファイルの操作のうち」の部分は，コンパイル時の入力ファイル名が出力されることがあります。

生成されるソースコードは，SOAP通信基盤のバージョン08-50（Component Container 08-50）対応のソースコードとなります。08-50以外のバージョンのSOAP通信基盤には，対応するSOAPアプリケーション開発支援機能でソースコードの再生成が必要になります。

-Lオプションについて

-Lオプションを指定した場合，WSDLの記述内容に関する次のチェックを緩和します。

別ファイルのXML Schemaをインポートまたはインクルードし，対象のXML Schemaがさらに別ファイルのXML Schemaをインポートまたはインクルードする場合，間接的にXML Schemaの要素および属性を参照することはできません。間接的に要素および属性を参照しようとした場合，WSDL2JavaコマンドはKDCCC0137-Eメッセージを出力し異常終了します。

-sオプションを指定した場合，soap:address要素のlocation属性に次のどれかを指定したとき，WSDL2JavaコマンドはKDCCC0182-Eメッセージを出力し異常終了します。

・java.net.URL(String)コンストラクタでjava.net.MalformedURLExceptionが発生する文字列

・authority部がないURL文字列

・path部がないURL文字列

・プロトコルが「http」および「https」以外のURL文字列

複数のwsdl:types要素を記述した場合，WSDL2JavaコマンドはKDCCC0247-Eメッセージを出力し異常終了します。

-sオプションを指定した場合，soap:address要素のlocation属性に，RFC3986で規定された予約文字および非予約文字以外の文字列を指定したとき，WSDL2JavaコマンドはKDCCC0273-Eメッセージを出力し異常終了します。

-sオプションを指定した場合，soap:address要素のlocation属性に，文字列長が8,190バイトを超える文字列を指定したときに，WSDL2JavaコマンドはKDCCC0274-Eメッセージを出力し異常終了します。

次の条件のどちらかの場合，WSDL2JavaコマンドはKDCCC0275-Eメッセージを出力し異常終了します。

・「http://www.w3.org/1999/XMLSchema」のXML Schemaを使用した場合。

・「http://www.w3.org/2000/10/XMLSchema」のXML Schemaを使用した場合。

次の条件のどれかの場合，WSDL2JavaコマンドはKDCCC0277-Eメッセージを出力し異常終了します。

・WSDLのインポートで，wsdl:import要素のlocation属性で指定したファイルパスを絶対パスに換算した文字数が256文字を超える場合。

・XML Schemaのインポートで，xsd:import要素のschemaLocation属性で指定したファイルパスを絶対パスに換算した文字数が256文字を超える場合。

・XML Schemaのインクルードで，xsd:include要素のschemaLocation属性で指定したファイルパスを絶対パスに換算した文字数が256文字を超える場合。

xsd:schema要素の子要素に複数のxsd:import要素を記述した場合，schemaLocation属性の値が同じとき，WSDL2JavaコマンドはKDCCC0278-Eメッセージを出力し異常終了します。

次の条件のどれかの場合，WSDL2JavaコマンドはKDCCC0279-Eメッセージを出力し異常終了します。

・WSDLのインポートで，インポート対象のwsdl:definitions要素のtargetNamespace属性と，インポート元のwsdl:import要素のnamespace属性とが異なる場合。

・XML Schemaのインポートで，インポート対象のxsd:schema要素のtargetNamespace属性と，インポート元のxsd:import要素のnamespace属性とが異なる場合。

・XML Schemaのインクルードで，インクルード対象のxsd:schema要素のtargetNamespace属性と，インクルード元のxsd:schema要素のtargetNamespace属性とが異なる場合。

同じWSDL内のXML Schemaをインポートまたはインクルードし，対象のXML Schemaがさらに同じWSDL内のXML Schemaをインポートまたはインクルードする場合，間接的にXML Schemaの要素および属性を参照しようとしたとき，WSDL2JavaコマンドはKDCCC0280-Eメッセージを出力し異常終了します。

wsdl:types要素を記述する場合，wsdl:documentation要素およびwsdl:import要素を除く，ほかのすべての要素よりも前に記述していないとき，WSDL2JavaコマンドはKDCCC0283-Eメッセージを出力し異常終了します。

WSDLをインポートする場合，次の条件のどちらも満たさないとき，WSDL2JavaコマンドはKDCCC0284-Eメッセージを出力し異常終了します。

・次の要素の組み合わせ

　・インポート元：wsdl:binding，wsdl:service

　・インポート対象：wsdl:types※，wsdl:message，wsdl:portType

・次の要素の組み合わせ

　・インポート元：wsdl:service

　・インポート対象：wsdl:types※，wsdl:message，wsdl:portType，wsdl:binding

　注※

　wsdl:types要素を省略する場合は不要です。

wsdl:import要素を記述する場合，wsdl:documentation要素を除く，ほかのすべての要素よりも前に記述していないとき，WSDL2JavaコマンドはKDCCC0285-Eメッセージを出力し異常終了します。

xsd:schema要素の子要素に複数のxsd:include要素を記述した場合，schemaLocation属性の値が同じとき，WSDL2JavaコマンドはKDCCC0287-Eメッセージを出力し異常終了します。

wsdl:definitions要素の子要素に複数のwsdl:import要素を記述した場合，location属性の値が同じとき，WSDL2JavaコマンドはKDCCC0288-Eメッセージを出力し異常終了します。

次の条件のどちらかの場合，WSDL2JavaコマンドはKDCCC0290-Eメッセージを出力し異常終了します。

・XML Schemaのインクルードで，インクルード対象のxsd:schema要素のtargetNamespace属性，およびインクルード元のxsd:schema要素のtargetNamespace属性が省略されている場合。

・XML Schemaのインクルードで，インクルード対象のxsd:schema要素のtargetNamespace属性，およびインクルード元のxsd:schema要素のtargetNamespace属性の値が空文字の場合。

次のどれかの属性に対して，RFC3986で規定された予約文字および非予約文字以外の文字列を使用する場合，UTF-8でパーセントエンコードしていないとき，WSDL2JavaコマンドはKDCCC0291-Eメッセージを出力し異常終了します。

・wsdl:definitions要素のtargetNamespace属性

・wsdl:definitions要素の名前空間宣言

・wsdl:import要素のnamespace属性

・wsdl:import要素のlocation属性

・xsd:schema要素のtargetNamespace属性

・xsd:schema要素の名前空間宣言

・xsd:import要素のnamespace属性

・xsd:import要素のschemaLocation属性

・xsd:include要素のnamespace属性

・xsd:include要素のschemaLocation属性

-sオプションを指定した場合，wsdl:port要素のname属性を日本語で定義し，wsdl:port要素のname属性をパーセントエンコードした値とsoap:address要素のlocation属性のURLパスの末尾が一致しないとき，WSDL2JavaコマンドはKDCCC0292-Eメッセージを出力し異常終了します。

-sオプションを指定した場合，wsdl:port要素のname属性とsoap:address要素のlocation属性のURLパスの末尾が一致しないとき，WSDL2JavaコマンドはKDCCC0293-Eメッセージを出力し異常終了します。

次の条件のどちらかの場合，WSDL2JavaコマンドはKDCCC0300-Eメッセージを出力し異常終了します。

・WSDLのインポートで，wsdl:definitions要素のtargetNamespace属性とwsdl:import要素のnamespace属性が同じ名前空間の場合。

・XML Schemaのインポートで，xsd:schema要素のtargetNamespace属性とxsd:import要素のnamespace属性が同じ名前空間の場合。

次の条件のどれかの場合，WSDL2Javaコマンドはwsdl:import要素，xsd:import要素またはxsd:include要素を無視します。

・WSDLのインポートで，wsdl:import要素のlocation属性に相対パス以外（絶対パスおよびhttp://やftp://などのプロトコルで始まるURIなど）を指定した場合。

・XML Schemaのインポートで，xsd:import要素のschemaLocation属性に相対パス以外（絶対パスおよびhttp://やftp://などのプロトコルで始まるURIなど）を指定した場合。

・XML Schemaのインクルードで，xsd:include要素のschemaLocation属性に相対パス以外（絶対パスおよびhttp://やftp://などのプロトコルで始まるURIなど）を指定した場合。

9.3　Java2WSDDコマンド（サービスデプロイ定義の生成）

サービスデプロイ定義（server-config.xml）の生成は，次のコマンドを使用します。

形式

Java2WSDD.bat ［オプション群］ <対象となるクラス名>

表9‒8　Java2WSDD（server-config.xml）コマンドのオプション一覧

オプション

意味

備考

-h

ヘルプが表示されます。

−

-o

server-config.xmlの出力先ディレクトリを指定します。

省略時：カレントディレクトリが設定されます。

−

-s

serviceElement名を指定します（service要素のname属性）。

省略時：クラス名が設定されます。

−

-p

provider種別名を指定します。RPC，EJBまたはC4MSG（メッセージング）で指定します。

省略時：RPCが設定されます。

−

-d

deployScopeをApplication，Request，Sessionのどれかで指定します。

省略時：Requestが設定されます。

−

-u

use属性をLITERALまたはENCODEDで指定します。大文字／小文字は区別されません。

省略時：LITERALが設定されます。

−

-T

typeMappingVersionを1.1または1.2で指定します。

typeMappingVersion値で，Javaクラスから生成されるWSDL内のデータ型が異なります。詳細は「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

省略時：1.1が設定されます。

−

-z

WSDLのバインディングスタイルをRPCまたはDOCUMENTで指定します。大文字／小文字は区別されません。

省略時：RPCが設定されます。

−

-m

対象となるメソッドを空白またはコンマ（,）区切りで指定します。

省略時：すべてのメソッドが対象になります。

RPC用

-x

非対象メソッドを空白またはコンマ（,）区切りで指定します。

省略時：非対象メソッドは設定されません。

RPC用

-B

EJBのBeanクラス名を指定します。

EJB用

省略不可

-H

EJBのホームインタフェースクラス名を指定します。

EJB用

省略不可

-J

JNDI名前空間を指定します。

EJBHomeオブジェクトリファレンスのJNDI名前空間を次のどちらかの方式で指定します。

・JNDI名前空間の直接指定します。

（例）HITACHI_EJB/SERVERS/MyServer/EJB/UserInfo/UserInfoBean

・ネーミング機能で指定します。

（例）java:comp/env/ejb/UserInfoBean

指定値の詳細は，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」を参照してください。

EJB用

省略不可

-C

CORBA Naming ServiceへアクセスするためのURLを指定します。

省略時：corbaname::localhost:900が設定されます。

EJB用

-S

SOAPサービスにSOAPヘッダ解釈処理を実装している場合はtrue，実装していない場合はfalseを指定します。

省略時：falseが設定されます。

C4MSG（メッセージング）用

終了コード

0：正常終了

1：異常または警告終了

メッセージ

メッセージの詳細については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」の開発支援コマンドによって出力されるメッセージの記述を参照してください。

注意事項

生成されたserver-config.xmlは編集しないでそのままご使用ください。

EJBプロバイダ用のserver-config.xmlを生成する場合，class-of-portTypeにはインタフェースクラスを指定してください。

-Sオプションの指定値による動作について

SOAPヘッダ項目の解釈処理の実装とは次の処理のことです。

呼び出されるSOAPサービスが最終送付先の場合：

actor属性値がSOAPサービス自身を示すURIであり，かつmustUnderstand属性値が"1"である全ヘッダ項目に関する処理を実装しています。

呼び出されるSOAPサービスが仲介者の場合：

actor属性値がSOAPサービス自身を示すURIであり，かつmustUnderstand属性値が"1"である全ヘッダ項目に関して処理し，そのヘッダ項目を削除する処理を実装しています。

処理できない場合は，C4Faultをスローする処理を実装しています。

false：

SOAPヘッダ内のmustUnderstand属性が"1"の場合，サービスを呼び出さないでC4Faultを返します。mustUnderstand属性が"0"または指定がない場合はサービスを呼び出します。

true：

呼び出されるサービスは上記のSOAPヘッダの解釈処理を実装しなければなりません。

EJBプロバイダ用のserver-config.xmlを生成する場合，<Application Serverのインストールフォルダ>/CC/client/lib/j2ee-javax.jarをクラスパスに追加してください。クラスパスが通っていない場合，KDCCC0011-Eエラーが発生する場合があります。

-zオプションでDOCUMENT，-uオプションでENCODEDの組み合わせは指定できません。

-pオプションにEJBを指定しても，EJBインタフェースを指定しなかった場合に出力されるKDCCC0226-Eメッセージが，KDCCC0011-Eメッセージのdetailsに出力されます。

Java2WSDDコマンドを実行する場合は，指定するクラスへのクラスパスを環境変数CLASSPATH に設定してください。CLASSPATHの設定がない場合，Java2WSDDコマンドは，カレントディレクトリをクラスパスに設定し，指定されたクラスを検索します。

9.4　開発支援コマンドに関する注意事項

開発支援コマンドに関する注意事項について説明します。

9.4.1　バッチファイル実行時の注意

各バッチファイルは，インストールされたディレクトリから，ほかのディレクトリへはコピーしないで，セットアップ後の状態で使用してください。KDCCC0012-Eのメッセージが出力され，コマンドが正常に実行されない場合があります。

9.4.2　環境変数CLASSPATHについて

Java2WSDLコマンドおよびJava2WSDDコマンドを実行する場合，環境変数CLASSPATHを設定しているかどうかでカレントディレクトリの扱いが異なります。

環境変数CLASSPATHを設定している場合

コマンドの対象となるクラスの検索対象に，カレントディレクトリは含まれません。含める場合は，環境変数CLASSPATHにカレントディレクトリを表す"."を含めてください。例えば，すでに環境変数CLASSPATHとして"C:¥works¥build¥classes;C:¥apps¥someapp¥lib¥"を設定している場合，"C:¥works¥build¥classes;C:¥apps¥someapp¥lib¥;."としてください。

環境変数CLASSPATHを設定していない場合

コマンドの対象となるクラスの検索対象に，カレントディレクトリが含まれます。

9.4.3　開発支援コマンドの最大入力文字数について

開発支援コマンドで入力できる文字数は，8,190バイトまでです。8,190バイトを超えて入力した場合，コマンドが正常に実行されません。

9.4.4　Windows使用時の注意

開発支援コマンドは，管理者特権で実行する必要があります。開発支援コマンドは，「管理者：コマンドプロンプト」で実行してください。

9.4.5　トレースとコンソール画面の出力内容に関する注意

開発コマンドを実行した場合に，コンソール画面に出力されている内容がトレースに出力されない，またはトレースに出力されている内容がコンソール画面に出力されないことがあります。

障害発生時には，コンソール画面とトレースに出力された内容を参照してください。

9.4.6　INFORMATIONメッセージおよびWARNメッセージの出力について

トレースファイル出力の重要度をERRORまたはWARNに設定しても，KDCCC0222-IのINFORMATIONメッセージがトレースファイルに出力されることがあります。

また，トレースファイル出力の重要度をERRORに設定しても，KDCCC0202-W，KDCCC0211-W，およびKDCCC0221-WのINFORMATIONメッセージがトレースファイルに出力されることがあります。次の場合に出力されます。

Java2WSDLコマンドでKDCCC0202-Wをトレースファイルに出力した場合

WSDL2JavaコマンドでKDCCC0211-Wをトレースファイルに出力した場合

Java2WSDDコマンドでKDCCC0211-W，KDCCC0221-W，およびKDCCC0222-Iをトレースファイルに出力した場合

10　動作定義ファイルおよび実行時オプションの設定項目

SOAPアプリケーションの実行時の動作や運用環境を詳細に定義したい場合，実行時オプションとして動作定義ファイルに定義できます。

この章では，動作定義ファイルおよび実行時オプションの設定項目について説明します。

10.1　動作定義ファイルの記述規則

SOAPアプリケーションの動作定義ファイルには，次の種類があります。

サーバ定義ファイル

サーバ側の動作を制御します。

クライアント定義ファイル

クライアント側の動作を制御します。

共通定義ファイル

サーバ側およびクライアント側の共通の動作を制御します。

これらの動作定義ファイルの記述規則を示します。

J2SEのプロパティ形式に従い，「キー名称=値」の形式で記述します。

1行の終わりは必ず改行されていなければなりません。

「#」で始まる行はコメントとみなされます。

値が存在しない行を設定した場合，空文字として処理されます。

キー名称と=の間，および=と値の間にスペースを入れてはいけません。

値に2バイト文字を使用する場合は，文字コードをUTF-8にしなければなりません。

設定できるキー名称以外のキー名称を設定した場合，その行は無視されます。

識別子以外のキー名称はすべて小文字で設定しなければなりません。大文字が混在した場合，その行は無視されます。

値には半角スペースも設定できます。

（例）

c4web.logger.log_file_prefix=File Prefix

10.2　サーバ定義ファイルの設定

サーバ定義ファイルは，「c4websv.cfg」というファイル名称で，インストール時に次の場所に格納されます。

Windowsの場合

<Application Serverのインストールフォルダ>¥c4web¥conf

Windows以外の場合

/opt/Cosminexus/c4web/conf

サーバ定義ファイルには，設定できるパラメタをサーバごとに複数ブロック設定できます。

サーバ定義ファイルに設定した内容を反映するには，SOAPアプリケーションを再起動する必要があります。設定した内容は，SOAPアプリケーション再起動後の初回リクエストを受信したときに反映されます。なお，サーバ定義ファイルは，SOAPアプリケーションを停止してから変更してください。SOAPアプリケーションの再起動および停止については，「7.1　SOAPアプリケーションの開始と停止」を参照してください。

次の表に設定するキー名称と値の一覧について示します。

表10‒1　サーバ定義ファイルの設定項目

設定項目

キー名称

値

デフォルト値

（値省略時の仮定値）

トレースファイル，アプリケーションログのプレフィクス

c4web.logger.<識別子>.log_file_prefix

任意の文字列を設定します。

「<log_file_prefix>-j2ee-<J2EEサーバのサーバ名>-<log_file_num>.log」がトレースファイルの名称となります。

「<log_file_prefix>-j2ee-<J2EEサーバのサーバ名>-aplog-<log_file_num>.log」がアプリケーションのログ名称となります。

識別子値

多重参照（実行時オプション）

c4web.common.<識別子>.do_multirefs

多重参照を有効にするかどうかを設定します。trueまたはfalseを設定します。※1

false

データ型定義（実行時オプション）

c4web.common.<識別子>.send_xsi_types

データ型情報を送信するかどうかを設定します。trueまたはfalseを設定します。※1

true

未宣言要素の無視※3

c4web.common.<識別子>.ignore_undeclared_elements

XMLスキーマ（DOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素を除く）で要素宣言していないXMLインスタンスを含むSOAPメッセージを受信した場合，このXMLインスタンスを無視するかどうかを設定します。trueまたはfalseを設定します。※1

false

未宣言パラメタの無視※4

c4web.common.<識別子>.ignore_undeclared_parts

WSDL（RPCスタイルのwsdl:part要素，およびDOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素）で宣言していないパラメタを含むSOAPメッセージを受信した場合，このパラメタを無視するかどうかを設定します。trueまたはfalseを設定します。※1

false

SOAPヘッダの名前修飾チェックオプション（実行時オプション）

c4web.common.<識別子>.enable_soapheader_check

SOAPヘッダの子エレメントの名前修飾をチェックするかどうかを指定します。trueまたはfalseを設定します。※1

true

性能解析トレース出力オプション

c4web.common.<識別子>.prf_trace_level

ALL，NONHANDLERのどちらかを指定します。

ALL：

次のトレース取得ポイントでトレースファイルが出力されます。

送信側ハンドラの呼び出し

ハンドラの呼び出し

受信側ハンドラの呼び出し

送信側ハンドラからの戻り

ハンドラからの戻り

受信側ハンドラからの戻り

NONHANDLER：

次のトレース取得ポイントでトレースファイルが出力されません。

送信側ハンドラの呼び出し

ハンドラの呼び出し

受信側ハンドラの呼び出し

送信側ハンドラからの戻り

ハンドラからの戻り

受信側ハンドラからの戻り

性能解析トレースについては，「14.7　性能解析トレース」を参照してください。

ALL

文字参照形式オプション

c4web.common.<識別子>.character_reference

送信メッセージ中の文字を文字参照形式にエンコードするかどうかを指定します。trueまたはfalseを設定します。※1

false

送信できるSOAPEnvelopeの最大バイト数

c4web.common.<識別子>.send_max_soap_envelope_size

送信できるSOAPEnvelopeの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を指定した場合は無制限となります。

0

受信できるSOAPEnvelopeの最大バイト数

c4web.common.<識別子>.receive_max_soap_envelope_size

受信できるSOAPEnvelopeの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

HTTPセッションの維持（実行時オプション）

c4web.application.<識別子>.app_maintainsession

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，HTTPセッションを維持するかどうかを設定します。trueまたはfalseを設定します。※1

false

プロキシサーバのホスト名またはIPアドレス（実行時オプション）

c4web.application.<識別子>.proxy_host

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，プロキシサーバのホスト名またはIPアドレスを設定します。ホスト名またはIPアドレスを示す文字列を設定します。

−

プロキシサーバを使用しないホスト名またはIPアドレス群（実行時オプション）

c4web.application.<識別子>.non_proxy_hosts

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，プロキシサーバを使用しないホスト名またはIPアドレス群を設定します。ホスト名またはIPアドレスを示す文字列を設定します。複数のホスト名またはIPアドレスを指定する場合「|」で区切って設定します。※2

−

プロキシサーバのポート番号（実行時オプション）

c4web.application.<識別子>.proxy_port

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，ポート番号を示す文字列を設定します。

−

プロキシサーバの認証ユーザID（実行時オプション）

c4web.application.<識別子>.proxy_user

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，プロキシサーバの認証ユーザIDを設定します。任意の文字列を設定します。※2

−

プロキシサーバの認証ユーザIDに対応するパスワード（実行時オプション）

c4web.application.<識別子>.proxy_password

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，認証ユーザIDに対応するパスワードを設定します。任意の文字列を設定します。※2

−

サーバ兼クライアントのソケットの書き込みタイムアウト値

c4web.application.<識別子>.socket_write_timeout

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，ソケットの書き込みタイムアウト値を秒単位で設定します。0〜86,400の数値を設定します。0を指定した場合はタイムアウト監視をしません。

60

サーバ兼クライアントのソケットの読み込みタイムアウト値

c4web.application.<識別子>.socket_read_timeout

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，ソケットの読み込みタイムアウト値を秒単位で設定します。0〜86,400の数値を設定します。0を指定した場合はタイムアウト監視をしません。

300

サーバ兼クライアントのソケットの接続タイムアウト値

c4web.application.<識別子>.socket_connect_timeout

ほかのSOAPサーバのサービスメソッドを呼び出す場合に，ソケットの接続タイムアウト値を秒単位で設定します。0〜86,400の範囲で数値を設定します。0を指定した場合はタイムアウト監視をしません。

60

Javaソースファイルおよびクラスファイルの出力ディレクトリ

c4web.application.<識別子>.dii_temp_directory

DIIでユーザ定義のデータ型クラスを使用する場合に，WSDL定義から動的に出力されるJavaソースファイルおよびクラスファイルの出力先ディレクトリを，ローカルディレクトリ上の絶対パスで設定します。設定値は1〜128文字の範囲で設定します。なお，ディレクトリ名に指定できる文字は，使用しているOSに依存します。また，ディレクトリ名のパスの区切りには，次の文字を使用してください。

Windowsの場合：

「/」または「¥¥」を使用してください。

Windows以外の場合：

「/」を使用してください。

<Application Serverのインストールディレクトリ>/c4web/dii/temp

WSDL解析およびJavaソース生成のタイムアウト値

c4web.application.<識別子>.dii_wsdl_parse_timeout

DIIを使用する場合に，WSDL解析およびJavaソース生成のタイムアウト値を秒単位で設定します。0〜3,600の範囲で数値を設定します。0を指定した場合はタイムアウト監視をしません。

45

ホスト名の検証

c4web.application.<識別子>.hostname_verification.enable

ホスト名の検証を有効にするかどうかを設定します。trueまたはfalseを設定します。※1

true

SOAPAction値の扱い（実行時オプション）

c4web.server.<識別子>.fault_omit_soapaction

SOAPAction値がない場合の実行時オプションを設定します。trueまたはfalseを設定します。※1

true

送信できる添付データの最大個数

c4web.attachment.<識別子>.send_max_attachment_count

送信できる添付データの最大個数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

100

受信できる添付データの最大個数

c4web.attachment.<識別子>.receive_max_attachment_count

受信できる添付データの最大個数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

送信できる各添付データの最大バイト数

c4web.attachment.<識別子>.send_max_attachment_size

送信できる各添付データの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

104,857,600

受信できる各添付データの最大バイト数

c4web.attachment.<識別子>.receive_max_attachment_size

受信できる各添付データの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

退避ファイルを格納するディレクトリ名

c4web.attachment.<識別子>.attachment_temp_directory

添付ファイル付きSOAPメッセージを受信したときに生成される退避ファイルの出力先ディレクトリを，ローカルディレクトリ上の絶対パスで設定します。設定値は1〜128文字の範囲で設定します。なお，ディレクトリ名に指定できる文字は，OSに依存します。また，ディレクトリ名のパスの区切りには，次の文字を使用してください。

Windowsの場合：

「/」または「¥¥」を使用してください。

Windows以外の場合：

「/」を使用してください。

Windowsの場合

<Application Serverのインストールフォルダ>/c4web/attachments

Windows以外の場合

/opt/Cosminexus/c4web/attachments

（凡例）

−：デフォルト値がないことを示します。

注※1

true：設定項目を有効にします。

false：設定項目を無効にします。

また，trueおよびfalseは小文字で記述してください。

注※2

プロキシサーバのホスト名またはIPアドレス（c4web.application.<識別子>.proxy_host）とプロキシサーバのポート番号（c4web.application.<識別子>.proxy_port）のどちらかがnullまたは空文字の場合，設定した値は無視されます。

注※3

falseの場合，XMLスキーマ（DOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素を除く）で要素宣言していないXMLインスタンスを含むSOAPメッセージを受信した場合，次のどちらかが発生します。

(a) SOAPサービスで受信した場合，KDCCP0006-EメッセージのSOAPフォルトを返信します。

(b) SOAPクライアントで受信した場合，KDCCP0006-EメッセージのC4Faultが発生します。

trueの場合，上記の受信チェックを行いません。該当するXMLインスタンスを無視します。

注※4

falseの場合，WSDL（RPCスタイルのwsdl:part要素，およびDOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素）で宣言していないパラメタを含むSOAPメッセージを受信した場合，次のどちらかが発生することがあります。

(a) SOAPサービスで受信した場合，次のどちらかが発生することがあります。

　・不正な値の引数を受け取ります。

　・KDCCP0006-EメッセージのSOAPフォルトを返信します。

(b) SOAPクライアントで受信した場合，KDCCP0006-EメッセージのC4Faultが発生することがあります。

trueの場合，上記の受信チェックを行いません。該当するパラメタを無視します。

識別子について

識別子は，サーバ定義ファイル中から動作中のサーバの情報を取得するためのキーとして使用します。識別子として，サーバにデプロイしたSOAPアプリケーションのコンテキストルートから先頭の「/」を抜いた名称を使用します。コンテキストルートとは，コンテキストのルートパスです。コンテキスト内のWebアプリケーションにアクセスするときにURL上に指定します。例えば，接続先URLが「http://localhost:8080/WebApp1/services/UserInfo」の場合，識別子は「WebApp1」となります。接続先URLが「http://localhost:8080/WebApp1/Service1/services/UserInfo」の場合，識別子は「WebApp1/Service1」となります。なお，サーバ定義ファイル中の識別子の大文字と小文字は区別されます。

注意事項

ルートコンテキストを使用する場合，サーバ定義ファイルに，次のように識別子を省略した形式で記述する必要があります。

通常指定時

c4web.logger.<識別子>.log_file_num=2

ルートコンテキスト指定機能使用時

c4web.logger.log_file_num=2

なお，トレースファイル，アプリケーションログのプレフィクス（log_file_prefix）を省略した場合，デフォルト値は"ROOT"になります。

サーバ定義ファイルの例

#  TO BE REPLACED: "<cosminexus.home>",
#                  "<proxy-host>","<nonproxy-host1>"," <nonproxy-host2>",
#                  "<proxy-port>","<proxy-user>","<proxy-password>"

#  define WebApp settings.
#c4web.logger.WebApp1.log_file_prefix=WebApp1
#c4web.common.WebApp1.do_multirefs=false
#c4web.common.WebApp1.send_xsi_types=true
#c4web.common.WebApp1.ignore_undeclared_elements=false
#c4web.common.WebApp1.ignore_undeclared_parts=false
#c4web.common.WebApp1.enable_soapheader_check=true
#c4web.common.WebApp1.prf_trace_level=ALL
#c4web.common.WebApp1.character_reference=false
#c4web.common.WebApp1.send_max_soap_envelope_size=0
#c4web.common.WebApp1.receive_max_soap_envelope_size=0
#c4web.application.WebApp1.app_maintainsession=false
#c4web.application.WebApp1.proxy_host=<proxy-host>
#c4web.application.WebApp1.non_proxy_hosts=<nonproxy-host1>|<nonproxy-host2>
#c4web.application.WebApp1.proxy_port=<proxy-port>
#c4web.application.WebApp1.proxy_user=<proxy-user>
#c4web.application.WebApp1.proxy_password=<proxy-password>
#c4web.application.WebApp1.socket_write_timeout=60
#c4web.application.WebApp1.socket_read_timeout=300
#c4web.application.WebApp1.socket_connect_timeout=60
#c4web.application.WebApp1.dii_temp_directory=<cosminexus.home>/c4web/dii/temp
#c4web.application.WebApp1.dii_wsdl_parse_timeout=45
#c4web.application.WebApp1.hostname_verification.enable=true
#c4web.server.WebApp1.fault_omit_soapaction=true
#c4web.attachment.WebApp1.attachment_temp_directory=<cosminexus.home>/c4web/attachments
#c4web.attachment.WebApp1.send_max_attachment_count=100
#c4web.attachment.WebApp1.receive_max_attachment_count=0
#c4web.attachment.WebApp1.send_max_attachment_size=104857600
#c4web.attachment.WebApp1.receive_max_attachment_size=0

#  define other WebApp settings.
#c4web.logger.WebApp2.log_file_prefix=WebApp2
#c4web.common.WebApp2.do_multirefs=false
#c4web.common.WebApp2.send_xsi_types=true
#c4web.common.WebApp2.ignore_undeclared_elements=false
#c4web.common.WebApp2.ignore_undeclared_parts=false
#c4web.common.WebApp2.enable_soapheader_check=true
#c4web.common.WebApp2.prf_trace_level=ALL
#c4web.common.WebApp2.character_reference=false
#c4web.common.WebApp2.send_max_soap_envelope_size=0
#c4web.common.WebApp2.receive_max_soap_envelope_size=0
#c4web.application.WebApp2.app_maintainsession=false
#c4web.application.WebApp2.proxy_host=<proxy-host>
#c4web.application.WebApp2.non_proxy_hosts=<nonproxy-host1>|<nonproxy-host2>
#c4web.application.WebApp2.proxy_port=<proxy-port>
#c4web.application.WebApp2.proxy_user=<proxy-user>
#c4web.application.WebApp2.proxy_password=<proxy-password>
#c4web.application.WebApp2.socket_write_timeout=60
#c4web.application.WebApp2.socket_read_timeout=300
#c4web.application.WebApp2.socket_connect_timeout=60
#c4web.application.WebApp2.dii_temp_directory=<cosminexus.home>/c4web/dii/temp
#c4web.application.WebApp2.dii_wsdl_parse_timeout=45
#c4web.application.WebApp2.hostname_verification.enable=true
#c4web.server.WebApp2.fault_omit_soapaction=true
#c4web.attachment.WebApp2.attachment_temp_directory=<cosminexus.home>/c4web/attachments
#c4web.attachment.WebApp2.send_max_attachment_count=100
#c4web.attachment.WebApp2.receive_max_attachment_count=0
#c4web.attachment.WebApp2.send_max_attachment_size=104857600
#c4web.attachment.WebApp2.receive_max_attachment_size=0

定義ファイル中の<>で囲まれた部分については，利用者の環境に合わせた値に修正する必要があります。なお，<cosminexus.home>は，Windowsの場合，Application Serverインストールフォルダを表しています。Windows以外の場合，/opt/Cosminexusを表しています。

10.3　クライアント定義ファイルの設定

クライアント定義ファイルは，「c4webcl.properties」というファイル名称で利用者が作成します。作成したクライアント定義ファイルは，クラスパス上に配置してください。

配置例を次に示します。

コマンドラインを利用する場合

コマンドラインからSOAPアプリケーションを利用する場合，Javaコマンド実行時に指定するクラスパス上に，クライアント定義ファイルを配置してください。例えば，次のようにクライアントを実行する場合は，C:¥temp¥に配置します。

cjclstartap -classpath C:¥temp¥ <クライアントのJavaクラス名>

cjclstartapコマンドについては，マニュアル「アプリケーションサーバ リファレンス コマンド編」を参照してください。

クラスパスはJ2EEサーバ用オプション定義ファイルで指定することもできます。J2EEサーバ用オプション定義ファイルについては，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

サーブレットを利用する場合

サーブレットからSOAPアプリケーションを利用する場合，WARファイルのWEB-INF/classesに，クライアント定義ファイルを配置してください。WARファイルの構成例を次に示します。

SOAPアプリケーションを利用するサーブレットクラスRPCSampleClientを含むRPCSampleClient.warの例

RPCSampleClient.war/
  getUserData.html
  META-INF/
    MANIFEST.MF
  WEB-INF/
    web.xml
    classes/
      c4webcl.properties
      localhost/
        RPCSampleClient.class
          :

WARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

サーブレットからSOAPアプリケーションを利用する場合，J2EEサーバ用オプション定義ファイルのadd.class.pathキーに指定したパスに配置することもできます。J2EEサーバ用オプション定義ファイルについては，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。ただし，この場合，そのJ2EEサーバにデプロイされた，SOAPアプリケーションを利用するすべてのアプリケーションが同じ設定で動作するので注意してください。なお，「EJBを利用する場合」の次の注意事項も参照してください。

EJBを利用する場合

EJBからSOAPアプリケーションを利用する場合，EJB-JARファイルのルートディレクトリに，クライアント定義ファイルを配置してください。EJB-JARファイルの構成例を次に示します。

SOAPアプリケーションを利用するEJB"RPCSampleClient"を含むRPCSampleClient-ejb.jarの例

RPCSampleClient-ejb.jar/
  c4webcl.properties
  META-INF/
    ejb-jar.xml
    MANIFEST.MF
  localhost/
    RPCSampleClient.class
    RPCSampleClientBean.class
    RPCSampleClientHome.class
      ：

EJB-JARファイルの作成方法については，マニュアル「アプリケーションサーバ アプリケーション開発ガイド」を参照してください。

EJBからSOAPアプリケーションを利用する場合，J2EEサーバ用オプション定義ファイルのadd.class.pathキーに指定したパスに配置することもできます。J2EEサーバ用オプション定義ファイルについては，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。ただし，この場合，そのJ2EEサーバにデプロイされた，SOAPアプリケーションを利用するすべてのアプリケーションが同じ設定で動作するので注意してください。なお，次の注意事項も参照してください。

注意事項

J2EEサーバ上でクライアントを実行する場合，Managementクラスのメソッドを必ず使用してください。

SOAPサービスを利用するクライアントを同じマシン上で複数動作させる場合，クライアント定義ファイルのトレースファイル，アプリケーションログのプレフィクス（log_file_prefix）は，クライアントごとに異なる値を設定してください。同じ値を設定すると，実行時オプションの指定による制御が正しく行われません。その他の設定（重要度，面数，ファイルサイズ）については，すべてのクライアントが同じ設定で動作します。

次の表に設定するキー名称と値の一覧について示します。

表10‒2　クライアント定義ファイルの設定項目

設定項目

キー名称

値

デフォルト値

（値省略時の仮定値）

トレースファイル，アプリケーションログのプレフィクス

c4web.logger.log_file_prefix

任意の文字列を設定します。

「<log_file_prefix>-j2ee-<J2EEサーバのサーバ名>※1-<log_file_num>.log」がトレースファイルの名称となります。「<log_file_prefix>-j2ee-<J2EEサーバのサーバ名>※1-aplog-<log_file_num>.log」がアプリケーションログの名称となります。

c4webcl

多重参照（実行時オプション）

c4web.common.do_multirefs

多重参照を有効にするかどうかを設定します。trueまたはfalseを設定します。※2

false

データ型定義（実行時オプション）

c4web.common.send_xsi_types

データ型情報を送信するかどうかを設定します。trueまたはfalseを設定します。※2

true

未宣言要素の無視※4

c4web.common.ignore_undeclared_elements

XMLスキーマ（DOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素を除く）で要素宣言していないXMLインスタンスを含むSOAPメッセージを受信した場合，このXMLインスタンスを無視するかどうかを設定します。trueまたはfalseを設定します。※2

false

未宣言パラメタの無視※5

c4web.common.ignore_undeclared_parts

WSDL（RPCスタイルのwsdl:part要素，およびDOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素）で宣言していないパラメタを含むSOAPメッセージを受信した場合，このパラメタを無視するかどうかを設定します。trueまたはfalseを設定します。※2

false

SOAPヘッダの名前修飾チェックオプション（実行時オプション）

c4web.common.enable_soapheader_check

SOAPヘッダの子エレメントの名前修飾をチェックするかどうかを指定します。trueまたはfalseを設定します。※2

true

性能解析トレース出力オプション

c4web.common.prf_trace_level

ALL，NONHANDLERのどちらかを指定します。

ALL：

次のトレース取得ポイントでトレースファイルが出力されます。

送信側ハンドラの呼び出し

ハンドラの呼び出し

受信側ハンドラの呼び出し

送信側ハンドラからの戻り

ハンドラからの戻り

受信側ハンドラからの戻り

NONHANDLER：

次のトレース取得ポイントでトレースファイルが出力されません。

送信側ハンドラの呼び出し

ハンドラの呼び出し

受信側ハンドラの呼び出し

送信側ハンドラからの戻り

ハンドラからの戻り

受信側ハンドラからの戻り

性能解析トレースについては，「14.7　性能解析トレース」を参照してください。

ALL

文字参照形式オプション

c4web.common.character_reference

送信メッセージ中の文字を文字参照形式にエンコードするかどうかを指定します。trueまたはfalseを設定します。※2

false

送信できるSOAPEnvelopeの最大バイト数

c4web.common.send_max_soap_envelope_size

送信できるSOAPEnvelopeの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を指定した場合は無制限となります。

0

受信できるSOAPEnvelopeの最大バイト数

c4web.common.receive_max_soap_envelope_size

受信できるSOAPEnvelopeの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

HTTPセッションの維持（実行時オプション）

c4web.application.app_maintainsession

HTTPセッションを維持するかどうかを設定します。trueまたはfalseを設定します。※2

false

プロキシサーバのホスト名またはIPアドレス（実行時オプション）

c4web.application.proxy_host

プロキシサーバのホスト名またはIPアドレスを設定します。ホスト名またはIPアドレスを示す文字列を設定します。

−

プロキシサーバを使用しないホスト名またはIPアドレス群（実行時オプション）

c4web.application.non_proxy_hosts

プロキシサーバを使用しないホスト名またはIPアドレス群を設定します。ホスト名またはIPアドレスを示す文字列を設定します。複数のホスト名またはIPアドレスを指定する場合「|」で区切って設定します。※3

−

プロキシサーバのポート番号（実行時オプション）

c4web.application.proxy_port

ポート番号を示す文字列を設定します。

−

プロキシサーバの認証ユーザID（実行時オプション）

c4web.application.proxy_user

プロキシサーバの認証ユーザIDを設定します。任意の文字列を設定します。※3

−

プロキシサーバの認証ユーザIDに対応するパスワード（実行時オプション）

c4web.application.proxy_password

認証ユーザIDに対応するパスワードを設定します。任意の文字列を設定します。※3

−

クライアントのソケットの書き込みタイムアウト値

c4web.application.socket_write_timeout

クライアントのソケットの書き込みタイムアウト値を秒単位で設定します。0〜86,400の数値を設定します。0を指定した場合はタイムアウト監視をしません。

60

クライアントのソケットの読み込みタイムアウト値

c4web.application.socket_read_timeout

クライアントのソケットの読み込みタイムアウト値を秒単位で設定します。0〜86,400の数値を設定します。0を指定した場合はタイムアウト監視をしません。

300

クライアントのソケットの接続タイムアウト値

c4web.application.socket_connect_timeout

クライアントのソケットの接続タイムアウト値を秒単位で設定します。0〜86,400の数値を設定します。0を指定した場合はタイムアウト監視をしません。

60

Javaソースファイルおよびクラスファイルの出力ディレクトリ

c4web.application.dii_temp_directory

DIIでユーザ定義のデータ型クラスを使用する場合に，WSDL定義から動的に出力されるJavaソースファイルおよびクラスファイルの出力先ディレクトリを，ローカルディレクトリ上の絶対パスで設定します。設定値は1〜128文字の範囲で設定します。なお，ディレクトリ名に指定できる文字は，使用しているOSに依存します。また，ディレクトリ名のパスの区切りには，次の文字を使用してください。

Windowsの場合：

「/」または「¥¥」を使用してください。

Windows以外の場合：

「/」を使用してください。

<Application Serverのインストールディレクトリ>/c4web/dii/temp

WSDL解析およびJavaソース生成のタイムアウト値

c4web.application.dii_wsdl_parse_timeout

DIIを使用する場合に，WSDL解析およびJavaソース生成のタイムアウト値を秒単位で設定します。0〜3,600の範囲で数値を設定します。0を指定した場合はタイムアウト監視をしません。

45

ホスト名の検証

c4web.application.hostname_verification.enable

ホスト名の検証を有効にするかどうかを設定します。trueまたはfalseを設定します。※2

true

送信できる添付データの最大個数

c4web.attachment.send_max_attachment_count

送信できる添付データの最大個数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

100

受信できる添付データの最大個数

c4web.attachment.receive_max_attachment_count

受信できる添付データの最大個数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

送信できる各添付データの最大バイト数

c4web.attachment.send_max_attachment_size

送信できる各添付データの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

104,857,600

受信できる各添付データの最大バイト数

c4web.attachment.receive_max_attachment_size

受信できる各添付データの最大バイト数を設定します。設定値は0〜2,147,483,647の数値を設定します。0を設定した場合は無制限となります。

0

退避ファイルの格納ディレクトリ名

c4web.attachment.attachment_temp_directory

添付ファイル付きSOAPメッセージを受信したときに生成される退避ファイルの出力先ディレクトリを，ローカルディレクトリ上の絶対パスで設定します。設定値は1〜128文字の範囲で指定してください。なお，ディレクトリ名に指定できる文字は，OSに依存します。また，ディレクトリ名のパスの区切りには，次の文字を使用してください。

Windowsの場合：

「/」または「¥¥」を使用してください。

Windows以外の場合：

「/」を使用してください。

Windowsの場合

<Application Serverのインストールフォルダ>/c4web/attachments

Windows以外の場合

/opt/Cosminexus/c4web/attachments

（凡例）

−：デフォルト値がないことを示します。

注※1

単体Javaアプリケーションとして動作させる場合，"-j2ee-<J2EEサーバのサーバ名>"は付与されません。

注※2

true：設定項目を有効にします。

false：設定項目を無効にします。

また，trueおよびfalseは小文字で記述してください。

注※3

プロキシサーバのホスト名またはIPアドレス（c4web.application.proxy_host）とプロキシサーバのポート番号（c4web.application.proxy_port）のどちらかがnullまたは空文字の場合，設定した値は無視されます。

注※4

falseの場合，XMLスキーマ（DOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素を除く）で要素宣言していないXMLインスタンスを含むSOAPメッセージを受信した場合，KDCCP0006-EメッセージのC4Faultが発生します。

trueの場合，上記の受信チェックを行いません。該当するXMLインスタンスを無視します。

注※5

falseの場合，WSDL（RPCスタイルのwsdl:part要素，およびDOCUMENTスタイルのwrapped形式で引数および戻り値をラップした要素）で宣言していないパラメタを含むSOAPメッセージを受信した場合，KDCCP0006-EメッセージのC4Faultが発生することがあります。

trueの場合，上記の受信チェックを行いません。該当するパラメタを無視します。

クライアント定義ファイルの例

#  TO BE REPLACED: "<cosminexus.home>",
#                  "<proxy-host>","<nonproxy-host1>"," <nonproxy-host2>",
#                  "<proxy-port>","<proxy-user>","<proxy-password>"

#c4web.logger.log_file_prefix=c4webcl
#c4web.common.do_multirefs=false
#c4web.common.send_xsi_types=true
#c4web.common.ignore_undeclared_elements=false
#c4web.common.ignore_undeclared_parts=false
#c4web.common.enable_soapheader_check=true
#c4web.common.prf_trace_level=ALL
#c4web.common.character_reference=false
#c4web.common.send_max_soap_envelope_size=0
#c4web.common.receive_max_soap_envelope_size=0
#c4web.application.app_maintainsession=false
#c4web.application.proxy_host=<proxy-host>
#c4web.application.non_proxy_hosts=<nonproxy-host1>|<nonproxy-host2>
#c4web.application.proxy_port=<proxy-port>
#c4web.application.proxy_user=<proxy-user>
#c4web.application.proxy_password=<proxy-password>
#c4web.application.socket_write_timeout=60
#c4web.application.socket_read_timeout=300
#c4web.application.socket_connect_timeout=60
#c4web.application.dii_temp_directory=<cosminexus.home>/c4web/dii/temp
#c4web.application.dii_wsdl_parse_timeout=45
#c4web.application.hostname_verification.enable=true
#c4web.attachment.attachment_temp_directory=<cosminexus.home>/c4web/attachments
#c4web.attachment.send_max_attachment_count=100
#c4web.attachment.receive_max_attachment_count=0
#c4web.attachment.send_max_attachment_size=104857600
#c4web.attachment.receive_max_attachment_size=0

定義ファイル中の<>で囲まれた部分については，利用者の環境に合わせた値に修正する必要があります。なお，<cosminexus.home>は，Windowsの場合，Application Serverのインストールフォルダを表しています。Windows以外の場合，/opt/Cosminexusを表しています。

10.4　共通定義ファイルの設定

サーバおよびクライアント共通の動作を制御するファイルです。ファイル名は「c4webcom.cfg」固定とし，SOAPアプリケーション開発支援機能およびSOAP通信基盤のインストール時に次の場所に格納されます。

Windowsの場合

<Application Serverのインストールフォルダ>¥c4web¥conf

Windows以外の場合

/opt/Cosminexus/c4web/conf

次の表に設定するキー名称と値の一覧について示します。

表10‒3　共通定義ファイルの設定項目

設定項目

キー名称

値

デフォルト値

（値省略時の仮定値）

トレースファイル出力の重要度

c4web.logger.log_level

ERROR，WARN，INFO，DEBUGのどれかを設定します。トレースファイル出力の重要度については，「14.4.3　トレースファイル出力の重要度」を参照してください。

WARN

アプリケーションログ出力の重要度

c4web.logger.aplog_level

WARN，INFO，DEBUGのどれかを設定します。アプリケーションログ出力の重要度については，「14.5.2　アプリケーションログ出力の重要度」を参照してください。

WARN

異常発生時のアプリケーションログ出力

c4web.logger.aplog_error_record

ALL，SEND，RECV，NONEのどれかを設定します。異常発生時のアプリケーションログについては，「14.6　異常発生時のアプリケーションログの出力」を参照してください。

NONE

トレースファイルの面数

c4web.logger.log_file_num

1〜16の数値を設定します。

2

トレースファイルのサイズ

c4web.logger.log_file_size

4,096〜16,777,216（単位：バイト）の数値を設定します。

2,097,152

アプリケーションログの面数

c4web.logger.aplog_file_num

1〜16の数値を設定します。

2

アプリケーションログのサイズ

c4web.logger.aplog_file_size

4,096〜2,147,483,647（単位：バイト）の数値を設定します。

2,097,152

コネクションプーリングの設定

c4web.common.connection_pool.enable

コネクションプーリングの有効／無効を設定します。

trueまたはfalseを設定します。

true：

コネクションプーリングを有効にします。

false：

コネクションプーリングを無効にします。

コネクションプーリングを有効にする場合，「7.4　コネクションプーリング」に記載されている注意事項を十分に理解した上で，設定してください。

false

コネクションの利用回数

c4web.common.connection_pool.max_use

0〜2,147,483,647（単位：回）の数値を設定します。

10,000

コネクションのタイムアウト

c4web.common.connection_pool.timeout

0〜86,400（単位：秒）の数値を設定します。

1,800

最大コネクション数

c4web.common.connection_pool.max_connection

1〜2,147,483,647（単位：本）の数値を設定します。

150

10.5　動作定義ファイル設定時の注意事項

動作定義ファイルは，次に示す内容に注意して設定してください。

サーバ定義ファイルで，サーバにデプロイしたSOAPアプリケーションのコンテキストルートから先頭の「/」を抜いた名称と，識別子が一致しない場合は，すべてデフォルト値で動作します。

トレースファイル出力の重要度の値にERROR，INFO，WARN，DEBUG以外の文字列を設定した場合はデフォルト値（WARN）が仮定されます。

トレースファイル出力の重要度の値はすべて大文字で設定してください。小文字が混在した場合は，その文字列は無効となり，デフォルト値（WARN）が仮定されます。

トレースファイルの面数，トレースファイルのサイズに範囲外の値を設定した場合は，それぞれデフォルト値が仮定されます。

トレース出力先ディレクトリ名およびトレースファイルのプレフィクスの最大長は，トレースファイル名を生成したときの，実行するプラットフォーム上のファイル名の最大長に依存します。実行するプラットフォーム上のファイル名の最大長を超えた場合はトレースが出力されません。

トレースファイル名およびアプリケーションログファイル名の形式は次のようになります。

トレースファイル名の形式

<トレースファイルのプレフィクス>-j2ee-<J2EEサーバのサーバ名>-<トレースファイル面数>.log

アプリケーションログファイル名の形式

<トレースファイルのプレフィクス>-j2ee-<J2EEサーバのサーバ名>-aplog-<トレースファイル面数>.log

単体Javaアプリケーションとして動作させる場合，"-j2ee-<J2EEサーバのサーバ名>"は付与されません。

トレースファイルとアプリケーションログでは，ファイル名に付けられる面数の順序が異なるので注意してください。

トレースファイルの面数

トレースファイルの面数は，トレースの出力時刻に従って「1，2，3・・・」という順で生成されます。動作定義ファイル中のトレースファイル面数を超えた場合は，再度1から生成されます。

アプリケーションログの面数

アプリケーションログは，面数が0のものが，いちばん新しいファイルになります（面数が最も大きいものが，いちばん古いファイルとなります）。

サーバの動作開始時にサーバ定義ファイル（c4websv.cfg）とクライアント定義ファイル（c4webcl.properties）の両方が存在する場合は，サーバ定義ファイル（c4websv.cfg）の設定が有効となります。サーバ定義ファイル（c4websv.cfg）が存在しない場合は，デフォルト値が仮定されます。

クライアントの動作開始時にサーバ定義ファイル（c4websv.cfg）とクライアント定義ファイル（c4webcl.properties）の両方が存在する場合は，クライアント定義ファイル（c4webcl.properties）の設定が有効となります。クライアント定義ファイル（c4webcl.properties）が存在しない場合は，デフォルト値が仮定されます。

trueおよびfalseを設定する場合はすべて小文字で設定してください。大文字または異なる文字列で設定した場合はデフォルト値が仮定されます。

クライアントを同じマシン上で複数動作させる場合で，同じ内容のクライアント定義ファイル（c4webcl.properties）がそれぞれのクライアント実行時クラスパス上に存在するときは，トレースが同じファイルに書き込まれてしまうためトレースが正常に出力されません。トレースファイル出力の排他制御待ちや，トレースファイル中のデータが解析できなくなる現象が発生するおそれがあります。

クライアントを同じマシン上で複数動作させる場合でトレースファイルのプレフィクスを省略したとき，すべてのクライアントのトレースが同じファイルに出力され，トレースの内容が不正確になります。トレースファイル出力の排他制御待ちや，トレースファイル中のデータが解析できなくなる現象が発生するおそれがあります。

動作定義ファイル中では「¥」は特殊文字として扱われるため，Windowsの場合にディレクトリ名のパスの区切り文字に「¥」を使用するときは，「¥¥」のように連続して設定してください。

複数のSOAPサービスを利用する場合，Webアプリケーションのコンテキストパス名をそれぞれ異なる名称にしてください。異なる名称にしない場合，トレース出力先が重複します。そのため，複数のSOAPサービスのトレースが同じファイルに出力されます。

コンテキストパスとは

コンテキストパスとは，コンテキスト内のWebアプリケーションにアクセスするときにURL上に指定するパスのことです。例えば，接続先URLが「http://localhost:8080/WebApp1/services/UserInfo」の場合，コンテキストパスは，「/WebApp1/services/UserInfo」となります。

同一のコンテキストパスを使用する場合

同一のコンテキストパスを使用する場合は，トレースファイル面数，トレースファイルサイズを必要に応じて大きい値にして，障害発生時に必要な情報が削除されてしまわないよう注意してください。

サーバ定義ファイルのトレースファイル，アプリケーションログのプレフィクスを省略した場合，識別子をデフォルト値として使用しますが，SOAPアプリケーションのコンテキストルートの文字列に「$」，「%」，「+」，「/」が含まれる場合，トレースファイル，アプリケーションログのファイル名プレフィクスは次のように置換されます。

コンテキストルートに含まれる文字

ファイル名中の文字

$

$24

%

$25

+

$2b

/

$2f

例えば，接続先URLが「http://localhost:8080/WebApp1/Service1/services/UserInfo」の場合，トレースファイル，アプリケーションログのファイル名プレフィクスは「WebApp1$2fService1-j2ee-<J2EEサーバのサーバ名>-<トレースファイル面数>.log」および「WebApp1$2fService1-j2ee-<J2EEサーバのサーバ名>-aplog-<トレースファイル面数>.log」となります。

なお，上記の文字に置換されたファイルをWindows以外のOS上で操作する場合，ファイル名を指定するときに，シングルクォーテーション「'」で囲む必要があります。

ファイルを削除する場合の例

rm 'WebApp1$2fService1-server1-1.log'

複数のクライアントでクライアント定義ファイルを設定する場合，「log_file_prefix」には，同じ値を設定しないでください。

サーバから別のSOAPアプリケーションを呼び出すような場合（サーバが別のサーバに対するクライアントとなる場合），サーバトレース中にクライアントのトレースが出力されます。この場合，トレースの内容がラップアラウンドによって上書きされる頻度が高いため，サーバ定義ファイルのトレースファイル面数，およびトレースファイルサイズに十分大きい値を指定してください。

SOAPサービスを利用するクライアントを同じマシン上で複数動作させる場合，クライアント定義ファイルのトレースファイル，アプリケーションログのプレフィクス（log_file_prefix）は，クライアントごとに異なる値を設定してください。同じ値を設定すると，実行時オプションの指定による制御が正しく行われません。その他の設定（重要度，面数，ファイルサイズ）については，すべてのクライアントが同じ設定で動作します。

パスワードを設定する場合，動作定義ファイルの読み取り権限を限定するなど，第三者にパスワードを読み取られないように注意してください。

10.6　実行時オプションの設定項目

開発したSOAPアプリケーションを実行するには，SOAPアプリケーションの動作に関する実行時オプションを設定する必要があります。実行時オプションの設定項目を次に示します。

多重参照オプション

データ型定義オプション

HTTPセッションに関するオプション

SOAPヘッダの名前修飾に関するオプション

SOAPAction値の扱いに関するオプション

プロキシオプション

ソケットタイムアウト値オプション

送受信データのサイズチェックオプション

SOAPメッセージのコードに関するオプション

実行時オプションは動作定義ファイルに設定します。動作定義ファイルの設定については，10.2〜10.4の説明を参照してください。また，SOAPクライアントライブラリの実行時に，実行時オプションを動的に設定するためのC4Propertyクラスを提供します。C4Propertyクラスについては，「13.3　C4Propertyクラス（実行時オプションの設定）」を参照してください。

10.6.1　多重参照オプション

サーバおよびクライアントがSOAPメッセージを送信する場合に，扱う複合型データ（構造体）を埋め込み形式または参照形式（ID-REF型）のどちらの形式にするかを設定できます。

埋め込み形式と参照形式は，動作定義ファイルに「do_multirefs」キーを追加して設定します。デフォルトの動作は埋め込み形式です。次に，埋め込み形式および参照形式（ID-REF型）のSOAPメッセージの例を示します。

埋め込み形式のSOAPメッセージの例

<soapenv:Envelope soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <soapenv:Body>
  <ns1:test1 xmlns:ns1="http://XMLschemaType2.test">
   <in0>
    <str1>string</str1>
    <b1>true</b1>
    <f1>10.0</f1>
    <d1>40.0</d1>
    <BD1>123</BD1>
    <TI1>88</TI1>
    <by2>QEFC</by2>
    <QN1>
     <namespaceURI></namespaceURI>
     <localPart>QName</localPart>
    </QN1>
    <BI1>456</BI1>
    <l1>30</l1>
    <i1>43</i1>
    <s1>20</s1>
    <by1>48</by1>
    <da1>99</da1>
   </in0>
  </ns1:test1>
 </soapenv:Body>
</soapenv:Envelope>

参照形式（ID-REF型）のSOAPメッセージの例

<soapenv:Envelope soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <soapenv:Body>
  <ns1:test1 xmlns:ns1="http://XMLschemaType2.test">
   <in0 href="#id0"/>
  </ns1:test1>
  <multiRef id="id0"
soapenc:root="0" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/:encodingStyle">
   <str1>string</str1>
   <b1>true</b1>
   <f1>10.0</f1>
   <d1>40.0</d1>
   <BD1>123</BD1>
   <TI1>88</TI1>
   <by2>QEFC</by2>
   <QN1 href="#id1"/>
   <BI1>456</BI1>
   <l1>30</l1>
   <i1>43</i1>
   <s1>20</s1>
   <by1>48</by1>
   <da1>99</da1>
  </multiRef>
  <multiRef id="id1"
soapenc:root="0" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <namespaceURI></namespaceURI>
   <localPart>QName</localPart>
  </multiRef>
 </soapenv:Body>
</soapenv:Envelope>

注意事項

リテラルエンコーディング使用時は多重参照オプションの指定は有効になりません。多重参照オプションを使用する場合は，SOAPエンコーディングを使用してください。

10.6.2　データ型定義オプション

送信するSOAPメッセージ中にデータ型を含めるかどうかを設定します。データ型はXML Schemaで規定されているデータ型で，接頭辞に「xsi」が付くものを指します。データ型を含めるかどうかは，動作定義ファイルに「send_xsi_types」キーを追加して設定します。

次に，データ型を含んだ場合およびデータ型を含まない場合のSOAPメッセージの例を示します。

データ型を含んだ場合のSOAPメッセージの例

<str1 xsi:type="xsd:string">string</str1>

データ型を含まない場合のSOAPメッセージの例

<str1>string</str1>

注意事項

リテラルエンコーディング使用時は，「send_xsi_types」キーにtrueを設定してもデータ型を含まない場合のSOAPメッセージになります。

10.6.3　HTTPセッションに関するオプション

クライアントからサーバ側のSOAPサービスを呼び出したときに，HTTPセッションを継続するかどうかを設定できます。HTTPセッションを継続するかどうかは，動作定義ファイルに「app_maintainsession」キーを追加して設定します。

デフォルトの動作ではHTTPセッションを継続しません。WSDLからソースコードを生成する場合，またはサービスデプロイ定義を生成する場合で，Deploy Scopeに「Session」を選択したSOAPサービスと接続するときには，trueを設定してください。ただし，このセッションは，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)」で記述している「J2EEサーバ間のセッション情報の引き継ぎ」には対応していません。

10.6.4　SOAPヘッダの名前修飾に関するオプション

送受信するSOAPメッセージにSOAPヘッダが含まれていた場合，SOAP1.1仕様に基づき，「SOAPヘッダの子エレメントが名前修飾されているか」のチェックをするかどうかを設定できます。デフォルトの動作では，名前修飾されているかをチェックします。このオプションは，動作定義ファイルに「enable_soapheader_check」キーを追加して設定します。SOAPヘッダをチェックしない場合は，falseを設定します。

10.6.5　SOAPAction値の扱いに関するオプション

SOAPエンジンでは，HTTPヘッダ中にSOAPAction値自体がない場合にSOAP Faultメッセージを返しています。このオプションの設定によって，SOAPAction値がない場合の動作を，SOAP Faultメッセージを返すか，空文字（""）として振る舞うかを設定できます。SOAPAction値の扱いは，動作定義ファイルに「fault_omit_soapaction」キーを追加して設定します。デフォルトの動作では，SOAP Faultメッセージを返します。なお，このオプションはサーバ定義ファイルで有効です。次に，SOAPAction値がある場合，およびSOAPAction値がない場合のHTTPヘッダの例を示します。

SOAPAction値がある場合のHTTPヘッダの例

POST /WebX/services/XMLschemaType2 HTTP/1.0
Content-Length: 774
Host: localhost
Content-Type: text/xml; charset=utf-8
SOAPAction: ""

SOAPAction値がない場合のHTTPヘッダの例

POST /WebX/services/XMLschemaType2 HTTP/1.0
Content-Length: 774
Host: localhost
Content-Type: text/xml; charset=utf-8

10.6.6　プロキシオプション

クライアントが外部のSOAPサービスを利用するための，プロキシサーバ認証に関するオプションです。SOAPアプリケーション開発支援機能ではプロキシオプションの形式はチェックしません。このオプションはクライアント定義ファイルで有効です。次に，プロキシオプションとして設定する項目について示します。なお，次のオプションの説明にあるホスト名は，IPアドレスに置き換えることもできます。

proxy_host

プロキシサーバのホスト名を設定します。このオプションの内容がnullまたは空文字の場合は，プロキシサーバに接続しません。

non_proxy_hosts

プロキシサーバを利用しないホスト名群を設定します。複数のホスト名を設定する場合は，「|」で区切って設定します。プロキシサーバを利用しないホスト名を設定する場合，ホスト名とホスト名の間には，「|」以外の文字（空白など）を設定しないようにしてください。

proxy_port

プロキシサーバのポート番号を設定します。このオプションの内容がnullまたは空文字の場合は，プロキシサーバに接続しません。

proxy_user

プロキシサーバの認証ユーザIDを設定します。

proxy_password

認証ユーザIDに対応するパスワードを設定します。

注意事項

パスワードを設定する場合，動作定義ファイルの読み取り権限を限定するなど，第三者にパスワードを読み取られないように注意してください。

10.6.7　ソケットタイムアウト値オプション

クライアントからサーバ側のSOAPサービスを呼び出す場合に利用するソケットの接続・書き込み・読み込みタイムアウト値を設定できます。タイムアウト値は，動作定義ファイルに「socket_write_timeout」，「socket_read_timeout」，「socket_connect_timeout」キーを追加して設定します。このキーには0〜86,400の数値を指定できます。デフォルトの動作では「socket_write_timeout」と「socket_connect_timeout」が60秒（1分），「socket_read_timeout」が300秒（5分）を仮定します。

0を指定すると，タイムアウト値は無制限となります。J2EEサーバの同時実行スレッド数を超えて無制限の待ちが発生する場合などには，デッドロックになることがありますので，0を指定する場合は注意してください。また，このオプションに極端に小さい値を設定すると，タイムアウトが頻繁に発生することがあります。この場合は，タイムアウトが発生しない十分な値を設定してください。

注意事項

ソケットの接続タイムアウト値および書き込みタイムアウト値に次のどちらかの値を設定した場合，TCPの持つタイムアウト時間が適用されます。

0

TCPが持つコネクション確立およびデータ送信の再送タイマより長い時間

10.6.8　送受信データのサイズチェックオプション

クライアントとサーバとの間で送受信されるSOAPEnvelopeのサイズ，添付データのサイズ，および添付データの個数をチェックするためのオプションです。

(1)　チェックする項目

チェックする項目を次に示します。これらの項目は送信時，および受信時の場合も同様にチェックしてください。

送受信時のSOAPEnvelopeのバイト数（自動的に付加されるXML宣言を含む）

送受信時の添付データの個数

送受信時の添付データのバイト数

(2)　チェック動作について

チェックする動作について次に示します。

クライアント側

実行時のサイズチェックが不正になった場合，送信時，および受信時には下記の例外を通知します。

表10‒4　実行時のサイズチェックが不正になった場合に通知する例外

モード

通知メソッド

通知する例外

SAAJ

javax.xml.soap.SOAPConnection#call

javax.xml.soap.SOAPException

RPC

サービス呼び出しメソッド

java.rmi.RemoteException

（実際は上記を継承するC4Fault）

サーバ側

実行時のサイズチェックが不正になった場合，送信時，および受信時にはSOAPエンジンによってFaultメッセージを作成し，クライアント側へ送信します。サイズチェックは，SOAPエンジンの内部処理として実施されるため，サーバ側UPには例外などで通知されないことに注意してください。

(3)　Faultメッセージ

サイズチェックに関係するFaultcodeを次に示します。SAAJではFaultメッセージに含まれ，RPCではC4Faultから取得できます。

{http://c4web.cosminexus.com}[Client | Server].SOAPMessageNotPredicted

10.6.9　SOAPメッセージのコードに関するオプション

送信するSOAPメッセージに0x7Fより大きいコードの文字が含まれていた場合，「常に文字参照形式にエンコードする処理」のチェックをするかどうかを設定できます。このオプションは，デフォルトとして文字参照形式でエンコードしないようにし，送信するSOAPメッセージのサイズを縮小します。

11　SOAPアプリケーションで扱うデータ型

この章では，SOAPアプリケーションで扱うデータ型の対応，および注意事項について説明します。

11.1　WSDL定義とソースコードのデータ型の関係

WSDLからソースコードを生成する場合，WSDL定義のデータ型および名前空間のURLによって，生成されるソースコードでのデータ型が異なります。また，JavaクラスからWSDLを生成する場合，Javaクラスのデータ型によって，WSDL定義での名前空間のURLが異なります。

次に示すWSDL定義を例に，生成されるソースコードのデータ型の違いについて説明します。

<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions targetNamespace="http://DefaultNamespace"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:impl="http://DefaultNamespace-impl"
  xmlns:intf="http://DefaultNamespace"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <wsdl:message name="soaplongRequest">
    <wsdl:part name="in0" type="soapenc:long" />  （1）
  </wsdl:message>

  <wsdl:message name="xsdlongRequest">
    <wsdl:part name="in0" type="xsd:long" />       （2）
  </wsdl:message>

                    :

</wsdl:definitions>

WSDL定義の（1）の部分と（2）の部分は同じlong型を使用していますが，使用している名前空間が異なるため，生成されるソースコードのデータ型は異なります。生成されたソースコードでは，（1）の部分はjava.lang.Long型に，（2）の部分はlong型になります。

11.2　WSDLからソースコードを生成する場合のデータ型の関係

WSDL2JavaコマンドでWSDLからソースコードを生成した場合の，WSDL定義のデータ型と名前空間のURL，およびソースコードのデータ型の関係を示します。データ型の対応関係は，次に示す場合によって異なります。

メソッド引数の入出力種別が「IN」，およびメソッド戻り値の場合

メソッド引数の入出力種別が「OUT」および「INOUT」の場合

それぞれの場合に分けて，データ型の対応関係を示します。

11.2.1　メソッド引数の入出力種別が「IN」，およびメソッド戻り値の場合

表11‒1　WSDLからソースコードを生成した場合のデータ型の対応（入出力種別が「IN」，およびメソッド戻り値の場合）

WSDLでのデータ型

Javaでのデータ型

データ型

名前空間URL

anyType※

http://www.w3.org/2001/XMLSchema

java.lang.Object

Array

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Object[]

base64

http://schemas.xmlsoap.org/soap/encoding/

byte[]

base64Binary

http://www.w3.org/2001/XMLSchema

byte[]

boolean

http://www.w3.org/2001/XMLSchema

boolean

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Boolean

byte

http://www.w3.org/2001/XMLSchema

byte

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Byte

date

http://www.w3.org/2001/XMLSchema

java.util.Date

dateTime

http://www.w3.org/2001/XMLSchema

java.util.Calendar

decimal

http://www.w3.org/2001/XMLSchema

java.math.BigDecimal

http://schemas.xmlsoap.org/soap/encoding/

java.math.BigDecimal

double

http://www.w3.org/2001/XMLSchema

double

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Double

float

http://www.w3.org/2001/XMLSchema

float

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Float

hexBinary

http://www.w3.org/2001/XMLSchema

byte[]

int

http://www.w3.org/2001/XMLSchema

int

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Integer

integer

http://www.w3.org/2001/XMLSchema

java.math.BigInteger

http://schemas.xmlsoap.org/soap/encoding/

java.math.BigInteger

long

http://www.w3.org/2001/XMLSchema

long

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Long

QName

http://www.w3.org/2001/XMLSchema

javax.xml.namespace.QName

short

http://www.w3.org/2001/XMLSchema

short

http://schemas.xmlsoap.org/soap/encoding/

java.lang.Short

string

http://www.w3.org/2001/XMLSchema

java.lang.String

http://schemas.xmlsoap.org/soap/encoding/

java.lang.String

duration

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Duration

time

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Time

gYearMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.YearMonth

gYear

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Year

gMonthDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.MonthDay

gDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Day

gMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Month

anyURI

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.URI

normalizedString

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NormalizedString

token

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Token

Name

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Name

NCName

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NCName

NMTOKEN

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NMToken

nonPositiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NonPositiveInteger

negativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NegativeInteger

nonNegativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NonNegativeInteger

unsignedInt

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.UnsignedInt

unsignedShort

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.UnsignedShort

unsignedLong

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.UnsignedLong

unsignedByte

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.UnsignedByte

positiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.PositiveInteger

language

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Language

ID

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Id

IDREF

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.IDRef

ENTITY

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Entity

IDREFS

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.IDRefs

ENTITIES

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Entities

NMTOKENS

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NMTokens

wsi:swaRef

http://ws-i.org/profiles/basic/1.1/xsd

javax.activation.DataHandler

注※

データ型の変数には指定できません。

11.2.2　メソッド引数の入出力種別が「OUT」および「INOUT」の場合

表11‒2　WSDLからソースコードを生成した場合のデータ型の対応（入出力種別が「OUT」，および「INOUT」の場合）

WSDLでのデータ型

Javaでのデータ型

データ型

名前空間URL

anyType※

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ObjectHolder

base64

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.ByteArrayHolder

base64Binary

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteArrayHolder

boolean

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BooleanHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.BooleanWrapperHolder

byte

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.ByteWrapperHolder

date

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.DateHolder

dateTime

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.CalendarHolder

decimal

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BigDecimalHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.BigDecimalHolder

double

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.DoubleHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.DoubleWrapperHolder

float

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.FloatHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.FloatWrapperHolder

hexBinary

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteArrayHolder

int

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.IntHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.IntegerWrapperHolder

integer

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BigIntegerHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.BigIntegerHolder

long

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.LongHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.LongWrapperHolder

QName

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.QNameHolder

short

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ShortHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.ShortWrapperHolder

string

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.StringHolder

http://schemas.xmlsoap.org/soap/encoding/

javax.xml.rpc.holders.StringHolder

duration

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.DurationHolder

time

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.TimeHolder

gYearMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.YearMonthHolder

gYear

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.YearHolder

gMonthDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.MonthDayHolder

gDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.DayHolder

gMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.MonthHolder

anyURI

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.URIHolder

normalizedString

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NormalizedStringHolder

token

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.TokenHolder

nonPositiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NonPositiveIntegerHolder

negativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NegativeIntegerHolder

nonNegativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NonNegativeIntegerHolder

unsignedInt

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedIntHolder

unsignedShort

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedShortHolder

unsignedLong

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedLongHolder

unsignedByte

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedByteHolder

positiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.PositiveIntegerHolder

wsi:swaRef

http://ws-i.org/profiles/basic/1.1/xsd

org.apache.axis.holders.DataHandlerHolder

注※

データ型の変数には指定できません。

11.3　JavaクラスからWSDLを生成する場合のデータ型の関係

Java2WSDLコマンドでJavaクラスからWSDLを生成した場合の，WSDL定義のデータ型と名前空間のURL，およびソースコードのデータ型の関係を示します。

表11‒3　JavaクラスからWSDLを生成した場合のデータ型の対応

Javaでのデータ型

WSDLでのデータ型

データ型

名前空間のURL

boolean

boolean

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BooleanHolder

byte

byte

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteHolder

byte[]

base64※3

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.ByteArrayHolder

double

double

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.DoubleHolder

float

float

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.FloatHolder

int

int

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.IntHolder

long

long

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.LongHolder

short

short

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ShortHolder

java.lang.Byte

byte

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.ByteWrapperHolder

java.lang.Byte[]

SequenceOf_soapenc_byte※3

definitions要素のtargetNamespace※1

javax.xml.rpc.holders.ByteWrapperArrayHolder

java.lang.Double

double

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.DoubleWrapperHolder

java.lang.Float

float

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.FloatWrapperHolder

java.lang.Integer

int

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.IntegerWrapperHolder

java.lang.Long

long

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.LongWrapperHolder

java.lang.Object

anyType

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ObjectHolder

java.lang.Object[]

SequenceOf_xsd_anyType

definitions要素のtargetNamespace※2

java.lang.Short

short

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.ShortWrapperHolder

java.lang.String

string

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.StringHolder

java.math.BigDecimal

decimal

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.BigDecimalHolder

java.math.BigInteger

integer

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.BigIntegerHolder

java.util.Date

date

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.DateHolder

javax.xml.namespace.QName

QName

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.QNameHolder

java.lang.Boolean

boolean

http://schemas.xmlsoap.org/soap/encoding/※3

javax.xml.rpc.holders.BooleanWrapperHolder

java.util.Calendar

dateTime

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.CalendarHolder

org.apache.axis.types.Duration

duration

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.DurationHolder

org.apache.axis.types.Time

time

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.TimeHolder

org.apache.axis.types.YearMonth

gYearMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.YearMonthHolder

org.apache.axis.types.Year

gYear

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.YearHolder

org.apache.axis.types.MonthDay

gMonthDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.MonthDayHolder

org.apache.axis.types.Day

gDay

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.DayHolder

org.apache.axis.types.Month

gMonth

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.MonthHolder

org.apache.axis.types.URI

anyURI

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.URIHolder

org.apache.axis.types.NormalizedString

normalizedString

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NormalizedStringHolder

org.apache.axis.types.Token

token

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.TokenHolder

org.apache.axis.types.Name

Name

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NCName

NCName

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NMToken

NMTOKEN

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NonPositiveInteger

nonPositiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NonPositiveIntegerHolder

org.apache.axis.types.NegativeInteger

negativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NegativeIntegerHolder

org.apache.axis.types.NonNegativeInteger

nonNegativeInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.NonNegativeIntegerHolder

org.apache.axis.types.UnsignedInt

unsignedInt

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedIntHolder

org.apache.axis.types.UnsignedLong

unsignedLong

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedLongHolder

org.apache.axis.types.UnsignedShort

unsignedShort

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedShortHolder

org.apache.axis.types.UnsignedByte

unsignedByte

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.UnsignedByteHolder

org.apache.axis.types.PositiveInteger

positiveInteger

http://www.w3.org/2001/XMLSchema

org.apache.axis.holders.PositiveIntegerHolder

org.apache.axis.types.Language

language

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Id

ID

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.IDRef

IDREF

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Entity

ENTITY

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.IDRefs

IDREFS

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.Entities

ENTITIES

http://www.w3.org/2001/XMLSchema

org.apache.axis.types.NMTokens

NMTOKENS

http://www.w3.org/2001/XMLSchema

javax.activation.DataHandler

wsi:swaRef

http://ws-i.org/profiles/basic/1.1/xsd

org.apache.axis.holders.DataHandlerHolder

注※1

WSDL内に次に示すtypes要素が生成されます。出力形式はJava2WSDLコマンドでの引数のオプションの設定値で異なります。

(1) Java2WSDLコマンドの引数で"-T 1.1"を指定した場合

<schema targetNamespace="http://localhost" (definitions要素のtargetNamespace)
  xmlns="http://www.w3.org/2001/XMLSchema">
  <complexType name="SequenceOf_xsd_byte">
    <sequence>
      <element name="item" minOccurs="0" maxOccurs="unbounded" type="xsd:byte" />
    </sequence>
  </complexType>
</schema>

(2) Java2WSDLコマンドの引数で"-T 1.2"を指定した場合

<schema targetNamespace="http://localhost" (definitions要素のtargetNamespace)
  xmlns="http://www.w3.org/2001/XMLSchema">
  <complexType name="SequenceOf_soapenc_byte">
    <complexContent>
      <restriction base="soapenc:Array">
        <attribute ref="soapenc:arrayType" wsdl:arrayType="soapenc:byte[]"/>
      </restriction>
    </complexContent>
  </complexType>
</schema>

注※2

WSDL内に次に示すtypes要素が生成されます。出力形式はJava2WSDLコマンドでの引数の設定値で異なります。

(1)Java2WSDLコマンドの引数で"-T 1.1"を指定した場合

<schema targetNamespace="http://localhost" (definitions要素のtargetNamespace)
  xmlns="http://www.w3.org/2001/XMLSchema">
  <complexType name="SequenceOf_xsd_anyType">
    <sequence>
      <element name="item" minOccurs="0" maxOccurs="unbounded" type="xsd:anyType" />
    </sequence>
  </complexType>
</schema>

(2)Java2WSDLコマンドの引数で"-T 1.2"を指定した場合

<schema targetNamespace="http://localhost" (definitions要素のtargetNamespace)
  xmlns="http://www.w3.org/2001/XMLSchema">
  <complexType name="SequenceOf_xsd_anyType">
    <complexContent>
      <restriction base="soapenc:Array">
        <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[]"/>
      </restriction>
    </complexContent>
  </complexType>
</schema>

注※3

Java2WSDLコマンドの引数で"-T 1.1"を指定した場合の，データ型の対応を次の表に示します。

表11‒4　JavaクラスからWSDLを生成した場合のデータ型の対応

Javaでのデータ型

WSDLでのデータ型

データ型

名前空間のURL

byte[]

base64Binary

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteArrayHolder

java.lang.Byte

byte

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ByteWrapperHolder

java.lang.Byte[]

SequenceOf_xsd_byte

definitions要素のtargetNamespace

javax.xml.rpc.holders.ByteWrapperArrayHolder

java.lang.Double

double

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.DoubleWrapperHolder

java.lang.Float

float

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.FloatWrapperHolder

java.lang.Integer

int

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.IntegerWrapperHolder

java.lang.Long

long

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.LongWrapperHolder

java.lang.Short

short

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.ShortWrapperHolder

java.lang.String

string

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.StringHolder

java.math.BigDecimal

decimal

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BigDecimalHolder

java.math.BigInteger

integer

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BigIntegerHolder

java.lang.Boolean

boolean

http://www.w3.org/2001/XMLSchema

javax.xml.rpc.holders.BooleanWrapperHolder

Java2WSDLコマンドの引数については「9.1　Java2WSDLコマンド（WSDLの生成）」を参照してください。

11.4　データ型についての注意事項

SOAPアプリケーション開発支援機能およびSOAP通信基盤で扱うデータ型についての注意事項を示します。

java.util.Calendarクラスのタイムゾーンについて

SOAPクライアントとSOAPサービス間のインタフェースとして，java.util.Calendarクラスを利用した場合，この製品から渡ってくるjava.util.Calendarクラスのオブジェクトにはタイムゾーンとして"GMT"が設定されています。したがって，java.util.Calendarクラスのオブジェクトに設定されているタイムゾーンが異なる場合，オブジェクトの比較ができないことがありますので注意してください。

org.apache.axis.types.Languageクラスのコンストラクタにxsd:language型で許容しない文字を指定した場合の注意

org.apache.axis.types.Languageクラスのコンストラクタに，xsd:language型で許容しない文字を指定しても，例外が発生しないでオブジェクトの生成が成功します。

12　標準仕様との対応

この章では，SOAP，WSDL，SAAJ，およびJAXRの仕様と，SOAPアプリケーション開発支援機能およびSOAP通信基盤で利用できる機能の関係について説明します。

12.1　SOAP 1.1との対応

SOAP 1.1の仕様と，SOAPアプリケーション開発支援機能およびSOAP通信基盤で利用できる機能の関係について次の表に示します。大分類に示した章番号は，W3CのSOAP 1.1の仕様に記載されている章番号を表します。

表12‒1　SOAP 1.1仕様のサポート範囲の一覧

分類

サポート

備考

大分類

小分類

SOAPメッセージ交換モデル

（2章）

ワンウェイ

×

メッセージの一方送信について規定しています。

リクエスト・レスポンス

○

要求メッセージの送信，および応答メッセージの受信について規定しています。

マルチキャスト

×

特定多数のメッセージ送信について規定しています。

XMLとの関係

（3章）

SOAPエンベロープ名前空間

○

SOAPエンベロープで使用する名前空間について規定しています。SOAPエンベロープは，http://schemas.xmlsoap.org/soap/envelope/で識別します。

SOAP直列化名前空間

○

SOAP直列化の名前空間について規定しています。SOAPの直列化規則は，http://schemas.xmlsoap.org/soap/encoding/で識別します。

uri-reference型の参照

○

XML1.0，XML Schema1.0，およびXML Linking Language1.0に従った仕様です。

一般の属性，値のSOAPエンベロープへの出現

○

SOAPエンベロープでの，一般の属性と値の出現について規定しています。

SOAPエンベロープ

（4章）

構文

○

SOAPエンベロープの構文について規定しています。

SOAP encodingStyle属性

○

エンコーディングスタイルについて規定しています。エンコーディングスタイルで，任意の要素に対して直列化規則を指定できます。

SOAPヘッダ

（4章）

構文

○

SOAPヘッダの構文について規定しています。

要素の無視

○

SOAP Header要素の子要素以外のSOAPヘッダ属性を無視します。

actor

○

指定したSOAPヘッダ項目の受信者について規定しています。

mustUnderstand

○

指定したSOAPヘッダ項目が必須の処理であることを示します。

SOAPボディ

（4章）

構文

○

SOAPボディの構文について規定しています。

名前空間修飾

○

SOAP Body要素の子要素は，名前空間で修飾されていてもかまいません。

SOAP Fault

（4章）

コード

○

SOAP Faultのコードを規定します。

SOAP符号化

（5章）

単一参照

○

一つのアクセサだけが参照している値の直列化について規定しています。

多重参照

○

二つ以上のアクセサによって参照される可能性がある値の直列化について規定しています。

単純データ型

△

WSDLでsimpleTypeで表されるデータ型の直列化について規定しています。

バイト配列・文字列

○

バイト配列および文字列の直列化について規定しています。

列挙

△

列挙型の直列化について規定しています。

構造体（連結）

○

構造体（連結構造体を含む）の直列化について規定しています。

複合データ型

△

WSDLでcomplexTypeで表されるデータ型の直列化について規定しています。

配列（疎，部分，Jagged，多次元）

△

疎である配列，部分配列，Jagged配列，および多次元配列の直列化について規定しています。Jagged配列とは，要素そのものが配列となっているものをいいます。RPC形態のアプリケーションでは，疎である配列，部分配列を生成できません。

デフォルト値

△

アクセサ要素の省略について規定しています。

RPC形態のアプリケーションで扱えるNULL値は，xsi:nil="true"の形式だけです。

多態的アクセサ

×

多態的アクセサとは，共用体など実行時にデータ型が決まるものを示します。

HTTP

（6章）

SOAPAction

○

SOAPのリクエストメッセージの意図を示すURIを示します。

SOAPHTTPレスポンス

○

HTTP1.0のStatusコードに従います。

HTTP拡張フレームワーク

×

SOAPのHTTP拡張フレームワークでの使用について規定しています。

（凡例）

○：サポートされます。

△：制限付きでサポートされます。

×：サポートされません。

12.2　WSDL 1.1との対応

SOAPアプリケーションを開発するときに留意が必要な，WSDLのサポート範囲を示します。

12.2.1　WSDL 1.1仕様のサポート範囲

WSDL 1.1仕様と，SOAPアプリケーション開発支援機能およびSOAP通信基盤で利用できる機能の関係について説明します。また，日本語で定義する場合のサポート範囲についても示します。

(1)　WSDL 1.1仕様のサポート範囲

表12‒2　WSDL 1.1仕様のサポート範囲

分類

サポート

備考

大分類

小分類

サービス定義：WSDL ドキュメント構造

ドキュメントの名前付けとリンク

○

名前空間のスコープについて規定しています。

作成スタイル（部品のimport要素による取り込み）

△

ほかのファイルのimport要素による取り込みについて規定しています。外部のインポート情報（URL）は取り込めません。

言語の拡張性とバインディング

×

wsdl:required属性のデプロイについて規定しています。

ドキュメンテーション

○

要素内のコメントについて規定しています。

サービス定義：タイプ

△

扱うデータ型について規定しています。扱えるデータ型については，「11.　SOAPアプリケーションで扱うデータ型」を参照してください。

サービス定義：メッセージ

△

メッセージの論理定義を規定しています。

サービス定義：ポートタイプ

一方向操作

×

メッセージの一方向操作について規定しています。

要求/応答操作

○

メッセージの要求/応答操作について規定しています。

送信請求/応答操作

×

メッセージの送信要求/応答操作について規定しています。

通知操作

×

メッセージの通知操作について規定しています。

操作内の要素の名前

○

inputおよびoutput要素のname属性を示します。オーバーロードはできません。WSDL内では名称を一意にする必要があります。

操作内のパラメタの順序

○

操作内のパラメタの順序について規定しています。parameterOrder属性によって，パラメタのリストを指定できます。

サービス定義：バインディング

○

メッセージ形式とプロトコルの詳細の定義を規定しています。

サービス定義：ポート

○

サービスの物理的定義について規定しています。

サービス定義：サービス

△

サービスの位置について規定しています。一つのWSDLに複数のSOAPサービスを対応させることはできません。

SOAP バインディング

soap:binding

○

SOAP形式のバインディングを規定しています。

soap:operation

△

SOAPオペレーションへの情報について規定しています。RPC利用時の指定要素で使用できます。

soap:body

△

SOAP Body要素内でのメッセージ部分の表示方法について規定しています。RPC利用時の指定要素で使用できます。

soap:fault

○

SOAP Fault Details要素の内容について規定しています。

soap:headerとsoap:headerfault

×

SOAP Header要素内の内容について規定しています。

soap:address

○

port要素のアドレスについて規定しています。

MIMEバインディング

mime:content

×

MIMEタイプを規定しています。

mime:multipartRelated

×

MIMEパートの任意のセットを集約しています。

mime:part

×

個々のMIMEパートを規定しています。

mime:mimeXml

×

特定のスキーマを持っているXMLペイロードを規定しています。SOAPには準拠していません。

（凡例）

○：サポートされます。

△：制限付きでサポートされます。

×：サポートされません。

(2)　WSDL 1.1仕様での日本語のサポート範囲

document/literal使用時のWSDLのサポート範囲を示します。

表12‒3　WSDLの要素と日本語のサポート範囲

要素

属性

データ型

日本語サポート

definitions

┃

┃

┃

┃

┃

name

NMTOKEN

○

targetNamespace

anyURI

△

xmlns:xxx

anyURI

△

xmlns

anyURI

△

┣

┃

┃

documentation

−

−

−

┗

text

−

−

○

┣

┃

import

namespace

anyURI

△

location

anyURI

△

┃

┗

documentation

−

−

○

┣

types

−

−

−

┃

┣

documentation

−

−

○

┃

┃

┃

┃

┃

┃

┗

any

−

−

「12.2.4　XML Schemaのサポート範囲」を参照してください。

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

message

name

NCName

○

┣

documentation

−

−

○

┗

part

name

NMTOKEN

○

element

QName

○

type

QName

○

┗

documentation

−

−

×

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

portType

name

NMTOKEN

○

┣

documentation

−

−

○

┗

operation

−

−

−

┣

┃

┃

┃

documentation

−

−

○

name

NMTOKEN

○

parameterOrder

NMTOKENS

○

┣

┃

┃

┃

input

name

NMTOKEN

○

message

QName

○

┗

documentation

−

−

○

┣

┃

┃

┃

output

name

NMTOKEN

○

message

QName

○

┗

documentation

−

−

○

┗

fault

name

NMTOKEN

○

message

QName

○

┗

documentation

−

−

○

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

┃

binding

name

NMTOKEN

○

type

QName

○

┣

documentation

−

−

○

┣

┃

┃

soap:binding

style

string

×

transport

anyURI

×

┗

operation

name

NMTOKEN

○

┣

documentation

−

−

○

┣

┃

soap:operation

soapAction

anyURI

×

style

string

×

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

input

name

NMTOKEN

○

┣

documentation

−

−

○

┣

soap:header※1

−

−

×

┗

soap:body

parts

NMTOKEN

○

use

string

×

encodingStyle

anyURI-list

×

namespace

anyURI

△

┣

┃

┃

┃

┃

┃

┃

┃

┃

┃

output

name

NMTOKEN

○

┣

documentation

−

−

○

┣

soap:header※1

−

−

×

┗

soap:body

parts

NMTOKEN

○

use

string

×

encodingStyle

anyURI-list

×

namespace

anyURI

△

┗

fault

name

NMTOKEN

○

┣

documentation

−

−

○

┗

soap:fault

name

NMTOKEN

○

use

string

×

encodingStyle

anyURI-list

×

namespace

anyURI

△

┗

service

name

NMTOKEN

○

┣

documentation

−

−

○

┗

port

name

NCName

○

binding

QName

○

┣

documentation

−

−

○

┗

soap:address

location

anyURI

△※2

（凡例）

○：サポートされます。

△：サポートされます。ただし，パーセントエンコードした値を定義する必要があります。パーセントエンコードするときに使用できる符号化形式はUTF-8です。

×：サポートされません。

−：該当しないことを表します。

注※1

soap:header要素，およびsoap:header要素に含まれる子要素（soap:headerfault要素）は，属性を含めてすべてサポートされません。

注※2

URLの末尾（例の下線部分）にだけ日本語を指定できます。

（例）http://localhost:8080/RPCSampleService/service/UserInfo

12.2.2　Javaの基本データ型のサポート範囲

SOAPアプリケーション開発支援機能およびSOAP通信基盤を使用する場合の，Javaの基本データ型のサポート範囲について次の表に示します。

表12‒4　Java基本データ型のサポート範囲の一覧

Javaの基本データ型

サポート

Javaの基本データ型

サポート

boolean

○

short

○

byte

○

int

○

byte[]

○

long

○

char

×

float

○

char[]

×

double

○

（凡例）

○：サポートされます。

×：サポートされません。

12.2.3　XML Schemaのデータ型のサポート範囲

SOAPアプリケーション開発支援機能およびSOAP通信基盤を使用する場合の，XML Schemaのデータ型，およびデータ型の列挙のサポート範囲について次の表に示します。

表12‒5　XML Schemaのデータ型，およびデータ型列挙のサポート範囲の一覧

XML Schemaのデータ型

データ型

データ型の列挙

attribute要素

list要素※1

xsd:duration

○

○

○

○

xsd:dateTime※2

○

×

○

○

xsd:time

○

×

○

○

xsd:date

○

×

○

○

xsd:gYearMonth

○

○

○

○

xsd:gYear

○

○

○

○

xsd:gMonthDay

○

○

○

○

xsd:gDay

○

○

○

○

xsd:gMonth※3

○

○

○

○

xsd:boolean

○

×

○

○

xsd:base64Binary※4

○

×

○

×

xsd:hexBinary※4

○

×

○

×

xsd:float

○

○

○

○

xsd:double

○

○

○

○

xsd:anyURI※5

○

×

○

○

xsd:QName

○

○

○

○

xsd:string

○

○

○

○

xsd:normalizedString※5

○

×

○

○

xsd:token※5

○

○

○

○

xsd:language※5

△

○

○

○

xsd:Name※5

△

○

○

○

xsd:NCName※5

△

○

○

○

xsd:ID※5

△

○

○

○

xsd:IDREF※5

△

○

○

○

xsd:ENTITY※5

△

○

○

○

xsd:IDREFS※5

△

×

○

×

xsd:ENTITIES※5

△

×

○

×

xsd:NMTOKEN※5

△

○

○

○

xsd:NMTOKENS※5

△

×

○

×

xsd:decimal

○

○

○

○

xsd:integer

○

○

○

○

xsd:nonPositiveInteger

○

○

○

○

xsd:negativeInteger

○

○

○

○

xsd:long

○

○

○

○

xsd:int

○

○

○

○

xsd:short

○

○

○

○

xsd:byte

○

○

○

○

xsd:nonNegativeInteger

○

○

○

○

xsd:unsignedInt

○

○

○

○

xsd:unsignedShort

○

○

○

○

xsd:unsignedByte

○

○

○

○

xsd:unsignedLong※3

○

○

○

○

xsd:positiveInteger

○

○

○

○

xsd:anyType※4※6※7

○

×

×

×

xsd2000:timeInstant※8

×

×

×

×

（凡例）

○：サポートされます。

△：INパラメタおよび戻り値だけサポートされます。

×：サポートされません。

注※1

xsd:list要素のitemType属性に指定するデータ型を指します。

注※2

xsd:dateTime型で紀元前の日付を送信すると，SOAPメッセージ中の日付が正しい値にならないため，受信側で正しい値を受信できません。

注※3

gMonthおよびUnsignedLongには次に示す制限があります。サポート範囲外の値を使用した場合，他社製品と通信できないおそれがあります。

表12‒6　gMonthおよびUnsignedLongの制限

WSDLでのデータ型

注意事項

gMonth

gMonthの送受信パターンは--MM--です。--MMのパターンは扱えません。

UnsignedLong

UnsignedLongの範囲は0〜9,007,199,254,740,992の整数です。最大値を超えたデータを送受信した場合，値が異なる可能性があるため，範囲内で使用してください。

注※4

WSDLのスタイルがRPC／ENCODEDの場合，wsdl:arrayType属性を使用してsoapenc:Array型を制限した複合型を使用できません。wsdl:arrayType属性に指定しないでください。

注※5

空文字列を送信すると受信時にnullになります。

注※6

複合型の中でmaxOccurs属性を指定した要素は，配列として使用できません。maxOccurs属性を指定した要素のtype属性には指定しないでください。

注※7

xsd:anyType型で，配列型の値を送信しないでください。xsd:anyType型で，配列型の値を送信すると，SOAP Faultまたは例外が発生する場合があります。

注※8

xsd2000:timeInstantは使用できません。代わりに，xsd:dateTimeを使用してください。

12.2.4　XML Schemaのサポート範囲

document/literal使用時のXML Schemaのサポート範囲を示します。

表12‒7　XML Schemaのサポート範囲

要素名

サポート

属性名

サポート

日本語サポート

schema

○

id

○

○

attributeFormDefault

○

×

blockDefault

△

×

elementFormDefault

○

×

finalDefault

△

×

targetNamespace

○

△

version

△

○

xml:lang

△

×

xmlns:xxx

○

△

xmlns

○

△

include

○

id

○

○

schemaLocation

○

△

import

○

id

○

○

namespace

○

△

schemaLocation

○

△

redefine

×

id

×

×

schemaLocation

×

×

element

（グローバル）

○

id

○

○

abstract

○

×

final

×

×

substitutionGroup

×

×

block

△

×

default

×

×

fixed

×

×

name

○

○

nillable

○

×

type

○

○

element

（ローカル）

○

id

○

○

minOccurs

○

×

maxOccurs

○

×

form

○

×

block

△

×

default

×

×

fixed

×

×

name

○

○

nillable

○

×

type

○

○

ref

○

○

simpleType

（グローバル）※1※2

○

id

○

○

final

△

×

name

○

○

simpleType

（ローカル）※1※2

○

id

○

○

complexType

（グローバル）

○

id

○

○

abstract

○

×

block

△

×

final

△

×

mixed

×

×

name

○

○

complexType

（ローカル）

○

id

○

○

mixed

×

×

all

○※3

id

○

○

minOccurs

○

×

maxOccurs

○

×

sequence

○※3

id

○

○

minOccurs

×

×

maxOccurs

×

×

choice

×

id

×

×

minOccurs

×

×

maxOccurs

×

×

any

×

id

×

×

minOccurs

×

×

maxOccurs

×

×

namespace

×

×

processContents

×

×

group

×

id

×

×

minOccurs

×

×

maxOccurs

×

×

ref

×

×

name

×

×

attribute

（グローバル）

○

id

○

○

default

×

×

fixed

×

×

name

○

○

type

○

○

wsdl:arrayType

○

○

attribute

（ローカル）

○※3

id

○

○

default

×

×

fixed

×

×

name

○

○

type

○

○

wsdl:arrayType

○

○

ref

○

○

form

○

×

use

×

×

anyAttribute

×

id

×

×

namespace

×

×

attributeGroup

×

id

×

×

name

×

×

ref

×

×

list※4

○

id

○

○

itemType

○

○

union

×

id

×

×

memberTypes

×

×

enumeration

○

value

○

×

minExclusive

△

value

△

×

fixed

×※5

×

minInclusive

△

value

△

×

fixed

×※5

×

maxExclusive

△

value

△

×

fixed

×※5

×

maxInclusive

△

value

△

×

fixed

×※5

×

totalDigits

△

value

△

×

fractionDigits

△

value

△

×

length

△

value

△

×

minLength

△

value

△

×

maxLength

△

value

△

×

whiteSpace

△

value

△

○

fixed

×※5

×

pattern

△

value

△

○

complexContent※6

○

id

○

○

mixed

×

×

simpleContent

×

id

×

×

restriction※2※6

○

id

○

○

base

○

○

extension※7

○

id

○

○

base

○

○

unique

×

id

×

×

name

×

×

key

×

id

×

×

name

×

×

keyref

×

id

×

×

name

×

×

refer

×

×

selector

×

id

×

×

xpath

×

×

field

×

id

×

×

xpath

×

×

notation

×

id

×

×

name

×

×

public

×

×

system

×

×

annotation

○

id

○

○

appinfo※8

○

source

○

×

documentation

○

source

○

×

xml:lang

○

×

（凡例）

○：サポートされます。

△：指定しても機能は有効になりません。アプリケーションで対応してください。

×：サポートされません。

注※1

simpleType要素およびunion要素は子要素として指定できません。また，restriction要素およびlist要素の記述には制限があります。注意事項およびサポートされない要素の代替記述については，「12.2.8　XML Schema記述時の注意事項」の該当する注意事項を参照してください。

注※2

restriction要素のbase属性は必ず指定してください。また，simpleType要素の子要素にrestriction要素を記述する場合には，base属性を指定し，その子要素にはenumeration要素だけを記述してください。この組み合わせ以外では，不正なソースが生成されます。

注※3

次の要素を合計した数は254個までです。255個以上は記述できません。

・all要素またはsequence要素の子要素

・all要素またはsequence要素の兄弟要素であるattribute要素

合計で255個以上記述した場合，不正なソースが生成されます。

注※4

list要素を記述する場合，itemType属性を必ず指定してください。また，子要素にsimpleType要素は記述できません。記述できない属性，要素を記述した場合，不正なソースが生成されます。

注※5

facetのfixed属性とは，facetを設定している型を派生（extensionまたはrestriction）させるときに派生する型のことです。fixed属性は，facetの値の変更を禁止します（デフォルトはfalse）。

注※6

complexContent要素の子要素にrestriction要素を記述する場合には，base属性を指定し，その属性値には"soapenc:Array"だけを指定できます。この組み合わせ以外では，不正なソースが生成されます。

注※7

complexContentの子要素だけをサポートしています。

注※8

WSDL2Javaコマンドは，記述した内容を無視します。

12.2.5　soapencoding型のサポート範囲

SOAPアプリケーション開発支援機能およびSOAP通信基盤を使用する場合の，soapencoding型のサポート範囲について次の表に示します。

表12‒8　soapencoding型のサポート範囲の一覧

データ型

サポート

attribute要素，データ型を参照する修飾名※1

string

○

×

boolean

○

×

double

○

×

float

○

×

int

○

×

long

○

×

short

○

×

byte

○

×

integer

○

×

decimal

○

×

Array

△

×

base64※2

○

×

（凡例）

○：サポートされます。

△：INパラメタで使用する場合だけサポートされます。

×：サポートされません。

注※1

データ型を参照する修飾名とは，base属性およびitemType属性に指定するデータ型を指します。

注※2

WSDLのスタイルがRPC／ENCODEDの場合，wsdl:arrayType属性を使用してsoapenc:Array型を制限した複合型を使用できません。wsdl:arrayType属性に指定しないでください。

12.2.6　DII使用時のサポート範囲

DII使用時に留意が必要なXMLデータ型，XML Schemaのデータ型，およびsoapencoding型のサポート範囲を示します。

(1)　XMLデータ型のサポート範囲（DII使用時）

表12‒9　XMLデータ型のサポート範囲（DII使用時）

XMLデータ型

サポート

備考

XML Schemaのデータ型

○

パラメタの種別によって未サポートの場合があります。詳細は，表12-10を参照してください。

XML Schemaのデータ型の列挙

×

−

XMLSchemaのデータ型の配列

○

−

soapencoding型

○

パラメタの種別によって未サポートの場合があります。詳細は，表12-11を参照してください。

soapencoding型の列挙

×

−

soapencoding型の配列

○

−

ユーザ定義のデータ型クラス

○

−

ユーザ定義例外

○

−

（凡例）

○：サポートされます。

×：サポートされません。

(2)　XML Schemaのデータ型のサポート範囲（DII使用時）

表12‒10　XML Schemaのデータ型のサポート範囲（DII使用時）

XML Schemaのデータ型

Javaデータ型

サポート

IN

RET

OUT

INOUT

xsd:anyType

java.lang.Object

○

○

○

○

xsd:base64Binary

byte[]

○

○

×

×

xsd:boolean

java.lang.Boolean

○

○

○

○

xsd:byte

java.lang.Byte

○

○

○

○

xsd:date

java.util.Date

○

○

○

○

xsd:dateTime※1

java.util.GregorianCalendar

○

○

○

○

xsd:decimal

java.math.BigDecimal

○

○

○

○

xsd:double

java.lang.Double

○

○

○

○

xsd:float

java.lang.Float

○

○

○

○

xsd:hexBinary

byte[]

○

○

○

○

xsd:int

java.lang.Integer

○

○

○

○

xsd:integer

java.math.BigInteger

○

○

○

○

xsd:long

java.lang.Long

○

○

○

○

xsd:QName

javax.xml.namespace.QName

○

○

○

○

xsd:short

java.lang.Short

○

○

○

○

xsd:string

java.lang.String

○

○

○

○

xsd:duration

org.apache.axis.types.Duration

○

○

○

○

xsd:time

org.apache.axis.types.Time

○

○

○

○

xsd:gYearMonth

org.apache.axis.types.YearMonth

○

○

○

○

xsd:gYear

org.apache.axis.types.Year

○

○

○

○

xsd:gMonthDay

org.apache.axis.types.MonthDay

○

○

○

○

xsd:gDay

org.apache.axis.types.Day

○

○

○

○

xsd:gMonth

org.apache.axis.types.Month

○

○

○

○

xsd:anyURI※2

org.apache.axis.types.URI

○

○

○

○

xsd:normalizedString※2

org.apache.axis.types.NormalizedString

○

○

○

○

xsd:token※2

org.apache.axis.types.Token

○

○

○

○

xsd:Name※2

org.apache.axis.types.Name

○

○

×

×

xsd:NCName※2

org.apache.axis.types.NCName

○

○

×

×

xsd:NMTOKEN※2

org.apache.axis.types.NMTOKEN

○

○

×

×

xsd:nonPositiveInteger

org.apache.axis.types.NonPositiveInteger

○

○

○

○

xsd:negativeInteger

org.apache.axis.types.NegativeInteger

○

○

○

○

xsd:nonNegativeInteger

org.apache.axis.types.NonNegativeInteger

○

○

○

○

xsd:unsignedInt

org.apache.axis.types.UnsignedInt

○

○

○

○

xsd:unsignedShort

org.apache.axis.types.UnsignedShort

○

○

○

○

xsd:unsignedLong

org.apache.axis.types.UnsignedLong

○

○

○

○

xsd:unsignedByte

org.apache.axis.types.UnsignedByte

○

○

○

○

xsd:positiveInteger

org.apache.axis.types.PositiveInteger

○

○

○

○

xsd:language※2

org.apache.axis.types.Language

○

○

×

×

xsd:ID※2

org.apache.axis.types.Id

○

○

×

×

xsd:IDREF※2

org.apache.axis.types.IDRef

○

○

×

×

xsd:ENTITY※2

org.apache.axis.types.Entity

○

○

×

×

xsd:IDREFS※2

org.apache.axis.types.IDRefs

○

○

×

×

xsd:ENTITIES※2

org.apache.axis.types.Entities

○

○

×

×

xsd:NMTOKENS※2

org.apache.axis.types.NMTokens

○

○

×

×

xsd2000:timeInstant※3

java.util.GregorianCalendar

×

×

×

×

（凡例）

IN：INパラメタとして使用します。

RET：戻り値として使用します。

OUT：OUTパラメタとして使用します。

INOUT：INOUTパラメタとして使用します。

○：サポートされます。

×：サポートされません。

注※1

xsd:dateTime型で紀元前の日付を送信すると，SOAPメッセージ中の日付が正しい値にならないため，受信側で正しい値を受信できません。

注※2

空文字列を送信すると受信時にnullになります。

注※3

xsd2000:timeInstantは使用できません。代わりに，xsd:dateTimeを使用してください。

(3)　soapencoding型のサポート範囲（DII使用時）

表12‒11　soapencoding型のサポート範囲（DII使用時）

XML Schemaのデータ型

Javaデータ型

サポート

IN

RET

OUT

INOUT

soapenc:Array

java.lang.Object[]

○

○

×

×

soapenc:base64

byte[]

○

○

×

×

soapenc:boolean

java.lang.Boolean

○

○

○

○

soapenc:byte

java.lang.Byte

○

○

○

○

soapenc:decimal

java.math.BigDecimal

○

○

○

○

soapenc:double

java.lang.Double

○

○

○

○

soapenc:float

java.lang.Float

○

○

○

○

soapenc:int

java.lang.Integer

○

○

○

○

soapenc:integer

java.math.BigInteger

○

○

○

○

soapenc:long

java.lang.Long

○

○

○

○

soapenc:short

java.lang.Short

○

○

○

○

soapenc:string

java.lang.String

○

○

○

○

（凡例）

IN：INパラメタとして使用します。

RET：戻り値として使用します。

OUT：OUTパラメタとして使用します。

INOUT：INOUTパラメタとして使用します。

○：サポートされます。

×：サポートされません。

12.2.7　.NET Framework使用時のサポート範囲

.NET Framework使用時のXML Schemaのデータ型，およびXML Schemaのサポート範囲を示します。

(1)　XML Schemaのデータ型のサポート範囲（.NET Framework使用時）

表12‒12　XML Schemaのデータ型のサポート範囲（.NET Framework使用時）

XML Schemaのデータ型

データ型

データ型の列挙

attribute要素

list要素※1

xsd:duration

○

○

○

○

xsd:dateTime※2

○

×

○

○

xsd:time

×※3

×

×

×

xsd:date

×※3

×

×

×

xsd:gYearMonth

○

○

○

○

xsd:gYear

○

○

○

○

xsd:gMonthDay

○

○

○

○

xsd:gDay

○

○

○

○

xsd:gMonth

○

○

○

○

xsd:boolean

○

×

○

○

xsd:base64Binary

○※4

×

○

×

xsd:hexBinary

○※4

×

○

×

xsd:float

○

○

○

○

xsd:double

○

○

○

○

xsd:anyURI※5

○

×

○

○

xsd:QName

×

×

×

×

xsd:NOTATION

×

×

×

×

xsd:string

○

○

○

○

xsd:normalizedString※5

○

×

○

○

xsd:token※5

○

○

○

○

xsd:language※5

△

○

○

○

xsd:Name※5※6

△

○

○

○

xsd:NCName※5※6

△

○

○

○

xsd:ID※5

△

○

○

○

xsd:IDREF※5

△

○

○

○

xsd:ENTITY※5

△

○

○

○

xsd:IDREFS※5

△

×

○

×

xsd:ENTITIES※5

△

×

○

×

xsd:NMTOKEN※5※6

△

○

○

○

xsd:NMTOKENS※5※6

△

×

○

×

xsd:decimal

○

○

○

○

xsd:integer

○

○

○

○

xsd:nonPositiveInteger

○

○

○

○

xsd:negativeInteger

○

○

○

○

xsd:long

○

○

○

○

xsd:int

○

○

○

○

xsd:short

○

○

○

○

xsd:byte

○

○

○

○

xsd:nonNegativeInteger

○

○

○

○

xsd:unsignedInt

○

○

○

○

xsd:unsignedShort

○

○

○

○

xsd:unsignedByte

○

○

○

×

xsd:unsignedLong

○

○

○

○

xsd:positiveInteger

○

○

○

○

xsd:anyType※7

○

×

×

×

xsd2000:timeInstant※8

×

×

×

×

（凡例）

○：サポートされます。

△：INパラメタおよび戻り値だけサポートされます。

×：サポートされません。

注※1

xsd:list要素のitemType属性に指定するデータ型を指します。

注※2

xsd:dateTime型で紀元前の日付を送信すると，SOAPメッセージ中の日付が正しい値にならないため，受信側で正しい値を受信できません。

注※3

xsd:timeおよびxsd:dateのデータ型はサポートされません。代わりにxsd:dateTimeを使用してください。

注※4

xsd:base64Binaryおよびxsd:hexBinaryのデータ型を使用する場合，.NET Framework上のクライアントから送受信した値と，SOAP通信基盤で送受信した値が異なる場合があります。バイナリ値として解釈すると同じ値として解釈されますが，数値として解釈すると異なる値で解釈されることがあります。

例えば，0xFFのバイナリ値は，.NETクライアントでは255と解釈されますが，SOAP通信基盤では-1と解釈されます。

注※5

空文字列を送信すると受信時にnullになります。

注※6

XML Schemaの仕様で許容されない文字を送信すると，SOAPメッセージ中のこれらの文字が.NET Framework独自の形式にエンコードされるため，受信側で正しい値を受信できません。

注※7

xsd:anyType型で，配列型の値を送信しないでください。xsd:anyType型で，配列型の値を送信すると，SOAP Faultまたは例外が発生する場合があります。

注※8

xsd:timeInstantは使用できません。代わりに，xsd:dateTimeを使用してください。

(2)　XML Schemaのサポート範囲（.NET Framework使用時）

表12‒13　XML Schemaのサポート範囲（.NET Framework使用時）

要素名

サポート

属性名

サポート

schema

○

id

×

attributeFormDefault

○

blockDefault

×

elementFormDefault

○

finalDefault

×

targetNamespace

○

version

×

xml:lang

△

include

○

id

○

schemaLocation

○

import

○

id

○

namespace

○

schemaLocation※1

○

redefine

×

id

×

schemaLocation

×

element

（グローバル）

○

id

○

abstract

○

final

×

substitutionGroup

×

block

△

default

×

fixed

×

name

○

nillable

○

type

○

element

（ローカル）

○

id

○

minOccurs

○

maxOccurs

○

form

○

block

△

default

×

fixed

×

name

○

nillable

○

type

○

ref

○

simpleType

（グローバル）※2※3

○

id

○

final

△

name

○

simpleType

（ローカル）※2※3

○

id

○

complexType

（グローバル）

○

id

○

abstract

○

block

△

final

△

mixed

×

name

○

complexType

（ローカル）

○

id

○

mixed

×

all

○※4

id

○

minOccurs

△

maxOccurs

○

sequence

○※4

id

○

minOccurs

×

maxOccurs

×

choice

×

id

×

minOccurs

×

maxOccurs

×

any

×

id

×

minOccurs

×

maxOccurs

×

namespace

×

processContents

×

group

×

id

×

minOccurs

×

maxOccurs

×

ref

×

name

×

attribute

（グローバル）

○

id

○

default

×

fixed

×

name

○

type

○

wsdl:arrayType

×

attribute

（ローカル）

○※4

id

○

default

×

fixed

×

form

○

name

○

ref

○

type

○

use

×

wsdl:arrayType

×

anyAttribute

×

id

×

namespace

×

attributeGroup

×

id

×

name

×

ref

×

list※5

○

id

○

itemType

○

union

×

id

×

memberTypes

×

enumeration

○

value

○

minExclusive

△

value

△

fixed

×※6

minInclusive

△

value

△

fixed

×※6

maxExclusive

△

value

△

fixed

×※6

maxInclusive

△

value

△

fixed

×※6

totalDigits

△

value

△

fractionDigits

△

value

△

length

△

value

△

minLength

△

value

△

maxLength

△

value

△

whiteSpace

△

value

△

fixed

×※6

pattern

△

value

△

complexContent※7

○

id

○

mixed

×

simpleContent

×

id

×

restriction※3※7

○

id

○

base

○

extension※8

○

id

○

base

○

unique

×

id

×

name

×

key

×

id

×

name

×

keyref

×

id

×

name

×

refer

×

selector

×

id

×

xpath

×

field

×

id

×

xpath

×

notation

×

id

×

name

×

public

×

system

×

annotation

○

id

○

appinfo※9

○

source

○

documentation

○

source

○

xml:lang

○

（凡例）

○：サポートされます。

△：指定しても機能は有効になりません。アプリケーションで対応してください。

×：サポートされません。

注※1

.NET Frameworkを使用する場合，schemaLocation属性は無視されます。インポートするファイルの指定方法は，.NET Frameworkのドキュメントを参照してください。

注※2

simpleType要素およびunion要素は子要素として指定できません。また，restriction要素およびlist要素の記述には制限があります。注意事項およびサポートされない要素の代替記述については，「12.2.8　XML Schema記述時の注意事項」の該当する注意事項を参照してください。

注※3

restriction要素のbase属性は必ず指定してください。また，simpleType要素の子要素にrestriction要素を記述する場合には，base属性を指定し，その子要素にはenumeration要素だけを記述してください。この組み合わせ以外では，不正なソースが生成されます。

注※4

次の要素を合計した数は254個までです。255個以上は記述できません。

・all要素またはsequence要素の子要素

・all要素またはsequence要素の兄弟要素であるattribute要素

合計で255個以上記述した場合，不正なソースが生成されます。

注※5

list要素を記述する場合，itemType属性を必ず指定してください。また，子要素にsimpleType要素は記述できません。記述できない属性，要素を記述した場合，不正なソースが生成されます。

注※6

facetのfixed属性とは，facetを設定している型を派生（extensionまたはrestriction）させるときに派生する型のことです。fixed属性は，facetの値の変更を禁止します（デフォルトはfalse）。

注※7

complexContent要素の子要素に，restriction要素を記述することはサポートしていません。

注※8

complexContentの子要素だけをサポートしています。

注※9

WSDL2Javaコマンドは，記述した内容を無視します。

12.2.8　XML Schema記述時の注意事項

XML Schemaの要素を記述するときの注意事項について説明します。また，非サポート要素の代替記述についても説明します。

(1)　maxOccurs属性を記述する場合の注意事項

element要素にmaxOccurs属性を指定する場合，アプリケーションではXML Schemaで指定されている値の範囲で配列を使用してください。

element要素にmaxOccursを記述した場合，生成されたソースでは，該当する要素は配列型の変数となりますが，配列の最大値は設定されません。したがって，要素の配列数はアプリケーションに依存することになります。スキーマに指定されている値より大きい配列をアプリケーションで指定すると，不正なSOAPメッセージが送信されることになります。

maxOccursを記述したelement要素をOUT属性およびINOUT属性にして使用することはできません。OUT属性およびINOUT属性にして使用した場合，不正なHolderクラスのソースが生成されます。

nonwrapped形式では，maxOccursを記述したelement要素は引数として使用できません。引数として使用した場合，配列の最初の要素しか取得できません。

(2)　restriction要素を記述する場合の注意事項

simpleType要素の子要素として記述する場合

simpleType要素の子要素にrestriction要素を記述する場合には，base属性を指定し，その子要素にはenumeration要素だけを記述してください。この組み合わせ以外では，不正なソースが生成されます。

complexContent要素の子要素として記述する場合

complexContent要素の子要素にrestriction要素を記述する場合には，base属性を指定し，その属性値には"soapenc:Array"だけを指定できます。この組み合わせ以外では，不正なソースが生成されます。

(3)　list要素を記述する場合の注意事項

list要素を記述する場合の注意事項を示します。

itemType属性を必ず指定してください。

子要素にsimpleType要素は記述できません。

list要素のitemType属性には，listデータ型は指定できません。例えば，次の例ではIntListList型は使用できません。

<simpleType name="IntList">
  <list itemType="xsd:int"/>
</simpleType>
<simpleType name="IntListList">
  <list itemType="intf:IntList"/>
</simpleType>

記述できない要素および属性を記述した場合，不正なソースが生成されます。

(4)　単純型を基準型として拡張して，複合型を定義する場合の代替記述

simpleContent要素は非サポート要素です。単純型を拡張した複合型を定義するには，complexType要素を使用して記述してください。

単純型を基準型として拡張して，複合型を定義する場合の修正例を示します。

<修正前（非サポート）>

simpleContent要素を使用した記述

<xsd:element name="elm1">
   <xsd:complexType>
      <xsd:simpleContent>
         <xsd:extension base="xsd:string">
            <xsd:attribute name="att1" type="xsd:int" />
         </xsd:extension>
      </xsd:simpleContent>
   </xsd:complexType>
</xsd:element>

XMLインスタンス

<elm1 att1="123">abc</elm1>

<修正後（代替記述）>

complexType要素を使用した記述

<xsd:element name="elm1">
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element name="data" type="xsd:string"/>
      </xsd:sequence>
      <xsd:attribute name="att1" type="xsd:int"/>
   </xsd:complexType>
</xsd:element>

XMLインスタンス

<elm1 att1="123">
   <data>abc</data>
</elm1>

(5)　単純型を使用した派生によって，制限された複合型を定義する場合の代替記述

simpleContent要素は非サポートです。complexType要素を使用して，別の型として定義してください。

単純型を使用した派生によって，制限された複合型を定義する場合の修正例を示します。

<修正前（非サポート）>

simpleContent要素を使用した記述

<xsd:complexType name="attDataBase" >
   <xsd:simpleContent >
      <xsd:extension base="xsd:int" >
         <xsd:attribute name="currency"
                     type="xsd:string" />
         <xsd:attribute name="country"
                     type="xsd:string" />
      </xsd:extension>
   </xsd:simpleContent>
</xsd:complexType >

<xsd:element name="elm1">
   <xsd:complexType>
      <xsd:simpleContent>
         <xsd:restriction base="intf:attDataBase" >
            <xsd:attribute name="currency"
                     type="xsd:string" />
      </xsd:restriction>
      </xsd:simpleContent>
   </xsd:complexType >
</xsd:element>

XMLインスタンス

<elm1 currency="yen" >
1000
</elm1>

<修正後（代替記述）>

complexType要素を使用した記述

<xsd:element name="elm1" type="intf:attDataBase2"/>
<xsd:complexType name="attDataBase1" >
   <xsd:sequence>
      <xsd:element name="price" type="xsd:int"/>
   </xsd:sequence>
   <xsd:attribute name="currency"
                  type="xsd:string" />
   <xsd:attribute name="country"
                  type="xsd:string" />
</xsd:complexType >

<xsd:complexType name="attDataBase2" >
   <xsd:sequence>
      <xsd:element name="price" type="xsd:int"/>
   </xsd:sequence>
   <xsd:attribute name="currency"
                  type="xsd:string" />
</xsd:complexType >

XMLインスタンス

<elm1 currency="yen">
   <price xmlns="">1000</price>
</elm1>

(6)　use属性の代替記述

attribute要素に指定するuse属性は非サポートです。attribute要素の出現可能性を型定義によって記述する場合には，その用途によってcomplexType要素を使用して，別の型として定義してください。

use属性を使用した記述の修正例を示します。

<修正前（非サポート）>

use属性を使用した記述

<xsd:complexType name="Use1">
   <xsd:sequence>
      <xsd:element name="data1"
                type="intf:dataType" />
      <xsd:element name="data2">
         <xsd:complexType>
            <xsd:complexContent>
               <xsd:restriction
                     base="intf:dataType">
                  <xsd:sequence>
                     <xsd:element
                     name="data"
                     type="xsd:int"/>
                  </xsd:sequence>
                  <xsd:attribute
                     name="currency"
                     type="xsd:string"
                     use="prohibited" />
               </xsd:restriction>
            </xsd:complexContent>
         </xsd:complexType>
      </xsd:element>
   </xsd:sequence>
</xsd:complexType >
<xsd:complexType name="dataType" >
      <xsd:sequence>
            <xsd:element
                  name="data" type="xsd:int"/>
      </xsd:sequence>
      <xsd:attribute name="currency" type="xsd:string" />
</xsd:complexType >
<xsd:element name="use-1" type="intf:Use1"/>

XMLインスタンス

<use-1 xmlns="http://localhost">
   <data1 currency="yen" xmlns="" >
      <data xmlns="">1000</data>
   </data1>
   <data2 xmlns="" >
      <data xmlns="">1000</data>
   </data2>
</use-1>

<修正後（代替記述）>

complexType要素を使用した記述

<xsd:complexType name="Use1">
   <xsd:sequence>
      <xsd:element name="data1" type="intf:dataType" />
      <xsd:element name="data2" type="intf:dataType2" />
   </xsd:sequence>
</xsd:complexType >
<xsd:complexType name="dataType" >
   <xsd:sequence>
      <xsd:element name="data" type="xsd:int"/>
   </xsd:sequence>
   <xsd:attribute name="currency" type="xsd:string" />
</xsd:complexType >
<xsd:complexType name="dataType2" >
   <xsd:sequence>
      <xsd:element name="data" type="xsd:int"/>
   </xsd:sequence>
</xsd:complexType >
<xsd:element name="use-1" type="intf:Use1"/>

XMLインスタンス

修正前と同じです。

(7)　default属性の代替記述

element要素またはattribute要素にdefault属性を指定する場合で，SOAPメッセージの送信側のアプリケーションで値を設定しないとき，default属性の属性値はSOAPメッセージに設定されません。

SOAPメッセージの受信側のアプリケーションで，該当する属性値がSOAPメッセージに設定されていない場合は，default属性の属性値に指定されている値を設定してください。

(8)　fixed属性の代替記述

element要素またはattribute要素にfixed属性を指定する場合，SOAPメッセージの送信側のアプリケーションでどのような値を設定しても，fixed属性の属性値がSOAPメッセージに設定されません。

SOAPメッセージの受信側のアプリケーションで，fixed属性に指定されている値を設定してください。

(9)　substitutionGroup属性の代替記述

substitutionGroup属性は非サポートです。グローバルのelement要素に非サポートであるsubstitutionGroup属性を指定することはできません。

次に示す修正例を基に，代替記述について説明します。

このスキーマのインスタンスでは，トップレベルの要素"SSG"は，子要素として，data要素を内容とする構造です。このdata要素は，dataPattern1要素，dataPattern2要素の代わりに使用できます。したがって，インスタンス2，インスタンス3も正しいXMLインスタンスとなります。Application Serverでは，substitutionGroup属性をサポートしないため，代替要素となる型（ここでは，dataPattern1要素，dataPattern2要素）を使用する場合は，別のWSDLで記述し，別のアプリケーションとする必要があります。

<修正前（非サポート）>

substitutionGroup属性を使用した記述

<xsd:complexType name="SSG">
   <xsd:sequence>
      <xsd:element ref="intf:data" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="data" type="intf:dataType" />
<xsd:element name="dataPattern1"
            type="intf:dataPattern1Type"
            substitutionGroup="intf:data" />
<xsd:element name="dataPattern2"
            type="intf:dataPattern2Type"
            substitutionGroup="intf:data" />
<xsd:complexType name="dataType">
   <xsd:sequence>
      <xsd:element name="pno" type="xsd:NMTOKEN" />
      <xsd:element name="date" type="xsd:string" />
      <xsd:element name="season" type="xsd:string" />
   </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="dataPattern1Type">
   <xsd:complexContent>
         <xsd:extension base="intf:dataType" />
   </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="dataPattern2Type">
   <xsd:complexContent>
      <xsd:extension base="intf:dataType">
         <xsd:sequence>
               <xsd:element name="on"
                     type="xsd:string" />
         </xsd:sequence>
      </xsd:extension>
   </xsd:complexContent>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>

XMLインスタンス

インスタンス1
<SSG xmlns="http://localhost">
   <data>
      <pno xmlns="">1967</pno>
      <date xmlns="">Date</date>
      <season xmlns="">SPRING</season>
   </data>
</SSG>

インスタンス2
<SSG xmlns="http://localhost">
   <dataPattern1>
      <pno xmlns="">1967</pno>
      <date xmlns="">Date</date>
      <season xmlns="">SPRING</season>
   </dataPattern1>
</SSG>

インスタンス3
<SSG xmlns="http://localhost">
   <dataPattern2>
      <pno xmlns="">1967</pno>
      <date xmlns="">Date</date>
      <season xmlns="">SPRING</season>
      <on xmlns="">OFF</on>
   </dataPattern2>
</SSG>

<修正後（代替記述）>

インスタンスごとに記述

インスタンス１のスキーマ
<xsd:complexType name="SSG">
   <xsd:sequence>
      <xsd:element ref="intf:data" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="data" type="intf:dataType" />
<xsd:complexType name="dataType">
   <xsd:sequence>
      <xsd:element name="pno" type="xsd:NMTOKEN" />
      <xsd:element name="date" type="xsd:string" />
      <xsd:element name="season" type="xsd:string" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>

インスタンス２のスキーマ
<xsd:complexType name="SSG">
   <xsd:sequence>
      <xsd:element ref="intf:dataPattern1Type" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="dataPattern1" type="intf:dataType" />
<xsd:complexType name="dataType">
   <xsd:sequence>
      <xsd:element name="pno" type="xsd:NMTOKEN" />
      <xsd:element name="date" type="xsd:string" />
      <xsd:element name="season" type="xsd:string" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>

インスタンス３のスキーマ
<xsd:complexType name="SSG">
   <xsd:sequence>
      <xsd:element ref="intf:dataPattern2" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="dataPattern2"
            type="intf: dataPattern2Type" />
<xsd:complexType name="dataPattern2Type">
   <xsd:sequence>
      <xsd:element name="pno" type="xsd:NMTOKEN" />
      <xsd:element name="date" type="xsd:string" />
      <xsd:element name="season" type="xsd:string" />
      <xsd:element name="on" type="xsd:string" />
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="SSG" type="intf:SSG"/>

XMLインスタンス

修正前と同じです。

(10)　mixed属性の代替記述

mixed属性は非サポートです。complexType要素，complexContent要素にmixed属性で実現する，内容の中に要素が入る構造は実現できません。SOAPメッセージで送信しなければならないデータを，それぞれ独立した要素となる型を作成してください。

mixed属性を使用した記述の修正例を示します。

<修正前（非サポート）>

mixed属性を使用した記述

<xsd:complexType name="mixed">
   <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="address">
         <xsd:complexType>
            <xsd:complexContent mixed="true" >
               <xsd:extension base="intf:addressType">
                  <xsd:sequence>
                     <xsd:element name="postcode" type="xsd:int"/>
                  </xsd:sequence>
               </xsd:extension>
            </xsd:complexContent>
         </xsd:complexType>
      </xsd:element>
   </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addressType" mixed="true" >
   <xsd:sequence>
      <xsd:element name="street" type="xsd:string"/>
      <xsd:element name="city" type="xsd:string"/>
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="mixed" type="intf:mixed"/>

XMLインスタンス

<mixed xmlns="http://localhost">
   <name xmlns="" >abcdef</name>
   <address xmlns="" >
      abcde<street>XXXX51st.</street>fghijk<city>ZZZZZZ</city>lmnopqrstuvwxyz <postcode>045981</postcode>
   </address>
</mixed>

<修正後（代替記述）>

独立した要素となる型を作成

<xsd:complexType name="mixed">
   <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
      <xsd:element name="address">
         <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="data1" type="xsd:string"/>
               <xsd:element name="street" type="xsd:string"/>
               <xsd:element name="data2" type="xsd:string"/>
               <xsd:element name="city" type="xsd:string"/>
               <xsd:element name="data3" type="xsd:string"/>
               <xsd:element name="postcode" type="xsd:int"/>
            </xsd:sequence>
         </xsd:complexType>
      </xsd:element>
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="mixed" type="intf:mixed"/>

XMLインスタンス

<mixed xmlns="http://localhost">
   <name xmlns="" >abcdef</name>
   <address xmlns="" >
      <data1>abcde</data1>
      <street>XXXX51st.</street>
      <data2>fghijk</data2>
      <city>ZZZZZZ</city>
      <data3>lmnopqrstuvwxyz</data3>
      <postcode>045981</postcode>
   </address>
</mixed>

(11)　XML Schemaのビルトインデータ型使用時の注意事項

ENTITY型を指定してアプリケーションでデータを送受信できますが，ENTITY型としての機能は有効になりません。

(12)　soapenc:Array型の制限に関する注意事項

WSDLのuse属性がliteralの場合，soapenc:Array型を制限した複合型を使用することはできません。配列を定義するには，代わりにmaxOccurs属性を指定した要素を子要素に持つ複合型を定義してください。

(13)　wsdl:arrayType属性を記述する場合の注意事項

wsdl:arrayType属性を記述した場合の配列は，OUT属性およびINOUT属性で使用できません。

(14)　ref属性，minOccurs属性，およびminOccurs属性を使用する場合の代替記述

ref属性，minOccurs属性，およびmaxOccurs属性を同じelement要素で使用した場合，不正なソースが生成されます。ref属性，minOccurs属性，およびmaxOccurs属性を同じelement要素で使用しないでください。

ref属性，minOccurs属性，およびmaxOccurs属性を使用する場合の修正例を示します。

<修正前（非サポート）>

ref属性，minOccurs属性，およびmaxOccurs属性を同じelement要素で使用した記述

<xsd:complexType name="getUserData">
   <xsd:sequence>
      <xsd:element ref="intf:in0"
          minOccurs="0" maxOccurs="unbounded"/>
   </xsd:sequence>
</xsd:complexType>
<xsd:element name="in0" type="xsd:string"/>

<修正後（代替記述）>

ref属性を使用しない記述

<xsd:complexType name="getUserData">
   <xsd:sequence>
      <xsd:element name="in0" type="xsd:string"
          minOccurs="0" maxOccurs="unbounded"/>
   </xsd:sequence>
</xsd:complexType>

(15)　sequence要素に指定する属性に関する注意

sequence要素の属性に，minOccurs属性およびmaxOccurs属性は使用しないでください。

minOccurs属性，maxOccurs属性のどちらか，または両方を指定した場合，WSDL2JavaのWSDL検証機能でエラーにならないで，ソースコードが生成されます。

(16)　xsd:enumeration要素を使用した場合の注意

クライアントアプリケーションまたはサーバアプリケーションでは，xsd:enumeration要素を使用して列挙型として定義した値だけを指定してください。

xsd:enumeration要素を使用して定義した列挙型の値以外の値をクライアントアプリケーション，またはサーバアプリケーションで指定した場合，スキーマに違反したSOAPメッセージが送信されます。このとき，エラーになりません。

(17)　xsd:string型のxsd:list型で空文字列の要素を含む配列を送信した場合の注意

RPC形態のアプリケーションの場合，itemTypeがxsd:string型のxsd:list型で，空文字列の要素を含む配列を送信すると，受信時に配列の要素から空文字が削除されます。

(18)　xsd:schema要素のtargetNamespace属性に関する注意

WSDL2Javaコマンド実行時に，targetNamespace属性を省略したxsd:schema要素を記述しているWSDLファイルを指定しても，エラーになりません。WSDL2Javaコマンドで指定するWSDLファイル内でxsd:schema要素を記述する場合は，targetNamespace属性を持つxsd:schema要素を記述してください。

(19)　複数のxsd:schema要素を記述する場合の注意

WSDL2Javaコマンド実行時に，同じtargetNamespace属性値を持つxsd:schema要素をwsdl:types要素以下に複数記述しているWSDLファイルを指定しても，エラーになりません。WSDL2Javaコマンドで指定するWSDLファイル内でwsdl:types要素以下に複数のxsd:schema要素を記述する場合は，それぞれ異なるtargetNamespace属性値を持つxsd:schema要素を記述してください。

(20)　element要素にnillable属性を指定していない場合の注意

nillable属性を指定していないelement要素に対してアプリケーションで値を設定しないと，要素にxsi：nil="true" 属性が設定された空要素が送信され，不正なSOAPメッセージになります。

次の条件がすべて重なる場合に問題が発生します。なお，element要素の型は問いません。

element要素にnillable属性が属性値"false"で指定されている，またはnillable属性が指定されていない。

minOccurs属性の属性値に"1"以上が設定されている（minOccurs属性の省略時も含む）。

アプリケーションで該当する要素のメンバに値を設定していない。

XML Schemaの指定で空要素指定がされていない要素には，アプリケーションで必ず値を設定してください。

12.3　SAAJ 1.2との対応

SAAJ 1.2のjavax.xml.soapパッケージのうち，SOAPアプリケーションの開発に利用できるインタフェースおよびクラスを次の表に示します。

表12‒14　SAAJ1.2のサポート範囲

分類

インタフェース名／クラス名

メソッド名

サポート

インタフェース

Detail

すべてのメソッド

○

DetailEntry

すべてのメソッド

○

Name

すべてのメソッド

○

Node

すべてのメソッド

○

SOAPBody

すべてのメソッド

○

SOAPBodyElement

すべてのメソッド

○

SOAPConstants

すべてのメソッド

○

SOAPElement

すべてのメソッド

○

SOAPEnvelope

すべてのメソッド

○

SOAPFault

すべてのメソッド

○

SOAPFaultElement

すべてのメソッド

○

SOAPHeader

すべてのメソッド

○

SOAPHeaderElement

すべてのメソッド

○

Text

すべてのメソッド

○

クラス

AttachmentPart

setContentType(java.lang.String contentType)※1

○

setDataHandler(javax.activation.DataHandler dataHandler)※1

○

上記以外のメソッド

○

MessageFactory

すべてのメソッド

○

MimeHeader

すべてのメソッド

○

MimeHeaders

すべてのメソッド

○

SOAPConnection

すべてのメソッド

○

SOAPConnectionFactory

すべてのメソッド

○

SOAPElementFactory

すべてのメソッド

×

SOAPException

すべてのメソッド

○

SOAPFactory

すべてのメソッド

○

SOAPMessage

addAttachmentPart(Attachment AttachmentPart)※2

○

createAttachmentPart(javax.activation.DataHandler dataHandler)※1

○

createAttachmentPart(java.lang.Object content, java.lang.String contentType)※1

○

上記以外のメソッド

○

SOAPPart

すべてのメソッド※3

○

（凡例）

○：サポートされます。

×：サポートされません。

注※1

添付ファイルが添付できるファイルサイズの上限を超えた場合，IllegalArgumentExceptionをスローします。

注※2

添付ファイルの数が追加できる上限を超えた場合，IllegalArgumentExceptionをスローします。

注※3

DOM系のAPIでサポートしていないメソッド（UnsupportedOperationException例外が発生するメソッド）があります。該当するメソッドを次に示します。

・getEncoding()

・setEncoding(java.lang.String)

・getStandalone()

・setStandalone(boolean)

・getStrictErrorChecking()

・setStrictErrorChecking(boolean)

・getVersion()

・getVersion(java.lang.String)

・adoptNode(org.w3c.dom.Node)

12.4　JAXR 1.0との対応

UDDIクライアントライブラリではJAXR 1.0 Capability Profile Level 0のAPIをサポートします。次にサポート範囲を示します。

表12‒15　javax.xml.registryパッケージ

項番

インタフェース/クラス名

メソッド名

サポート

Capability Profile

1

BulkResponse

すべてのメソッド

○

Level 0

2

BusinessLifeCycleManager

すべてのメソッド

○

Level 0

3

BusinessQueryManager

findRegistryPackages

×

Level 1

上記以外のメソッド

○

Level 0

4

CapabilityProfile

すべてのメソッド

○

Level 0

5

Connection

すべてのメソッド

○

Level 0

6

ConnectionFactory

createFederatedConnection

×

Level 0(Optional)

上記以外のメソッド

○

Level 0

7

DeclarativeQueryManager

すべてのメソッド

×

Level 1

8

FederatedConnection

すべてのメソッド

×

Level 0(Optional)

9

FindQualifier

メソッドなし

−

−

10

JAXRResponse

すべてのメソッド

○

Level 0

11

LifeCycleManager

createExtrinsicObject

createPersonName

createRegistryPackage

deprecateObjects

unDeprecateObjects

deleteObjects(keys)

×

Level 1

上記以外のメソッド

○

Level 0

12

Query

すべてのメソッド

×

Level 1

13

QueryManager

getRegistryObject(id)

getRegistryObjects(objectKeys)

×

Level 1

上記以外のメソッド

○

Level 0

14

RegistryService

getDeclarativeQueryManager

×

Level 1

上記以外のメソッド

○

Level 0

（凡例）

○：サポートされます。

×：サポートされません。

−：対象外です。

表12‒16　javax.xml.registry.infomodelパッケージ

項番

インタフェース/クラス名

メソッド名

サポート

Capability Profile

1

Association

すべてのメソッド

○

Level 0

2

AuditableEvent

すべてのメソッド

×

Level 1

3

Classification

すべてのメソッド

○

Level 0

4

ClassificationScheme

getValueType

setValueType

×

Level 1

上記以外のメソッド

○

Level 0

5

Concept

すべてのメソッド

○

Level 0

6

EmailAddress

すべてのメソッド

○

Level 0

7

ExtensibleObject

すべてのメソッド

○

Level 0

8

ExternalIdentifier

すべてのメソッド

○

Level 0

9

ExternalLink

すべてのメソッド

○

Level 0

10

ExtrinsicObject

すべてのメソッド

×

Level 1

11

InternationalString

すべてのメソッド

○

Level 0

12

Key

すべてのメソッド

○

Level 0

13

LocalizedString

すべてのメソッド

○

Level 0

14

Organization

getPostalAddress

setPostalAddress

addChildOrganization

removeChildOrganization

getChildOrganizationCount

getChildOrganizations

getDescendantOrganizations

getParentOrganization

getRootOrganization

×

Level 1

上記以外のメソッド

○

Level 0

15

PersonName

getLastName

setLastName

getFirstName

setFirstName

getMiddleName

setMiddleName

×

Level 1

上記以外のメソッド

○

Level 0

16

PostalAddress

すべてのメソッド

○

Level 0

17

RegistryEntry

すべてのメソッド

×

Level 1

18

RegistryObject

toXML

×

Level 0

getAuditTrail

getAssociatedObjects

getObjectType

getRegistryPackages

×

Level 1

上記以外のメソッド

○

Level 0

19

RegistryPackage

すべてのメソッド

×

Level 1

20

Service

すべてのメソッド

○

Level 0

21

ServiceBinding

すべてのメソッド

○

Level 0

22

Slot

すべてのメソッド

○

Level 0

23

SpecificationLink

すべてのメソッド

○

Level 0

24

TelephoneNumber

getCountryCode

getAreaCode

getExtension

getUrl

setCountryCode

setAreaCode

setExtension

setUrl

×

Level 1

上記以外のメソッド

○

Level 0

25

URIValidator

すべてのメソッド

○

Level 0

26

User

getUrl

setUrl

×

Level 1

上記以外のメソッド

○

Level 0

27

Versionable

すべてのメソッド

×

Level 1

（凡例）

○：サポートされます。

×：サポートされません。

注意事項

例外インタフェースのメソッドについてはすべてサポートされています。

12.5　WS-I Attachments Profile - Version 1.0との対応

RPC形態の添付ファイルは，WS-I Attachments Profile - Version 1.0仕様に準拠します。RPC形態の添付ファイルでサポートする，WS-I Attachments Profile - Version 1.0のデータ型の範囲を次に示します。

表12‒17　WS-I Attachments Profile - Version 1.0のデータ型のサポート範囲

項番

Attachments Profileのデータ型

データ型

データ型の列挙

attribute要素

list要素

1

wsi:swaRef

○

×

×

×

（凡例）

○：サポートされます。

×：サポートされません。

注意事項

wsi:swaRefを利用できるのは，document/literalを使用した場合だけです。

wsi:swaRefを利用する場合，RPC形態のクライアント処理の実装方法には，スタブを使用してください。DIIは使用できません。

.NET Frameworkを使用した場合は，wsi:swaRefを利用できません。

13　SOAP通信基盤が提供するAPI

この章では，SOAP通信基盤が提供するAPIについて説明します。

13.1　インタフェースおよびクラスの一覧

SOAP通信基盤はインタフェースおよびクラスを提供します。これらのインタフェースおよびクラスは，使用するJARファイルによって使用できるものと使用できないものとに分類されます。JARファイルごとのインタフェースおよびクラスの対応を次の表に示します。なお，スタブクラスが提供するインタフェースについては，「3.7.1　スタブの使用」を参照してください。

表13‒1　JARファイルに対するインタフェースおよびクラスの対応

インタフェース名およびクラス名

説明

C4Fault

SOAP Faultの情報を保持するクラスです。

C4Property

実行時オプションを設定するクラスです。

C4QName

修飾された名前を保持するクラスです。

C4Session

セッション管理機能を提供するクラスです。

Call（com.cosminexus.cws.xml.rpc.Call）

サービスの呼び出しに必要な情報を取得するためのインタフェースです。

Call（javax.xml.rpc.Call）

サービスを呼び出すための機能を提供するインタフェースです。

ClientID

クライアント識別子を表すクラスです。

JAXRPCException

JAX-RPCランタイムに関連した例外を表す例外クラスです。

Management

RPC形態，メッセージング形態の各クラスを使用する前，および終了時に呼び出すクラスです。

ReqResListener

リクエスト・レスポンス型のSOAPアプリケーションが実装するメッセージングインタフェースです。

Service

Callインスタンスを生成するためのファクトリインタフェースです。

ServiceException

ServiceクラスおよびServiceFactoryクラスのメソッドによってスローされる例外クラスです。

ServiceFactory

Serviceインスタンスを生成するためのファクトリクラスです。

注意事項

このマニュアルに記載していないクラスおよびメソッドは使用しないでください。使用した場合，動作は保証できません。

SOAP通信基盤が提供するクラスのうち，次のクラスのインスタンスはマルチスレッドで共有した場合，動作は保証できません。

C4Sessionクラス

C4QNameクラス

ClientIDクラス

C4Faultクラス

Callインタフェース

Serviceインタフェース

13.2　C4Faultクラス（SOAP Fault情報の保持）

SOAP Faultの情報を保持するクラスです。

クラス定義

public final class C4Fault
extends java.rmi.RemoteException

パッケージ

com.cosminexus.cws.service.exception

C4Faultクラスのメソッドを次の表に示します。

表13‒2　C4Faultクラスのメソッド一覧

メソッド

機能概要

C4Fault

C4Faultオブジェクトを生成します。

getFaultActor

Fault生成者（SOAP Faultのfaultactor）を取得します。

getFaultCode

Faultのコード（SOAP Faultのfaultcode）を取得します。

getFaultDetails

Faultの詳細（SOAP Faultのdetail）を取得します。

getFaultString

Faultの文字列（SOAP Faultのfaultstring）を取得します。

C4Fault

クラス名：C4Fault

機能

C4Faultオブジェクトを生成するコンストラクタです。

構文

public C4Fault(
     com.cosminexus.cws.service.common.C4QName    a_c4QName,
     java.lang.String                             a_strFaultString,
     java.lang.String                             a_strFaultActor,
     org.w3c.dom.Element[]                        a_elmDetail
)

引数

表13‒3　C4Faultメソッドの引数

仮引数名

名称

in/out

説明

a_c4QName

Faultコード

in

生成するC4Faultオブジェクトに設定するFaultコード（SOAP Faultのfaultcode）を指定します。Faultコードを設定しない場合はnullを指定します。

なお，Faultコードにnullを指定してC4Faultオブジェクトを生成した場合，getFaultCodeメソッドを呼び出すと，ローカル部と接頭辞が空文字のC4QNameオブジェクトが返ります。

a_strFaultString

Fault文字列

in

生成するC4Faultオブジェクトに設定するFault文字列（SOAP Faultのfaultstring）を指定します。Fault文字列を設定しない場合はnullを指定します。C4Faultオブジェクトを生成したあと，getFaultStringメソッドを呼び出した場合，KDCCP9000-Eの＜詳細＞にFault文字列を設定して返します。また，Fault文字列にnullを指定した場合には，＜詳細＞は空文字になります。

a_strFaultActor

Fault生成者

in

生成するC4Faultオブジェクトに設定するFault生成者（SOAP Faultのfaultactor）を指定します。Fault生成者を設定しない場合はnullを指定します。

a_elmDetail

Fault詳細

in

生成するC4Faultオブジェクトに設定するFault詳細（SOAP Faultのdetail）をorg.w3c.dom.Elementの配列で指定します。Fault詳細を設定しない場合はnullを指定します。要素数が0の配列を指定した場合は，Fault詳細にnullを指定した場合と同じです。なお，配列の要素内にnullの要素が存在する場合，その要素に対応するSOAP FaultメッセージのFault詳細は作成されません。

getFaultActor

クラス名：C4Fault

機能

Fault生成者（SOAP Faultのfaultactor）を取得します。

構文

public java.lang.String getFaultActor()

引数

ありません。

戻り値

Fault生成者を格納するStringオブジェクトを返します。Fault生成者が設定されていない場合はnullを返します。

getFaultCode

クラス名：C4Fault

機能

Faultのコード（SOAP Faultのfaultcode）を取得します。

構文

public com.cosminexus.cws.service.common.C4QName getFaultCode()

引数

ありません。

戻り値

Faultコードを格納したC4QNameオブジェクトを返します。

注意事項

Faultコードにnullを指定してC4Faultオブジェクトを生成した場合，ローカル部と接頭辞が空文字のC4QNameオブジェクトが返されます。

getFaultDetails

クラス名：C4Fault

機能

Faultの詳細（SOAP Faultのdetail）を取得します。

構文

public org.w3c.dom.Element[] getFaultDetails()

引数

ありません。

戻り値

Fault詳細をorg.w3c.dom.Element型の配列で返します。Fault詳細がない場合はnullを返します。

注意事項

C4Faultオブジェクト生成した場合に，要素数が0の配列のFault詳細を指定した場合は，nullが返されます。

nullの要素を含むFault詳細を指定した場合は，このメソッドを呼び出す個所によって，取得する情報が異なります。

・MessageServiceインタフェースクラスのonMessageメソッドを実装したSOAPサービスから，SOAPエンジンに制御が戻るまでにこのメソッドを呼び出した場合は，C4Faultオブジェクト生成時に指定した，Fault詳細のnullの要素はそのまま取得されます。

・SOAPエンジンからSOAP Faultメッセージがクライアントに返され，クライアントでこのメソッドを呼び出した場合は，C4Faultオブジェクト生成時に指定した，Fault詳細のnullの要素は取得されません。

detail要素の子ノードにテキストノードが存在する場合，戻り値のElement型配列を構成する最後の一つの要素としてnullが返されます。ただし，テキストノードが空白文字，改行文字，およびタブだけで構成されている場合は，nullは返されません。

detail entryのサブツリーにテキストノードが存在する場合，兄弟ノードのすべてのテキストノードが連結されます。連結される文字列の前後に存在する空白文字，改行文字，およびタブは省略され，そのテキストノードは同じ階層の最後に追加されます。ただし，テキストノードが空白文字，改行文字，およびタブだけで構成されている場合は，テキストノードは追加されません。

例を次に示します。

・受信電文のdetail要素

<detail><ns1:Test1 xmlns:ns1="http://test.cosminexus.com/">△△foo△△<TestData1>TESTDATA1</TestData1>△△bar△△

</ns1:Test1></detail>

・getFaultDetailsメソッドの戻り値

Element[0] : <ns1:Test1 xmlns:ns1="http://test.cosminexus.com/"><TestData1>TESTDATA1</TestData1>foo△△△△bar</ns1:Test1>

注　△は半角スペースを表します。

getFaultString

クラス名：C4Fault

機能

Faultの文字列（SOAP Faultのfaultstring）を取得します。

構文

public java.lang.String getFaultString()

引数

ありません。

戻り値

Fault文字列を格納したStringオブジェクトを返します。ユーザ実装のSOAPアプリケーションからC4Fault例外をスローした場合は，KDCCP9000-Eのメッセージテキストを格納したStringオブジェクトを返します。このメッセージの＜詳細＞は，C4Faultオブジェクト生成時に指定したFault文字列が設定されます。

注意事項

Fault文字列にnullを指定してC4Faultオブジェクトを生成した場合，KDCCP9000-Eの＜詳細＞は空文字になります。

13.3　C4Propertyクラス（実行時オプションの設定）

SOAPエンジンの実行時オプションを，SOAPクライアントライブラリおよびSOAPサーバの処理の実行中に動的に切り替えるためのクラスです。

クラス定義

public final class C4Property
extends java.lang.Object

パッケージ

com.cosminexus.cws.property

C4Propertyクラスのメソッドを次の表に示します。

表13‒4　C4Propertyクラスのメソッド一覧

メソッド

機能概要

getInstance

プロパティクラスのインスタンスを取得します。

getProperty

実行時オプションを取得します。

setProperty

実行時オプションを設定します。

getInstance

クラス名：C4Property

機能

C4Propertyクラスのインスタンスを取得します。

構文

public static com.cosminexus.cws.property.C4Property getInstance()

引数

ありません。

戻り値

C4Propertyクラスのインスタンスを返します。

getProperty

クラス名：C4Property

機能

実行時オプションを取得します。

構文

public java.lang.String getProperty(
     java.lang.String key
)

引数

表13‒5　getPropertyメソッドの引数

仮引数名

名称

in/out

説明

key

キー名称

in

取得するキー名称を指定します。取得するキー名称は，setPropertyメソッドで指定するキー名称と同じものを指定します。

戻り値

オプションの値を示す文字列を返します。

注意事項

このメソッドで取得するオプション値をsetPropertyメソッドで指定していない場合は，動作定義ファイル中の値を返します。動作定義ファイル中に設定していない場合は，次のように動作します。

次のキーを指定した場合はnullを返します。

・C4Property.CONFIGURATION_KEY_SOCKET_WRITE_TIMEOUT

・C4Property.CONFIGURATION_KEY_SOCKET_READ_TIMEOUT

・C4Property.CONFIGURATION_KEY_SOCKET_CONNECT_TIMEOUT

上記以外のキーを指定した場合はデフォルト値を返します。デフォルト値がない場合はnullを返します。

実行時オプション以外のキーを指定した場合で，setPropertyメソッドで設定していないキーを指定した場合はnullを返します。

SOAPクライアントライブラリの実行中にこのメソッドを使用する場合は，このメソッドを使用する前に，ManagementクラスのconnectClientIDtoCurrentThreadメソッドでクライアント識別子とスレッドを関連づけてください。connectClientIDtoCurrentThreadメソッドが呼び出されていない場合にこのメソッドを呼び出した場合，nullを返す場合があります。SOAPサーバの処理の実行中にこのメソッドを使用する場合は，connectClientIDtoCurrentThreadメソッドを呼び出す必要はありません。

setProperty

クラス名：C4Property

機能

実行時オプションを設定します。

構文

public void setProperty(java.lang.String name,
                        java.lang.Object value)

引数

表13‒6　setPropertyメソッドの引数

仮引数名

名称

in/out

説明

key

キー名称

in

設定するキー名称を指定します。

value

値

in

設定する値を文字列で指定します。

setPropertyメソッドで指定するキー名称および値を次に示します。

表13‒7　setPropertyメソッドで指定するキー名称および値

メソッドで指定するキー名称

動作定義ファイルのキー名称

メソッドで指定する値

C4Property.CONFIGURATION_KEY_PROXYHOST

c4web.application.proxy_host（クライアント定義ファイル）

c4web.application.<識別子>.proxy_host（サーバ定義ファイル）

ホスト名（またはIPアドレス）を示す文字列を指定します。

C4Property.CONFIGURATION_KEY_NONPROXYHOSTS

c4web.application.non_proxy_hosts（クライアント定義ファイル）

c4web.application.<識別子>.non_proxy_hosts（サーバ定義ファイル）

ホスト名（またはIPアドレス，以降同様）群を示す文字列を指定します。複数のホスト名を指定する場合は「|」（ストローク）で区切って指定します。

プロキシサーバを利用しないホスト名を指定する場合，ホスト名とホスト名の間には，「|」（ストローク）以外の文字（空白など）を指定しないようにしてください。

C4Property.CONFIGURATION_KEY_PROXYPORT

c4web.application.proxy_port（クライアント定義ファイル）

c4web.application.<識別子>.proxy_port（サーバ定義ファイル）

ポート番号を示す文字列を指定します。

C4Property.CONFIGURATION_KEY_PROXYUSER

c4web.application.proxy_user（クライアント定義ファイル）

c4web.application.<識別子>.proxy_user（サーバ定義ファイル）

認証ユーザIDを示す文字列を指定します。

C4Property.CONFIGURATION_KEY_PROXYPASSWORD

c4web.application.proxy_password（クライアント定義ファイル）

c4web.application.<識別子>.proxy_password（サーバ定義ファイル）

認証ユーザIDに対応するパスワード文字列を指定します。

C4Property.CONFIGURATION_KEY_MAINTAINSESSION

c4web.application.app_maintainsession（クライアント定義ファイル）

c4web.application.<識別子>.app_maintainsession（サーバ定義ファイル）

「true」または「false」を指定します。

C4Property.CONFIGURATION_KEY_DOMULTIREFS

c4web.common.do_multirefs（クライアント定義ファイル）

c4web.common.<識別子>.do_multirefs（サーバ定義ファイル）

「true」または「false」を指定します。

C4Property.CONFIGURATION_KEY_SENDXSITYPES

c4web.common.send_xsi_types（クライアント定義ファイル）

c4web.common.<識別子>.send_xsi_types（サーバ定義ファイル）

「true」または「false」を指定します。

C4Property.CONFIGURATION_KEY_ENABLESOAPHEADERCHECK

c4web.common.enable_soapheader_check（クライアント定義ファイル）

c4web.common.<識別子>.enable_soapheader_check（サーバ定義ファイル）

「true」または「false」を指定します。

C4Property.CONFIGURATION_KEY_SOCKET_WRITE_TIMEOUT

c4web.application.socket_write_timeout（クライアント定義ファイル）

c4web.application.<識別子>.socket_write_timeout（サーバ定義ファイル）

ソケットの書き込みタイムアウト値を指定します。

C4Property.CONFIGURATION_KEY_SOCKET_READ_TIMEOUT

c4web.application.socket_read_timeout（クライアント定義ファイル）

c4web.application.<識別子>.socket_read_timeout（サーバ定義ファイル）

ソケットの読み込みタイムアウト値を指定します。

C4Property.CONFIGURATION_KEY_SOCKET_CONNECT_TIMEOUT

c4web.application.socket_connect_timeout（クライアント定義ファイル）

c4web.application.<識別子>.socket_connect_timeout（サーバ定義ファイル）

ソケットの接続タイムアウト値を指定します。

C4Property.CONFIGURATION_KEY_CHARACTERREFERENCE

c4web.common.character_reference（クライアント定義ファイル）c4web.common.<識別子>.character_reference（サーバ定義ファイル）

「true」または「false」を指定します。

実行時オプションとして設定する各オプションの意味については，「10.6　実行時オプションの設定項目」を参照してください。

戻り値

ありません。

注意事項

このメソッドでは，クライアント定義ファイルおよびサーバ定義ファイルの設定項目のうち，トレースファイルに関する項目（キー名称の先頭にc4web.loggerが付くもの）の設定はできません。

「true」または「false」の値を指定するキーでは，すべて小文字で記述してください。すべて大文字の場合，または大文字と小文字が混在した場合は，指定が無効となり，それぞれのキーのデフォルト値が仮定されます。

SOAPクライアントライブラリの実行中にこのメソッドを使用する場合は，このメソッドを使用する前に，ManagementクラスのconnectClientIDtoCurrentThreadメソッドでクライアント識別子とスレッドを関連づけてください。connectClientIDtoCurrentThreadメソッドが呼び出されていない場合，このメソッドを呼び出しても無視されます。SOAPサーバの処理の実行中にこのメソッドを使用する場合は，connectClientIDtoCurrentThreadメソッドを呼び出す必要はありません。

仮引数valueにnullを指定した場合，すでに設定している実行時オプションの値は変更されません。

13.4　C4QNameクラス（名前空間の保持）

修飾された名前を保持するクラスです。

クラス定義

public final class C4QName
extends javax.xml.namespace.QName

パッケージ

com.cosminexus.cws.service.common

C4QNameクラスのメソッドを次の表に示します。

表13‒8　C4QNameクラスのメソッド一覧

メソッド

機能概要

C4QName

C4QNameオブジェクトを生成します。

equals

引数で指定されたオブジェクトと等しいか比較します。

getLocalPart

修飾された名前のローカル部を取得します。

getNamespaceURI

修飾された名前の接頭辞を取得します。

hashCode

保持している修飾された名前のハッシュコード値を取得します。

toString

保持している修飾された名前の文字列表現を返します。

C4QName

クラス名：C4QName

機能

C4QNameオブジェクトを生成するコンストラクタです。

構文

ローカル部だけを指定する場合

public C4QName(

java.lang.String a_strLocalPart

)

接頭辞およびローカル部を指定する場合

public C4QName(

java.lang.String a_strNamespaceURI,

java.lang.String a_strLocalPart

)

引数

表13‒9　C4QNameメソッドの引数

仮引数名

名称

in/out

説明

a_strNamespaceURI

接頭辞

in

修飾された名前の接頭辞を指定します。

a_strLocalPart

ローカル部

in

修飾された名前のローカル部を指定します。

注意事項

このクラスのインスタンスは，マルチスレッドで共有できません。

equals

クラス名：C4QName

機能

引数で指定されたオブジェクトと等しいか比較します。

構文

public boolean equals(
     java.lang.Object a_oObject
)

引数

表13‒10　equalsメソッドの引数

仮引数名

名称

in/out

説明

a_oObject

比較対象オブジェクト

in

比較するオブジェクトを指定します。

戻り値

引数に指定されたオブジェクトと等しければtrueを，異なればfalseを返します。

getLocalPart

クラス名：C4QName

機能

修飾された名前のローカル部を取得します。

構文

public java.lang.String getLocalPart()

引数

ありません。

戻り値

修飾された名前のローカル部を返します。

getNamespaceURI

クラス名：C4QName

機能

修飾された名前の接頭辞を取得します。

構文

public java.lang.String getNamespaceURI()

引数

ありません。

戻り値

修飾された名前の接頭辞を返します。ローカル部だけを設定している場合は，空文字を返します。

hashCode

クラス名：C4QName

機能

保持している修飾された名前のハッシュコード値を取得します。

構文

public int hashCode()

引数

ありません。

戻り値

このオブジェクトが保持している修飾された名前のハッシュコード値を返します。

toString

クラス名：C4QName

機能

保持している修飾された名前の文字列表現を返します。

構文

public java.lang.String toString()

引数

ありません。

戻り値

保持している修飾された名前の文字列表現を返します。接頭辞とローカル部が設定されている場合は「{接頭辞}ローカル部」の形式で返し，ローカル部だけが設定されている場合は「ローカル部」を返します。

13.5　C4Sessionクラス（セッションの管理）

セッションの管理に関する機能を提供するクラスです。

クラス定義

public final class C4Session extends java.lang.Object

パッケージ

coｍ.cosminexus.cws.service.common

C4Sessionクラスのメソッドを次の表に示します。

表13‒11　C4Sessionクラスのメソッド一覧

メソッド

機能概要

getInstance

C4Sessionインスタンスを取得します。

invalidate

現在継続中のセッションの終了を指示します。

getInstance

クラス名：C4Session

機能

C4Sessionインスタンスを取得します。

構文

public static C4Session getInstance()
        throws java.lang.UnsupportedOperationException

引数

ありません。

戻り値

RPC形態のSOAPアプリケーションのサービスで，DeployScopeが「Session」の場合に，次の値を返します。

現在継続中のセッションがあればC4Sessionインスタンス

現在継続中のセッションがなければnull

例外

次のどれかの場合にjava.lang.UnsupportedOperationExceptionが発生します。

クライアントから呼び出された場合

RPC形態のSOAPアプリケーションのサービスから呼び出された場合

RPC形態のSOAPアプリケーションのサービスで，DeployScopeが「Session」以外のサービスから呼び出された場合

invalidate

クラス名：C4Session

機能

現在継続中のセッションの終了を指示します。

構文

public void invalidate()
        throws java.lang.IllegalStateException

引数

ありません。

戻り値

ありません。

例外

すでに無効化されているセッションに対して実行した場合にjava.lang.IllegalStateExceptionが発生します。

13.6　Callインタフェース（サービス呼び出しの情報取得）

サービスの呼び出しに必要な情報を取得するためのインタフェースです。

インタフェース定義

public interface Call

パッケージ

com.cosminexus.cws.xml.rpc.Call

Callインタフェースのメソッドを次の表に示します。

表13‒12　Callインタフェース（com.cosminexus.cws.xml.rpc.Call）のメソッド一覧

メソッド

機能概要

getParameterClassByName

パラメタのJava型を取得します。

getParameterClassByName

インタフェース名：Call

機能

パラメタのJava型を取得します。

構文

public java.lang.Class getParameterClassByName(
                                      java.lang.String paramName)
                                throws IllegalArgumentException

引数

表13‒13　getParameterClassByNameメソッドの引数

仮引数名

名称

in/out

説明

paramName

パラメタのローカル名

in

パラメタのローカル名を指定します。

戻り値

パラメタのJava型（java.lang.Class）を返します。存在しない場合はnullを返します。

例外

paramNameがnullの場合，IllegalArgumentException例外がスローされます。

13.7　Callインタフェース（サービスの呼び出し）

サービスを呼び出すための機能を提供するインタフェースです。

インタフェース定義

public interface Call

パッケージ

javax.xml.rpc.Call

Callインタフェースのメソッドを次の表に示します。

表13‒14　Callインタフェース（javax.xml.rpc.Call）のメソッド一覧

メソッド

機能概要

getOutputParams

Callオブジェクトを使用して，最後に呼び出されたオペレーションの出力パラメタをキー:name，値:valueのMapで返します。

getOutputValues

最後に呼び出されたオペレーションの出力パラメタの値をListで返します。

getProperty

指定した名前のプロパティ値を取得します。

invoke

Synchronous request-responseモードでオペレーションを呼び出します。

removeProperty

指定された名前のプロパティを削除します。

setProperty

プロパティを設定します。

getOutputParams

インタフェース名：Call

機能

Callオブジェクトを使用して，最後に呼び出されたオペレーションの出力パラメタをキー:name，値:valueのMapで返します。キー:nameの型はjava.lang.Stringです。

構文

public java.util.Map getOutputParams()

引数

ありません。

戻り値

最後に呼び出されたオぺレーションの出力パラメタをMap（java.util.Map）で返します。出力パラメタがない場合は，空のMapを返します。

例外

invokeメソッドが呼び出される前に実行した場合，JAXRPCException例外がスローされます。

getOutputValues

インタフェース名：Call

機能

最後に呼び出されたオペレーションの出力パラメタの値をListで返します。

構文

public java.util.List getOutputValues()

引数

ありません。

戻り値

最後に呼び出されたオペレーションの出力パラメタの値をリスト（java.util.List）で返します。出力の値がない場合は，空のListを返します。Listに格納される出力パラメタの順番は，WSDLのparameterOrderの順番に一致します。

例外

invokeメソッドが呼び出される前に実行した場合，JAXRPCException例外がスローされます。

getProperty

インタフェース名：Call

機能

指定した名前のプロパティ値を取得します。指定できるプロパティについては，setPropertyの説明を参照してください。

構文

public java.lang.Object getProperty(java.lang.String name)

引数

表13‒15　getPropertyメソッドの引数

仮引数名

名称

in/out

説明

name

プロパティ名

in

プロパティ名を指定します。

戻り値

プロパティ値（Object）を返します。

例外

次の場合にJAXRPCException例外がスローされます。

nameにnullを指定した場合

指定できるプロパティ以外のプロパティ名を指定した場合

指定した名前のプロパティが存在しない場合

invoke

インタフェース名：Call

機能

Synchronous request-responseモードでオペレーションを呼び出します。引数なしのオペレーションを呼び出す場合は，空のObject配列を引数に指定します。

構文

public java.lang.Object invoke(java.lang.Object[] inputParams)
                        throws java.rmi.RemoteException

引数

表13‒16　invokeメソッドの引数

仮引数名

名称

in/out

説明

inputParams

オペレーションの引数

in

オペレーションの引数を指定します。

戻り値

オペレーションの戻り値（java.lang.Object）またはnullを返します。

例外

次の場合にRemoteException例外がスローされます。

リモート呼び出しでエラーが発生した場合

通信先のサービスが上がっていない場合

SOAP Faultが発生した場合

次の場合にJAXRPCException例外がスローされます。

引数inputParamsにnullを指定した場合

Callオブジェクトの初期化でエラーが発生した場合

inputParamsの数，順番，型がWSDLの内容と一致しない場合

removeProperty

インタフェース名：Call

機能

指定された名前のプロパティを削除します。指定できるプロパティについては，setPropertyの説明を参照してください。

構文

public void removeProperty(java.lang.String name)

引数

表13‒17　removePropertyメソッドの引数

仮引数名

名称

in/out

説明

name

プロパティ名

in

プロパティ名を指定します。

戻り値

ありません。

例外

次の場合にJAXRPCException例外がスローされます。

nameにnullを指定した場合

指定できるプロパティ以外のプロパティ名を指定した場合

指定した名前のプロパティが存在しない場合

setProperty

インタフェース名：Call

機能

設定するプロパティを指定します。指定できるプロパティを次の表に示します。

表13‒18　指定できるプロパティ

キー名称

設定内容

型

指定値

javax.xml.rpc.security.auth.username

HTTPベーシック認証のユーザ名

java.lang.String

「:」（コロン）以外の任意の文字列を指定します。空文字列も指定できます。次の値を指定した場合は，JAXRPCExceptionがスローされます。

nullを指定した場合

「:」（コロン）を含む文字列を指定した場合

サービスのURLにユーザ名を指定していた場合でも，このプロパティの設定が有効になります。このプロパティを設定することで既存の値が上書きされるので注意してください。

javax.xml.rpc.security.auth.password

HTTPベーシック認証のパスワード

java.lang.String

任意の文字列を指定します。空文字列も指定できます。nullは指定できません。nullを指定した場合は，JAXRPCExceptionがスローされます。

サービスのURLにパスワードを指定していた場合でも，このプロパティの設定が有効になります。このプロパティを設定することで既存の値が上書きされるので注意してください。

両プロパティの指定値の組み合わせによって，HTTP Authorizationヘッダの値は次のとおりとなります。

表13‒19　username／passwordの指定値とHTTP Authorizationヘッダの値の対応

username指定値

password指定値

Authorizationヘッダの値

指定なし

指定なし

ヘッダなし

空文字列

指定なし

":"のBase64エンコード

空文字列

空文字列

":"のBase64エンコード

空文字列

任意文字列

":任意文字列"のBase64エンコード

":"以外の任意文字列

指定なし

"任意文字列:"のBase64エンコード

":"以外の任意文字列

空文字列

":任意文字列:"のBase64エンコード

":"以外の任意文字列

任意文字列

"任意文字列:任意文字列"のBase64エンコード

構文

setProperty(String name, Object value)

引数

表13‒20　setPropertyメソッドの引数

仮引数名

名称

in/out

説明

name

プロパティ名

in

プロパティ名を指定します。

value

プロパティ値

in

プロパティ値を指定します。

戻り値

ありません。

例外

次の場合にJAXRPCException例外がスローされます。

nameにnullを設定した場合

valueに不正な値を指定した場合

valueが指定の型と異なる場合

指定できるプロパティ以外のプロパティ名を指定した場合

13.8　ClientIDクラス（クライアント識別子）

クライアント識別子を表すクラスです。このクラスは，公開メンバおよび公開メソッドを持ちません。

クラス定義

public final class ClientID
extends java.lang.Object

パッケージ

com.cosminexus.cws.management

13.9　JAXRPCExceptionクラス（JAX-RPCに関する例外）

JAX-RPCランタイムに関連した例外を表す例外クラスです。

クラス定義

public class JAXRPCException
extends java.lang.RuntimeException

パッケージ

javax.xml.rpc.JAXRPCException

JAXRPCExceptionクラスのメソッドを次の表に示します。

表13‒21　JAXRPCExceptionクラスのメソッド一覧

メソッド

機能概要

getLinkedCause

原因例外を取得します。

getLinkedCause

クラス名：JAXRPCException

機能

原因例外を取得します。

構文

public java.lang.Throwable getLinkedCause()

引数

ありません。

戻り値

原因例外（java.lang.Throwable）を返します。存在しない場合はnullを返します。

13.10　Managementクラス（クライアントの開始，終了）

RPC形態，メッセージング形態の各クラスを使用する前，および終了時に呼び出すクラスです。SOAP通信基盤でクライアントを開発する場合は必ずこのクラスを使用してください。このクラスでは，次の処理を行います。

トレースファイルおよびアプリケーションログの初期化

トレースファイルおよびアプリケーションログの終了処理

クライアント識別子とスレッドの関連づけ

なお，サーバから別のSOAPアプリケーションを呼び出すような場合（サーバが別のサーバに対するクライアントとなる場合）は，このクラスのメソッドを使用する必要はありません。

クライアント識別子とスレッドの関連づけ

クライアント識別子とは，SOAPサービスを利用するクライアントの実行時オプション，トレースファイル，およびアプリケーションログの出力先を個々のクライアントごとに区別するために使用する情報です。J2EEサーバ上でクライアントを実行する場合，実行時オプション，トレースファイル，およびアプリケーションログの出力先をクライアントごとに分けるために，このクラスのメソッドを使用して，クライアント識別子とクライアントの各スレッドを関連づける必要があります。

注意事項

クライアントをサーブレット，JSP，およびEJBとして実装する場合は，必ずこのクラスのメソッドを使用してください。

このクラスのメソッドを使用するクライアントと使用しないクライアントが混在すると，J2EEサーバ上でクライアントを実行するときに，トレースファイル，アプリケーションログ，および実行時オプションの出力先が動作定義ファイルの指定どおりにならないことがあります。

クラス定義

public final class Management
extends java.lang.Object

パッケージ名

com.cosminexus.cws.management

Managementクラスが提供するメソッドを次に示します。

表13‒22　Managementクラスのメソッド一覧

メソッド

機能概要

initializeClient

クライアントの開始処理をします。

connectClientIDtoCurrentThread

クライアント識別子をスレッドに関連づけます。

disconnectClientIDtoCurrentThread

クライアント識別子とスレッドの関連づけを解除します。

finalizeClient

クライアントの終了処理をします。

initializeClient

クラス名：Management

機能

トレースファイル，アプリケーションログの初期化，動作定義ファイルの読み込みなど，クライアントの開始処理をします。このメソッドはマルチスレッドセーフです。

構文

public static com.cosminexus.cws.management.ClientID initializeClient()

引数

ありません。

戻り値

クライアント識別子を示すClientIDクラスを返します。

注意事項

このメソッドを呼び出さなかった場合，動作定義ファイルは読み込まれないで，実行時オプションはすべてデフォルト値で動作します。また，トレース出力結果はデフォルトトレースに出力されます。

クライアントをサーブレット，JSPで実装する場合，このメソッドをHttpServlet.initやjspInitメソッド内で呼び出してください。

クライアントをEJBで実装する場合，このメソッドをejbCreateメソッド内で呼び出してください。

このメソッドを同じスレッド内で複数回コールした場合，同じクライアント識別子を示すClientIDクラスを返します。

connectClientIDtoCurrentThread

クラス名：Management

機能

クライアント識別子を現在のスレッドに関連づけます。

構文

public static void connectClientIDtoCurrentThread (
     com.cosminexus.cws.management.ClientID key
)

引数

表13‒23　connectClientIDtoCurrentThreadメソッドの引数

仮引数名

名称

in/out

説明

key

クライアント識別子

in

initializeClientメソッドの戻り値として取得したクライアント識別子を指定します。nullを指定した場合は何もしないで終了します。

戻り値

ありません。

注意事項

クライアントをサーブレットおよびJSPで実装する場合，サーブレットではHttpServletクラスのHTTPリクエストに対応するハンドラメソッド（doGetメソッドやdoPostメソッドなど）の最初で，JSPの場合はボディ部分の最初でこのメソッドを呼び出してください。

クライアントをEJBで実装する場合，このメソッドをEnterpriseBeanクラス内のサービスメソッドの最初で呼び出してください。

このメソッドを呼び出さなかった場合は，同じJ2EEサーバ上で動作するほかのクライアントでdisconnectClientIDtoCurrentThreadメソッドが呼び出されていないと，実行時オプションやトレース出力先が不定となります。

このメソッドを呼び出さなかった場合で，SOAPクライアント識別子と現在のスレッドの関連づけがされていないとき（初回実行時など）は，SOAPエンジンの実行時オプションはすべてデフォルト値で動作します。またトレース出力結果はデフォルトトレースに出力されます。

disconnectClientIDtoCurrentThread

クラス名：Management

機能

クライアント識別子と現在のスレッドの関連づけを解除します。

構文

public static void disconnectClientIDtoCurrentThread (
     com.cosminexus.cws.management.ClientID key
)

引数

表13‒24　disconnectClientIDtoCurrentThreadメソッドの引数

仮引数名

名称

in/out

説明

key

クライアント識別子

in

initializeClientメソッドの戻り値として取得したクライアント識別子を指定します。

戻り値

ありません。

注意事項

connectClientIDtoCurrentThreadメソッドを使用した場合，必ずこのメソッドを呼び出してください。このメソッドを呼び出さなかった場合，connectClientIDtoCurrentThreadメソッドで関連づけたクライアント識別子の情報が解除されないで，このメソッドを呼び出したほかのクライアントの実行時オプション，トレースファイル，およびアプリケーションログの出力先や重要度が有効になってしまうなどの影響を及ぼす場合があります。

クライアントをサーブレットおよびJSPで実装する場合，サーブレットではHttpServletクラスのHTTPリクエストに対応するハンドラメソッド（doGetメソッドやdoPostメソッドなど）の最後で，JSPではボディ部分の最後でこのメソッドを呼び出してください。

クライアントをEJBで実装する場合，このメソッドをEnterpriseBeanクラス内のサービスメソッドの最後で呼び出してください。

keyがnullの場合，またはkeyで指定したクライアント識別子がconnectClientIDtoCurrentThreadメソッドで指定したものと異なる場合，警告メッセージがトレース上に出力されます。

finalizeClient

クラス名：Management

機能

トレースファイルおよびアプリケーションログのクローズなど，クライアントの終了処理をします。このメソッドはマルチスレッドセーフです。

構文

public static void finalizeClient(com.cosminexus.cws.management.clientID key)

引数

表13‒25　finalizeClientメソッドの引数

仮引数名

名称

in/out

説明

key

SOAPクライアント識別子

in

initializeClientメソッドの戻り値として取得したSOAPクライアント識別子を指定します。

戻り値

ありません。

注意事項

initializeClientメソッドを呼び出す前にこのクラスを呼び出した場合は，何もしないで終了します。

このメソッドを呼び出したあと，initializeClientメソッドを再度呼び出した場合は，クライアント開始処理を再度行います。

クライアントをサーブレットおよびJSPで実装する場合，このメソッドはHttpServlet.destroy（サーブレットの場合）やjspDestroy（JSPの場合）で呼び出してください。

クライアントをEJBで実装する場合，このメソッドをejbRemoveメソッド内で呼び出してください。

13.11　ReqResListenerインタフェース（SAAJを利用したSOAPアプリケーションの実装）

リクエスト・レスポンス型のSOAPアプリケーションが実装するメッセージングインタフェースです。

インタフェース定義

public interface ReqResListener

パッケージ

com.cosminexus.cws.xml.soap

ReqResListenerインタフェースのメソッドを次の表に示します。

表13‒26　ReqResListenerインタフェースのメソッド一覧

メソッド

機能概要

onMessage

メッセージングサービスを処理するメソッドです。

onMessage

インタフェース名：ReqResListener

機能

メッセージングサービスを処理します。

構文

public javax.xml.soap.SOAPMessage onMessage(javax.xml.soap.SOAPMessage soapmessage)
        throws javax.xml.soap.SOAPException

引数

表13‒27　onMessageメソッドの引数（ReqResListenerインタフェース）

仮引数名

名称

in/out

説明

soapmessage

リクエストメッセージ

in

リクエストメッセージを格納したクラスです。

戻り値

javax.xml.soap.SOAPMessageオブジェクトを返します。

例外

javax.xml.soap.SOAPException

レスポンスメッセージを返せない場合にスローされます。

13.12　Serviceインタフェース（サービスインタフェース）

Callインスタンスを生成するためのファクトリインタフェースです。

インタフェース定義

public interface Service

パッケージ

javax.xml.rpc.Service

Serviceインタフェースのメソッドを次の表に示します。

表13‒28　Serviceインタフェースのメソッド一覧

メソッド

機能概要

createCall

指定のポートとオペレーションに関連づけられたCallオブジェクトを生成します。

createCall

インタフェース名：Service

機能

指定したポートとオペレーションに関連づけられたCallオブジェクトを生成します。このメソッドは，ServiceオブジェクトがWSDLの情報を保持している状態で，初期化されたCallオブジェクトを生成するために使用されます。生成されたCallオブジェクトを初期化する必要はありません。

構文

public Call createCall(javax.xml.namespace.QName portName
                       javax.xml.namespace.QName operationName)
                throws ServiceException

引数

表13‒29　createCallメソッドの引数

仮引数名

名称

in/out

説明

portName

ポートのQName

in

ポートのQNameを指定します。

operationName

オペレーションのQName

in

オペレーションのQNameを指定します。

戻り値

Callオブジェクトを返します。

例外

ServiceオブジェクトがWSDLを読み込んでポートの情報を保持している状態では，次の場合にServiceException例外がスローされます。

portNameまたはoperationNameにnullを指定した場合

指定したportNameをServiceオブジェクトが保持していない場合

指定したoperationNameをServiceオブジェクトが保持していない場合

また，Callオブジェクトの生成でエラーが発生した場合もServiceException例外がスローされます。

13.13　ServiceExceptionクラス（サービスに関する例外）

ServiceインタフェースおよびServiceFactoryクラスのメソッドによってスローされる例外クラスです。

クラス定義

public class ServiceException
extends java.lang.Exception

パッケージ

javax.xml.rpc.ServiceException

ServiceExceptionクラスのメソッドを次の表に示します。

表13‒30　ServiceExceptionクラスのメソッド一覧

メソッド

機能概要

getLinkedCause

原因例外を取得します。

getLinkedCause

クラス名：ServiceException

機能

原因例外を取得します。

構文

public java.lang.Throwable getLinkedCause()

引数

ありません。

戻り値

原因例外（java.lang.Throwable）を返します。存在しない場合はnullを返します。

13.14　ServiceFactoryクラス（サービスのファクトリクラス）

Serviceインスタンスを生成するためのファクトリクラスです。

クラス定義

public abstract class ServiceFactory
extends Object

パッケージ

javax.xml.rpc.ServiceFactory

ServiceFactoryクラスのメソッドを次の表に示します。

表13‒31　ServiceFactoryクラスのメソッド一覧

メソッド

機能概要

createService

Serviceオブジェクトを生成します。

newInstance

ServiceFactoryオブジェクトを生成します。

createService

クラス名：ServiceFactory

機能

Serviceオブジェクトを生成します。WSDLを読み込んでパースし，WSDLに記述されている情報を保持します。

構文

public abstract Service createService(
                             java.net.URL wsdlDocumentation,
                             javax.xml.namespace.QName serviceName)
                          throws ServiceException

引数

表13‒32　createServiceメソッドの引数

仮引数名

名称

in/out

説明

wsdlDocumentation

WSDLのURL

in

WSDLのURLとして，ローカルファイルへのパスを指定します。

serviceName

SOAPサービスのQName

in

SOAPサービスのQNameを指定します。

戻り値

Serviceオブジェクトを返します。

例外

次の場合に，ServiceException例外がスローされます。

wsdlDocumentationまたはserviceNameにnullを指定した場合

wsdlDocumentationにローカルファイル以外のパスを指定した場合

wsdlDocumentationにWSDLが存在しないローカルファイルのパスを指定した場合

serviceNameに指定したサービス名がWSDLに存在しない場合

WSDLの解析中にエラーが発生した場合

Serviceオブジェクトの作成でエラーが発生した場合

newInstance

クラス名：ServiceFactory

機能

ServiceFactoryオブジェクトを生成します。

構文

public static ServiceFactory newInstance()
                                throws ServiceException

引数

ありません。

戻り値

ServiceFactoryオブジェクトを返します。

第4編　トラブルシュート

14　障害対策

この章では，SOAPアプリケーションの実行，運用中の障害対策について説明します。SOAPを利用した通信ができない場合の，考えられる原因や対処方法をFAQで説明します。

14.1　障害対策の流れ

SOAPアプリケーションを運用中に障害が発生した場合，次に示す流れで対処します。

現象の確認

障害が発生したときの現象を確認します。メッセージが出力されている場合は，メッセージの内容を確認してください。

資料の取得

トラブルの要因を調査するために必要な資料を取得します。取得が必要な資料については，「14.2　障害発生時に取得する資料」を参照してください。

原因の調査と対処

取得した資料を基にトラブルの原因を調査し，対処します。問題発生個所の切り分けについては，「14.3　問題発生個所の切り分け」を参照してください。

14.2　障害発生時に取得する資料

システム管理者への連絡が必要になる障害が発生した場合，または対処方法が不明な障害の場合は，次に示す資料を取得した上，システム管理者に連絡してください。

トレースファイル

アプリケーションログファイル

SOAPアプリケーションの環境設定ファイル（web.xml，server-config.xml）

サーバおよびクライアントに設定したシステムプロパティとシステムクラスパス

サーバおよびクライアントの標準出力と標準エラー出力

Component ContainerおよびWebサーバのログ

Component Containerで規定する障害時取得情報

Component Containerで規定する障害時取得情報を次に示します。

J2EEサーバのユーザ定義ファイル

J2EEサーバの保守情報

サーバ管理コマンドのユーザ定義ファイル

サーバ管理コマンドの保守情報

J2EEサーバの標準出力，標準エラー出力

J2EEサーバ側のTPBrokerのログ

EJBクライアントアプリケーションに設定したシステムプロパティ，およびシステムクラスパス

EJBクライアントアプリケーションの標準出力，標準エラー出力

ネットワークモニタツールで採取したパケットの内容

Component Containerで規定する障害時取得情報の取得方法については，マニュアル「アプリケーションサーバ 機能解説 保守／移行編」を参照してください。

14.3　問題発生個所の切り分け

SOAPによる通信ができない場合，処理が行われる個所のうち，どこで問題が発生しているかを把握した上で適切な対処をする必要があります。SOAPアプリケーションのトラブル発生時に，原因となる可能性がある個所を次の図に示します。

図14‒1　SOAPアプリケーションの処理の流れでの問題発生個所

図に示す1〜6の個所に対し，次に示す処理が正常に行われているかを確認することで，問題発生個所を絞り込めます。

クライアントからSOAPメッセージが正しく出力されているか

メッセージはSOAPエンジンに届いているか

SOAPサービスでメッセージが処理できているか

サーバからの返信用SOAPメッセージは正しく出力されているか

返信用SOAPメッセージはクライアントに届いているか

クライアントで返信用SOAPメッセージを処理できているか

1.〜6.で示した内容が正常に処理されていない場合，次に示すメッセージIDを持つメッセージが出力されることが考えられます。

表14‒1　問題発生個所と出力されることが考えられるメッセージIDの対応

問題発生個所

出力されるメッセージのメッセージID

1.の処理

KDCCS1149-E

2.の処理

KDCCP0001-E

3.の処理

KDCCP0002-E，KDCCP0003-E，KDCCP0004-E，KDCCP0009-E，KDCCP0013-E，KDCCP0020-E

4.の処理

KDCCP0001-E，KDCCS1149-E

5.の処理

KDCCP0001-E

6.の処理

KDCCP0009-E

メッセージの内容については，マニュアル「アプリケーションサーバ メッセージ(構築／運用／開発用)」を参照してください。メッセージのほかに，処理が正常に行われているかどうかを確認するには，トレースファイルおよびアプリケーションログを使用します。トレースファイルについては，「14.4　トレースファイル」を参照してください。アプリケーションログについては，「14.5　アプリケーションログ」を参照してください。

14.4　トレースファイル

SOAPアプリケーション開発支援機能およびSOAP通信基盤では，障害対策に必要な情報をトレースとしてトレースファイルに出力します。トレースファイルは障害の発生個所の割り出しや原因の調査などに利用します。出力するトレースとトレースファイルの種類を次に示します。

SOAPトレース

SOAPアプリケーション開発支援機能およびSOAP通信基盤で出力するトレースです。SOAPトレースの種類を次に示します。

サーバトレース

SOAPアプリケーション開発支援機能およびSOAP通信基盤のサーバ側で出力するトレースです。サーバトレースファイルに出力します。

クライアントトレース

SOAPアプリケーション開発支援機能およびSOAP通信基盤のクライアント側で出力するトレースです。クライアントトレースファイルに出力します。

デフォルトトレース

警告メッセージなどを出力するトレースです。デフォルトトレースファイルに出力します。

Webサービスセキュリティトレース

Webサービスセキュリティ機能の実行時に出力するトレースです。サーバ側はサーバトレースファイルに，クライアント側はクライアントトレースファイルに出力します。

提供コマンドトレース

提供コマンドの実行時に出力するトレースです。提供コマンドトレースファイルに出力します。

JAXRトレース

UDDIクライアントライブラリが提供するAPIの実行時に出力するトレースです。JAXRトレースファイルに出力します。

14.4.1　トレースファイルに出力される内容

トレースファイルに出力される内容を次に示します。

表14‒2　トレースファイルの出力内容

項目

内容

日付

出力時の日付（yyyy/mm/dd形式）が出力されます。

時刻

出力時の時刻（hh:mm:ss.sss形式）が出力されます。

アプリケーション名

トレースの種類によって，アプリケーション名は異なります。

サーバトレース：「c4websv」

クライアントトレース：「c4webcl」

デフォルトトレース：「c4webcl」

Webサービスセキュリティトレース：「wss」

JAXRトレース：「hitjaxr」

提供コマンドトレース：「c4webcl」

プロセス識別子

プロセス識別子（16進数）が出力されます。

スレッド識別子

スレッド識別子（16進数）が出力されます。

メッセージID

メッセージIDが出力されます。メッセージIDを持たないものは出力されません。

メッセージ種別

メッセージテキストの種別が出力されます。

SOAPトレースの場合

EC：例外をキャッチしたことを表します。

FB：SOAP通信基盤が提供するAPIの開始を表します。

FE：SOAP通信基盤が提供するAPIの終了を表します。

PB：ほかのプログラムの処理の呼び出しを表します。

PE：呼び出したほかのプログラムの処理が終了したことを表します。

なし：上記以外のトレース情報を表します。

JAXRトレースの場合

FB：メソッドの入口を表します。

FE：メソッドの出口を表します。

EC：例外をキャッチしたことを表します。

ER：エラーメッセージを表示したことを表します。

PB：ほかのプログラムの処理の呼び出しを表します。

PE：呼び出したほかのプログラムの処理の終了を表します。

メッセージテキスト

実行時の情報を示すメッセージが出力されます。

14.4.2　トレースファイルの出力先

出力されるSOAPトレースおよびJAXRトレースの出力先と，トレースファイル名を示します。

(1)　SOAPトレース

出力されるSOAPトレースファイルの種類やトレースファイル名は，次に示す場合で異なります。

J2EEサーバ上で動作する場合

J2EEサーバ上で動作するSOAPサービス，およびJ2EEサーバ上で動作するSOAPクライアント（サーブレット，EJB）が該当します。

J2EEサーバ上で動作しない場合

J2EEサーバ上で動作しないSOAPクライアント（コマンドライン），および開発支援コマンドが該当します。

J2EEサーバ上で動作する場合，およびJ2EEサーバ上で動作しない場合に分けて，出力されるトレースファイルの種類，出力先，トレースファイル名を示します。

(a)　J2EEサーバ上で動作する場合

表14‒3　出力されるSOAPトレース（J2EEサーバ上で動作する場合）

トレースファイルの種類

トレースファイルの出力先

トレースファイル名

Application Serverのメッセージログ

<J2EEサーバのログ出力先フォルダ>※1

cjmessage?.log（?：1〜16）※1※5

サーバトレース

<J2EEサーバのログ出力先フォルダ>¥WS

サーバ定義ファイル（c4websv.cfg）で設定したファイル名称となります。※2※5

クライアントトレース

<J2EEサーバのログ出力先フォルダ>¥WS

クライアント定義ファイル（c4webcl.properties）で設定したファイル名称となります。※3※5

デフォルトトレース

<J2EEサーバのログ出力先フォルダ>¥WS

c4webcl-default-?.log（?：1〜16）※4※5

注※1

マニュアル「アプリケーションサーバ 機能解説 保守／移行編」で記述しているJ2EEサーバのログ取得の設定，およびトラブルシューティングの資料取得の設定についての説明を参照してください。

注※2

サーバ定義ファイルの設定については，「10.2　サーバ定義ファイルの設定」を参照してください。

注※3

クライアント定義ファイルの設定については，「10.3　クライアント定義ファイルの設定」を参照してください。

注※4

（?：1〜16）は，共通定義ファイルの設定によって最大値が異なります。

共通定義ファイルの設定については，「10.4　共通定義ファイルの設定」を参照してください。

注※5

デフォルトでは，出力先ファイルが指定したファイルサイズになると，SOAPトレースの出力先を次のファイルに切り替えます（ラップアラウンドモード）。J2EEサーバ上で動作する場合，SOAPトレースを出力していたファイルを指定した時刻でリネームし，SOAPトレースの出力先ファイル名を変更しないこともできます（シフトモード）。シフトモードの詳細については，マニュアル「アプリケーションサーバ 機能解説 保守／移行編」で記述しているトラブルシューティングのための準備についての説明を参照してください。

(b)　J2EEサーバ上で動作しない場合

表14‒4　出力されるSOAPトレース（J2EEサーバ上で動作しない場合）

トレースファイルの種類

トレースファイルの出力先

トレースファイル名

Application Serverのメッセージログ

<J2EEサーバのログ出力先フォルダ>※1

cjclmessage?.log（?：1〜16）※1

クライアントトレース

<J2EEサーバのログ出力先フォルダ>¥WS

クライアント定義ファイル（c4webcl.properties）で設定したファイル名称となります。※2

デフォルトトレース

<J2EEサーバのログ出力先フォルダ>¥WS

c4webcl-default-?.log（?：1〜16）※3

提供コマンドトレース

<Application Serverのインストールディレクトリ>¥CC¥client¥logs¥system¥ejbcl¥WS

Java2WSDLコマンド：Java2WSDL-?.log

WSDL2Javaコマンド：WSDL2Java-?.log

Java2WSDDコマンド：Java2WSDD-?.log

（?：1〜16）※3

注※1

マニュアル「アプリケーションサーバ 機能解説 保守／移行編」で記述しているEJBクライアントアプリケーションのシステムログについての説明を参照してください。

注※2

クライアント定義ファイルの設定については，「10.3　クライアント定義ファイルの設定」を参照してください。

注※3

（?：1〜16）は，共通定義ファイルの設定により最大値が異なります。

共通定義ファイルの設定については，「10.4　共通定義ファイルの設定」を参照してください。

(2)　JAXRトレース

JAXRトレースファイルの出力先およびトレースファイルの名称を次の表に示します。

表14‒5　出力されるJAXRトレース

トレースファイルの種類

トレースファイルの出力先

トレースファイル名

JAXRトレース

システムプロパティ（com.cosminexus.xml.registry.trace.file_path）で設定したディレクトリに出力します。

＜システムプロパティ（com.cosminexus.xml.registry.trace.file_path）で設定したファイル名＞n.log

（n:1〜16）

注意事項

トレースファイルの出力先ディレクトリ下には，トレースファイル以外のファイル（拡張子が.log以外のファイル）が生成されます。このファイルはSOAPクライアントまたはSOAPサービスを停止しても削除されないので，適宜削除してください。

14.4.3　トレースファイル出力の重要度

トレースファイル出力の重要度を変更することで，障害発生時に出力する情報量を変更できます。出力する情報量を多くすることで，障害発生の要因を特定しやすくなります。ただし，出力する情報量を多くすると，プログラムの処理性能への影響が大きくなります。

次の表に，指定できる重要度と出力される内容を示します。

表14‒6　トレースファイルの重要度および出力内容

重要度

出力内容

ERROR

例外発生時にトレースファイルを出力します。

WARN

例外発生時または外部のAPI呼び出し時にトレースファイルを出力します。

INFO

次の場合にトレースファイルを出力します。

例外発生時

ほかのプログラムの処理の呼び出しと終了

SOAP通信基盤が提供するAPIの開始と終了

DEBUG

次の場合にトレースファイルを出力します。

例外発生時

ほかのプログラムの処理の呼び出しと終了

SOAP通信基盤が提供するAPIの開始と終了

SOAP通信基盤が提供するAPIの呼び出し時の引数

14.4.4　トレースファイルの見積もり方法

クライアントトレース，サーバトレースのトレースファイルのサイズ，および面数の算出方法を次に示します。なお，この算出方法はトレースファイル出力の重要度がINFOの場合のものです。トレースファイル出力の重要度がERROR，またはWARNの場合は，初回起動時に5KB程度出力される以外にトレース出力はありません。また，例外発生時には，発生した例外に応じてトレース出力があります。

(1)　RPC形態のSOAPアプリケーションの場合

サービスのインタフェース，実行時オプションの設定，エンコーディング種別（SOAPエンコーディング，リテラルエンコーディング）に関係なく，1回のリクエストおよびレスポンスで次に示すトレース量が出力されます。

サーバ側：1.0KB

クライアント側：2.0KB

注意事項

初回リクエストは初期化処理をするため，この値より約2.0KB多くトレース出力されます。

このトレース出力量は，ユーザ実装部分は含まれていません。ユーザ実装部分でSOAPの提供するAPIを発行すると，1API当たり約0.4KBのトレース量がトレースファイルに出力されます。

(2)　メッセージング形態のSOAPアプリケーションの場合

送受信しているSOAPメッセージの大きさや添付するファイル数によって出力されるトレース量が異なります。次に示す値を参考にして，トレースファイルのサイズおよび面数を算出してください。

表14‒7　1回の送受信で出力されるトレース量の目安

送受信する内容

トレース出力量

SOAPヘッダの子要素数

SOAPボディの子要素数

添付するファイル数

クライアント側（単位:KB）

サーバ側（単位:KB）

0

0

0

2.0

2.0

1

0

0

4.0

3.0

10

0

0

19.0

18.0

0

1

0

4.0

3.0

0

10

0

19.0

18.0

0

0

1

3.0

2.0

0

0

10

8.0

7.0

1

1

1

6.0

5.0

10

10

10

43.0

42.0

注意事項

初回リクエストは初期化処理をするため，この値より約3.0KB多くトレース出力されます。

トレース出力量にはユーザ実装部分は含まれません。ユーザ実装部分でSOAPが提供するAPIを発行すると，1API当たり約0.4KBのトレース量がトレースファイルに出力されます。

設定する添付ファイルの数によって，出力されるトレース量は増加します。ただし，設定する添付ファイルのサイズによって出力されるトレースのサイズは変わりません。

14.5　アプリケーションログ

SOAPアプリケーション開発支援機能およびSOAP通信基盤では，SOAPアプリケーションへの要求とSOAPアプリケーションからの応答時のSOAPメッセージ，および添付ファイル付きSOAPメッセージのMIMEヘッダの一部をアプリケーションログとして出力します。アプリケーションログの種類を次に示します。

サーバログ

SOAPアプリケーションを提供するサーバ側で出力するアプリケーションログのことをいいます。

クライアントログ

SOAPアプリケーションを利用するクライアント側で出力するアプリケーションログのことをいいます。

14.5.1　アプリケーションログに出力される内容

アプリケーションログに出力される内容を次に示します。

表14‒8　アプリケーションログの出力内容

項目

内容

日付

出力時の日付（yyyy/mm/dd形式）が出力されます。

時刻

出力時の時刻（hh:mm:ss形式）が出力されます。

メッセージの種類

メッセージの種類によって，次のどれかが出力されます。

Request SOAP Message

クライアントからSOAPアプリケーションに対して送信されたメッセージであることを意味します。

Response SOAP Message

SOAPアプリケーションからクライアントに対する応答メッセージであることを意味します。

Fault Response SOAP Message

SOAPアプリケーションからクライアントに対するSOAP Faultメッセージであることを意味します。

上記以外

添付ファイル付きSOAPメッセージのMIMEヘッダであることを示します。

シーケンス番号

シーケンス番号が出力されます。「Seq：<シーケンス番号>」の形式で出力されます。

メッセージまたは引数

メッセージまたは引数が出力されます。メッセージの場合はXML形式で出力されます。提供するAPIの場合は引数の文字列表現で出力されます。

アプリケーションログが出力されるタイミングと同時に，トレースファイルにメッセージの種類およびシーケンス番号の文字列が出力されます。これによって，アプリケーションログの情報がどのタイミングで出力されたのかをトレースファイルから解析できます。

アプリケーションログの出力に関する注意事項を示します。

(1)　送受信メッセージの文字コードに関する注意

アプリケーションログに出力される送受信メッセージの文字コードは，OSのデフォルト文字コードになります。送受信されたメッセージの文字コードと，OSのデフォルト文字コードが異なる場合は，送受信されたメッセージの文字コードと，アプリケーションログに出力されるメッセージの文字コードが異なります。

(2)　受信メッセージの文字参照の有無に関する注意

アプリケーションログに出力される受信メッセージの文字参照の有無は，動作定義ファイルの設定に従います。受信されたメッセージの文字参照の有無と，定義ファイルでの文字参照の有無の設定が異なる場合は，アプリケーションログに出力されるメッセージの内容と，受信したメッセージの内容が異なります。

14.5.2　アプリケーションログ出力の重要度

アプリケーションログを出力する場合は，動作定義ファイルに重要度を設定します。次にアプリケーションログ出力の重要度を示します。

表14‒9　アプリケーションログの重要度および出力内容

重要度

出力内容

WARN

アプリケーションログを出力しません。

INFOまたはDEBUG

主要なAPIの引数およびSOAPメッセージを出力します。

注意事項

アプリケーションログとして出力される情報は，SOAPアプリケーションに対して送受信するメッセージの内容によってはサイズが大きくなり，性能に影響が出ることがあります。通常運用では，出力しないように設定することをお勧めします。

14.6　異常発生時のアプリケーションログの出力

SOAPアプリケーション開発支援機能およびSOAP通信基盤では，SOAPアプリケーションへの要求とSOAPアプリケーションからの応答時のSOAPメッセージを，異常が発生した場合にアプリケーションログとして出力できます。

「異常が発生した場合」とは，次のような場合のことです。

サーバ側

SOAPエンジンがSOAP Faultを返す場合

SOAPエンジンがjava.lang.Error相当の例外をJ2EEサーバにスローする場合

クライアント側

SOAPクライアントライブラリが，クライアントプログラムにC4Fault例外をスローする場合

SOAPクライアントライブラリが，クライアントプログラムにjava.lang.Error相当の例外をスローする場合

SOAPクライアントライブラリが，クライアントプログラムにjavax.xml.soap.SOAPException例外をスローする場合

注意事項

SOAP Faultを返す場合やC4Fault例外を返す場合でも，SOAPメッセージ以外のHTTPメッセージを受信したときは，アプリケーションログが出力されないことがあります。

14.6.1　アプリケーションログに出力される内容

異常が発生した場合にアプリケーションログに出力される内容を次に示します。

表14‒10　異常発生時のアプリケーションログの出力内容

項目

内容

日付

出力時の日付（yyyy/mm/dd形式）が出力されます。

時刻

出力時の時刻（hh:mm:ss形式）が出力されます。

メッセージの種類

メッセージの種類によって，次のどちらかが出力されます。

Request SOAP Message(error record)

異常が発生した場合のリクエストメッセージを示します。

Response SOAP Message(error record)

異常が発生した場合のレスポンスメッセージを示します。

シーケンス番号

シーケンス番号を出力します。「Seq：<シーケンス番号>」の形式で出力されます。

メッセージ

メッセージはXML形式で出力されます。ただし，メッセージが破壊されている場合，または文字コードが不正の場合は16進文字列形式で出力されます。

アプリケーションログが出力されるタイミングと同時に，トレースファイルにメッセージの種類およびシーケンス番号の文字列が出力されます。これによって，アプリケーションログの情報がどのタイミングで出力されたのかをトレースファイルから解析できます。

異常発生時のアプリケーションログの出力に関する注意事項を示します。

(1)　送受信メッセージの文字コードに関する注意

アプリケーションログに出力される送受信メッセージの文字コードは，OSのデフォルト文字コードになります。送受信されたメッセージの文字コードと，OSのデフォルト文字コードが異なる場合は，送受信されたメッセージの文字コードと，アプリケーションログに出力されるメッセージの文字コードが異なります。

(2)　受信メッセージの文字参照の有無に関する注意

アプリケーションログに出力される受信メッセージの文字参照の有無は，動作定義ファイルの設定に従います。受信されたメッセージの文字参照の有無と，定義ファイルでの文字参照の有無の設定が異なる場合は，アプリケーションログに出力されるメッセージの内容と，受信したメッセージの内容が異なります。

14.6.2　異常発生時のアプリケーションログの出力方法

異常発生時のアプリケーションログを出力する場合は，動作定義ファイルに出力ポイントの指定値を設定します。動作定義ファイルに指定する値と出力内容を次に示します。

表14‒11　動作定義ファイルに指定する値と出力内容

指定値

出力内容

ALL

異常発生時に，送信および受信メッセージをアプリケーションログに出力します。

SEND

異常発生時に，送信メッセージをアプリケーションログに出力します。

RECV

異常発生時に，受信メッセージをアプリケーションログに出力します。

NONE

アプリケーションログを出力しません。

注意事項

アプリケーションログ出力の重要度の設定とは関係なく，異常発生時のアプリケーションログが設定されます。

異常発生時のアプリケーションログを出力する場合，送受信するメッセージの長さによっては，java.lang.OutOfMemoryError例外が発生することがあります。その場合は，JVMのヒープサイズを調整してください。

14.7　性能解析トレース

SOAPアプリケーションの性能解析トレースについて説明します。この性能解析トレースは，アプリケーションサーバシステムが提供する性能解析トレースの一部として提供します。

アプリケーションサーバシステムが提供する性能解析トレース機能については，マニュアル「アプリケーションサーバ 機能解説 保守／移行編」を参照してください。

14.7.1　トレース取得ポイント

性能解析トレースのトレース取得ポイントを次の図に示します。

図14‒2　性能解析トレースのトレース取得ポイント

イベントID，トレース取得ポイント，および性能解析トレース取得レベルを次の表に示します。表の「図中の番号」は，図14-2中の番号と対応しています。

表14‒12　トレース取得ポイントの詳細

イベント

ID

図中の

番号

トレース取得ポイント

レベル

0x9000

1

SOAPクライアントの開始

A

0x9022

2

送信側ハンドラの呼び出し※1※2

B

0x9026

ハンドラの呼び出し※1※2

B

0x9023

送信側ハンドラからの戻り※1※2

B

0x9027

ハンドラからの戻り※1※2

B

0x9004

3

クライアントからSOAPメッセージをサービスに送信

A

0x9008

4

SOAPサービスの開始

A

0x9024

5

受信側ハンドラの呼び出し※1※2

B

0x9026

ハンドラの呼び出し※1※2

B

0x9025

受信側ハンドラからの戻り※1※2

B

0x9027

ハンドラからの戻り※1※2

B

0x9010

6

サービスの初期化処理の呼び出し

B

0x9011

サービスの初期化処理からの戻り

B

0x9012

7

サービスの呼び出し

A

0x9013

サービスからの戻り

A

0x9016

8

サービスの終了処理の呼び出し

B

0x9017

サービスの終了処理からの戻り

B

0x900c

9

SOAPサービスからのSOAPメッセージ書き込み開始

B

0x900d

10

SOAPサービスからのSOAPメッセージ書き込み終了

B

0x9009

11

SOAPサービスの終了

A

0x9005

12

クライアントでSOAPメッセージをサービスから受信

A

0x9001

13

SOAPクライアントの終了

A

（凡例）

A：標準

B：詳細

注※1

ハンドラは，Webサービスセキュリティ機能などを使用すると出力されます。

注※2

動作定義ファイルで「prf_trace_level=NONHANDLER」を指定すると出力されません。

14.7.2　性能解析トレースの利用方法

性能解析トレースファイルを使用して性能を解析する場合，CSV形式のファイルを編集できるアプリケーションプログラムで表示し，目的に合わせてフィルタリングや並べ替えの機能を利用して性能を解析します。

性能解析トレースファイルの利用方法について，SOAPサービスおよびサービスのレスポンスタイムの解析を例として説明します。

(1)　SOAPサービスおよびサービスのレスポンスタイムの解析例

SOAPサービスがクライアントからリクエストを受けてから返却するまでに掛かった時間を解析します。

イベントID「0x9008」，「0x9009」，「0x9012」，および「0x9013」をキーにして，収集した性能解析トレースファイルをフィルタリングします。フィルタリングに使用するイベントIDが示すトレース取得ポイントを次に示します。

表14‒13　フィルタリングに使用するイベントIDが示すトレース取得ポイント

イベントID

トレース取得ポイント

0x9008

SOAPサービスの開始

0x9009

SOAPサービスの終了

0x9012

サービスの呼び出し

0x9013

サービスからの戻り

イベントID「0x9008」，「0x9009」，「0x9012」，および「0x9013」をキーにして，性能解析トレースファイルをフィルタリングした例を次に示します。

図14‒3　性能解析トレースファイルをフィルタリングした例

「0x9008」および「0x9009」のトレース取得時刻から，SOAPサービスのレスポンスタイムを解析できます。

「0x9012」および「0x9013」のトレース取得時刻から，サービスのレスポンスタイムを解析できます。

14.7.3　性能解析トレース使用時の注意事項

性能解析トレースを使用する際の注意事項を次に示します。

SOAPアプリケーションの性能解析トレースを出力する場合は，性能解析トレースの取得レイヤに「SOAP通信基盤」の取得レイヤを設定してください。また，J2EEサーバで性能解析トレースを出力できる状態にする必要があります。指定方法については，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

性能解析トレースは，性能解析トレース取得レベルによって出力されるトレース情報が異なります。性能解析トレース取得レベルと出力されるトレース情報を次の表に示します。

表14‒14　性能解析トレース取得レベルと出力されるトレース情報

性能解析トレース取得レベル

出力されるトレース情報

取得レイヤの取得レベル※1

動作定義ファイルの取得レベル※2

取得ポイントの取得レベル※3

ハンドラ部分のトレース情報※4

ハンドラ部分以外のトレース情報※4

標準

ALL

標準

○

○

詳細

×

×

NONHANDLER

標準

×

○

詳細

×

×

詳細

ALL

標準

○

○

詳細

○

○

NONHANDLER

標準

×

○

詳細

×

○

（凡例）

○：性能解析トレースが出力されます。

×：性能解析トレースが出力されません。

注※1

取得レイヤはSOAP通信基盤の機能レイヤになります。取得レイヤの取得レベルは，cprflevelコマンドで変更できます。cprflevelコマンドについては，マニュアル「アプリケーションサーバ リファレンス コマンド編」を参照してください。

注※2

動作定義ファイルの「prf_trace_level」キーで変更できます。

注※3

取得ポイントの取得レベルは変更できません。取得ポイントの取得レベルについては，「14.7.1　トレース取得ポイント」を参照してください。

注※4

ハンドラ部分のトレース情報とは，イベントIDが0x9020〜0x902Fのトレースのことです。

14.8　FAQ

SOAPを利用した通信ができない場合の，考えられる原因や対処方法について示します。

14.8.1　アプリケーションログが出力されません。どのように対処すればよいですか？

アプリケーションログを出力するには，動作定義ファイルの設定が必要になります。「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照して，動作定義ファイルが正しく設定されているかを確認してください。特に次に示す点に注意してください。

識別子の内容

サーバ側のアプリケーションログは，SOAPアプリケーションごとに出力されます。識別子の内容が，コンテキストルートから「/」を抜いた名称と一致しているか確認してください。

アプリケーションログ出力の重要度

アプリケーションログを出力するかどうかは，アプリケーションログ出力の重要度の項目によって設定します。設定値が「INFO」または「DEBUG」になっているか確認してください。設定値は大文字と小文字が区別されるため，注意してください。

動作定義ファイルの設定後の再起動

動作定義ファイルを設定したあとに，SOAPアプリケーションを再起動したかどうかを確認してください。設定した内容が反映されるのは，SOAPアプリケーションの再起動時になります。

動作定義ファイルの状態およびディスクの空き容量

動作定義ファイルに設定したディレクトリやファイルが書き込みできる状態になっているか確認してください。また，ディスクの空き容量は十分かどうか確認してください。

14.8.2　クライアントからSOAPメッセージが正しく出力されません。どのように対処すればよいですか？

メソッド呼び出しで例外が発生していないか確認してください。また，ほかのメソッドやほかのSOAPサービスで，SOAPメッセージが正しく出力されているかどうかを確認することで，特定のメソッド呼び出しだけの問題かどうか確認できます。

メソッドを呼び出すときに，SOAPクライアントライブラリが動作しているかどうかを確認するには，トレースファイルを利用できます。出力されるトレースファイルのメッセージテキストの次に示すキーワードを参照することで，どこまで動作しているか把握できます。

exit Service::createCall

クライアントの通信に必要なクラスが生成されたときに出力します。

enter Call::invoke(Object[])：RPC形態の場合

enter SOAPConnectionImpl::call(SOAPMessage, Object)：メッセージング形態の場合

通信に必要なパラメタなどを指定したあとに，SOAPメッセージの送信のための処理を開始したときに出力します。

exit HTTPSender::invoke

サーバから返信用のSOAPメッセージが戻ってきたときに出力します。

トレースファイルに出力される形式に関しては，「14.4　トレースファイル」を参照してください。

14.8.3　SOAPメッセージがサーバに届きません。原因として何が考えられますか？

クライアントからSOAPメッセージが正しく出力されているのに，サーバにSOAPメッセージが届かない場合は，送信先の指定が間違っているおそれがあります。クライアントからスタブを利用するときに指定する送信先URLを確認してください。次に送信先URLの例を示します。

http://hostname:8080/WebApp1/services/UserInfo

送信先URLの形式，ポート番号，コンテキストルートの指定内容などが正しいか確認してください。

また，Webサーバが正しく動作しているか確認してください。SOAPによる通信ができないだけでなく，HTMLファイルが表示できない場合は，通信路に問題がないかについても確認してください。

14.8.4　SOAPサービスでメッセージを処理できません。どのように対処すればよいですか？

サーバにSOAPメッセージが届いているのに，正しいSOAPメッセージを返せない場合は，送信されたSOAPメッセージの内容が正しいか，および送信されたSOAPメッセージが正しく処理されているか確認します。

送信されたSOAPメッセージの内容が正しいかについては，アプリケーションログの内容を確認してください。送信されたSOAPメッセージが，SOAPサービスとして公開しているサービスに対応したものかどうかや，メソッド名，パラメタ名，およびパラメタに指定している内容などを確認してください。

SOAPメッセージがSOAPサービスで正しく処理されているかの確認は，サーバトレースを利用できます。出力されたファイルに記述された次のキーワードを参照することで，どこまで動作しているか把握できます。

invoke User RPC Service：RPC形態の場合

invoke User Messaging Service：メッセージング形態の場合

SOAP通信基盤からSOAPサービスの実装クラスを呼び出す直前に出力します。

return User RPC Service：RPC形態の場合

return User Messaging Service：メッセージング形態の場合

SOAPサービスの実装クラスの呼び出しからSOAP通信基盤に戻ってきたときに出力します。

トレースファイルに出力される形式に関しては，「14.4　トレースファイル」を参照してください。

また，ユーザが作成するSOAPサービスの実装そのものが正しく動作しているかどうかについても確認してください。

14.8.5　サーバから返信用SOAPメッセージが正しく出力されていません。原因として何が考えられますか？

サーバから返信用SOAPメッセージが正しく出力されない場合は，SOAPサービスで処理した結果として正しいSOAPメッセージを返せないことが考えられます。「14.8.4　SOAPサービスでメッセージを処理できません。どのように対処すればよいですか？」を参照し，送信されてきたSOAPメッセージの内容が正しいか，およびそのメッセージを正しく処理できているか確認してください。

14.8.6　クライアントへ返信用SOAPメッセージが届いていません。どのように対処すればよいですか？

SOAPサービスでは正しく処理できているのに，クライアントへ意図したSOAPメッセージが届いていない場合は，サーバトレースおよびクライアントトレースによって，SOAPメッセージの内容が正しいか，およびそのメッセージが正しく処理されているかを確認してください。トレースファイルの確認方法については，次に示す内容を参照してください。

「14.8.2　クライアントからSOAPメッセージが正しく出力されません。どのように対処すればよいですか？」

「14.8.4　SOAPサービスでメッセージを処理できません。どのように対処すればよいですか？」

14.8.7　クライアントで返信用メッセージを処理できません。どのように対処すればよいですか？

クライアントに返信用SOAPメッセージが届いているのに，クライアント側で処理できない場合は，クライアントトレースによって，SOAPメッセージの内容が正しいか，およびそのメッセージが正しく処理されているかを確認してください。トレースファイルの確認方法については，「14.8.2　クライアントからSOAPメッセージが正しく出力されません。どのように対処すればよいですか？」を参照してください。

14.8.8　Application Serverで提供しているSOAPクライアント以外のクライアントから通信できません。原因として何が考えられますか？

Application Serverで提供しているクライアント以外のクライアントでは，SOAP 1.1に対するサポート範囲や解釈の違いから，Application Serverで提供するSOAP通信基盤で扱えない形式のSOAPメッセージを出している可能性があります。SOAP通信基盤が扱えるSOAP 1.1の範囲については，「12.1　SOAP 1.1との対応」を参照してください。

Application Serverで提供しているクライアント以外のクライアントと，Application Server上で動作しているSOAPサービス間の通信ができない場合，クライアント部分に関してはご使用のクライアントから提供される情報に従って対処してください。

Application Serverが提供しているSOAP通信基盤のサポート範囲外のSOAPメッセージか，Application Server以外のクライアントの動作に問題があるかを切り分けるには，同じWSDLを利用してApplication ServerのSOAPクライアントライブラリからApplication Server上で動作しているSOAPサービスへの通信ができるかどうかを試すのが有効です。

また，サポート範囲外のメッセージを出していないか，および内容に問題ないかを確認するには，ご使用のクライアントとApplication ServerのSOAPクライアントライブラリを使用した場合に出力されるメッセージの比較が有効です。Application ServerのSOAPクライアントライブラリを使用した場合のメッセージの確認は，アプリケーションログを参照してください。アプリケーションログについては，「14.5　アプリケーションログ」を参照してください。

14.8.9　プロキシサーバを越えて外部のSOAPサービスを利用できますか？

利用できます。外部のSOAPサービスを利用する場合，クライアント定義ファイルのプロキシオプションに必要な情報を設定します。プロキシオプションの設定項目については，「10.6.6　プロキシオプション」を参照してください。クライアント定義ファイルの設定については，「10.3　クライアント定義ファイルの設定」を参照してください。

14.8.10　他社製品と接続するときにHTTPヘッダ中のSOAPAction値の設定が必要なケースがあります。Application ServerのSOAPクライアントでSOAPAction値は設定できますか？

設定できます。RPC形態のSOAPアプリケーションを例に，SOAPAction値を設定する方法を説明します。

RPC形態の場合，WSDL内でSOAPAction値を指定する個所を直接変更して，そのWSDLからスタブのソースコードを自動生成することで，送信メッセージのSOAPAction値を指定します。Java2WSDLコマンドでWSDLを生成すると，SOAPAction値はデフォルトで「""」が設定されます。次に，SOAPAction値の指定個所を抜粋したWSDLの例を示します。

自動生成されたWSDLの例（デフォルト値）

  <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getUserData">
       <soap:operation soapAction="" />
       <wsdl:input>
           <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost" use="literal" />
       </wsdl:input>

SOAPAction値を変更したWSDLの例

  <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="getUserData">
       <soap:operation soapAction="http://localhost" />
       <wsdl:input>
           <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost" use="literal" />
       </wsdl:input>

14.8.11　SOAPサービスを呼び出す時にユーザ認証が必要な場合，どのようにユーザIDやパスワードを設定すればよいですか？

次のように，呼び出すサービスのURLにユーザIDとパスワードを指定することで，ユーザ認証が必要なSOAPサービスを呼び出すことができます。

http://<ユーザID>:<パスワード>＠<ホスト名またはIPアドレス>:<ポート番号>/・・・

なお，SOAP通信基盤では，BASIC認証だけに対応しています（DIGEST/FORM/CLIENT-CERT認証には対応していません）。

次に，ユーザIDとパスワードを指定する実装例を示します。

RPC形態の場合

サービスクラス名：UserInfoServiceLocator

インタフェースクラス名：UserInfo

サービスのURL：http://hostname:8080/WebApp1/services/UserInfo

設定するユーザID：user1

設定するパスワード：pass1

このような場合，次のように実装します。

UserInfoServiceLocator uis = new UserInfoServiceLocator();
java.net.URL endpoint = new java.net.URL("http://user1:pass1@hostname:8080/WebApp1/services/UserInfo");
UserInfo ui = uis.getUserInfo(endpoint);

14.8.12　SOAPメッセージで要素の省略を含んだ配列を使用するにはどのようにしたらよいですか？

メッセージング形態のSOAPアプリケーションを利用してください。RPC形態のSOAPアプリケーションでは，配列の要素を省略したSOAPメッセージを生成することはできません。

配列要素の省略とは，SOAPメッセージ中で，配列にoffsetを指定した場合，positionを指定した場合，配列要素にnil値を指定した場合，配列のサイズよりも要素の数が少なかった場合です。

他社製品のクライアントから接続する場合などで，配列要素の省略を含んだSOAPメッセージを受け取るRPCサービスを実装するときの注意点を次に示します。

RPC呼び出しの引数として，int[]やdouble[]のように，Javaの基本データ型を要素に持つ配列を使用した場合，配列要素が省略されていると，サービスからSOAP Faultが返ります。

表14‒15　基本データ型配列要素が省略されていた場合のSOAP Faultの内容

SOAP Faultの要素

内容

faultcode

{http://c4web.cosminexus.com}:Server.userException

faultstring

KDCCF9000-E C4Fault exception occurred. Detail = java.lang.NullPointerException

faultactor

なし

detail

なし

RPCサービス実装で配列要素の省略を使用しなくてはならない場合は，配列要素に基本データ型のラッパークラスを使用してください。

基本データ型のラッパークラスとは，java.lang.Integerクラスやjava.lang.Doubleクラスなどの，基本データ型の値を格納することのできるクラスです。

配列要素がクラスである場合，省略された要素にはnull値が格納されます。

14.8.13　SOAPクライアントからSSLを使用してSOAPサービスに接続するにはどのようにすればよいですか？

SSLを使用するためには，暗号化に使用する鍵を格納するキーストアや証明書を格納するトラストストアを用意し，それらの情報をSOAPクライアント実行時に設定する必要があります。また，SSL認証の種類によって必要となるストア情報が異なります。次にSSL認証の種類と，それに必要なストア情報の関係を示します。

表14‒16　SSL認証の種類とストア情報の関係

認証の種類 ※1

キーストア情報 ※2

トラストストア情報 ※2

キーストア

キーストア

パスワード

トラストストア

トラストストア

パスワード

サーバ認証

−

−

○

○

クライアント認証

○

○

○ ※3

○ ※3

相互認証

○

○

○

○

（凡例）

○：設定します。

−：設定しません。

注※1

認証の種類によって，それぞれ次のような準備が必要です。

サーバ認証

サーバ認証をするためには，サーバ証明書を発行した機関のルート証明書をあらかじめトラストストアに格納しておく必要があります。

クライアント認証

クライアント認証をするためには，クライアント証明書をあらかじめキーストアに格納しておく必要があります。中間証明書が存在する場合は，トラストストアに格納しておきます。

相互認証

サーバ認証およびクライアント認証の両方の準備をする必要があります。

注※2

キーストア情報およびトラストストア情報は，次の各プロパティに設定します。

キーストア：javax.net.ssl. keyStore

キーストアパスワード：javax.net.ssl. keyStorePassword

トラストストア：javax.net.ssl.trustStore

トラストストアパスワード：javax.net.ssl.trustStorePassword

注※3

中間証明書が存在する場合は設定する必要があります。

Application Serverを使用する場合は，usrconf.propertiesに必要なプロパティを設定します。usrconf.propertiesについては，マニュアル「アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。

次に使用例を示します。

（例）サーバ認証をする場合

usrconf.propertiesファイルに次のプロパティを設定します。

javax.net.ssl.trustStore=<トラストストアの絶対パス>

javax.net.ssl.trustStorePassword=<トラストストアパスワード>

（例）相互認証をする場合

usrconf.propertiesファイルに次のプロパティを設定します。

javax.net.ssl.keyStore=<キーストアの絶対パス>

javax.net.ssl.keyStorePassword=<キーストアパスワード>

javax.net.ssl.trustStore=<トラストストアの絶対パス>

javax.net.ssl.trustStorePassword=<トラストストアパスワード>

注意事項

usrconf.properties中にストアのパスワードを設定する場合，usrconf.propertiesの読み取り権限を限定するなど，第三者にパスワードを読み取られないように注意してください。コマンドラインを使用する場合も，同様に注意してください。

SSLの接続に対して使用可能なプロトコルは，JDKのバージョンに依存します。使用可能なプロトコルについては，JDKのドキュメントを参照してください。また，JDKのhttps.protocolsプロパティによる使用可能なプロトコルの変更はできませんので注意してください。

SOAPクライアントから，SSLプロトコルに対応したSOAPサーバに接続する場合，エンドポイントアドレスに含まれるホスト名と，証明書のホスト名が一致しているかどうかを検証します。ホスト名が一致していない場合，KDCCP0012-EメッセージのC4Faultが発生します。

ホスト名の検証を無効にしたい場合は，サーバ定義ファイルまたはクライアント定義ファイルの次のプロパティにfalseを設定してください。

サーバ定義ファイル

　c4web.application.<識別子>.hostname_verification.enable

クライアント定義ファイル

　c4web.application.hostname_verification.enable

サーバ定義ファイルについては，「10.2　サーバ定義ファイルの設定」を参照してください。クライアント定義ファイルについては，「10.3　クライアント定義ファイルの設定」を参照してください。

14.8.14　性能解析トレースが出力されません。どのように対処すればよいですか？

性能解析トレースを出力するには，動作環境に応じた設定が必要です。「14.7.3　性能解析トレース使用時の注意事項」を参照して，動作環境を正しく設定してください。

付録

付録A　SOAPアプリケーションの移行

SOAPアプリケーション開発支援機能，およびSOAP通信基盤をバージョンアップした場合，旧バージョンの環境で開発したSOAPアプリケーションを最新バージョンの環境で使用するには，SOAPアプリケーションを移行する必要があります。ここでは，バージョンごとにSOAPアプリケーションの移行手順について説明します。

付録A.1　互換モードで動作するSOAPアプリケーションを移行する場合の注意事項

バージョン09-00以降では，SOAP通信基盤 互換モードを同梱していません。SOAP通信基盤 互換モードを利用している場合は，SOAPアプリケーションを移行してください。

(1)　RPC形態のSOAPアプリケーションの移行

RPC形態では，WSDL定義から生成されるスタブ，スケルトン，サービスデプロイ定義ファイル（server-config.xml），DD（web.xml），およびユーザ実装を修正する必要があります。

ここでは，SOAPアプリケーションを新規開発した場合と，既存のJavaクラスを利用して開発した場合に分けて移行手順を説明します。

新規開発した場合の移行手順（RPC）

WSDL2Javaコマンドを使用してWSDLからクライアントのスタブ，サービスのスケルトン，およびサービスデプロイ定義ファイルを再生成します。

ユーザ実装部分でSOAP通信基盤が提供するAPIを使用している場合は，パッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

DD（web.xml）中のパッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

コンパイル後，J2EEサーバに配置するためのアーカイブ（WARファイル）を作成します。

アーカイブの作成については，「3.9　アーカイブ（WARファイル）の作成」を参照してください。

WARファイルをデプロイします。

これでSOAPアプリケーションの移行は完了です。

既存のJavaクラスを利用して開発した場合の移行手順（RPC）

WSDL2Javaコマンドを使用してWSDLからクライアントのスタブを再生成します。

ユーザ実装部分でSOAP通信基盤が提供するAPIを使用している場合は，パッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

Java2WSDDコマンドを使用してサービスデプロイ定義ファイルを再生成します。

DD（web.xml）中のパッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

J2EEサーバに配置するためのアーカイブ（WARファイル）を作成します。

アーカイブの作成については，「3.9　アーカイブ（WARファイル）の作成」を参照してください。

WARファイルをデプロイします。

これでSOAPアプリケーションの移行は完了です。

(2)　EJBを利用したSOAPアプリケーションの移行

EJBを利用したSOAPアプリケーションを移行するには，WSDL定義から生成されるスタブ，サービスデプロイ定義ファイル（server-config.xml），DD（web.xml），およびユーザ実装を修正する必要があります。

ここでは，SOAPアプリケーションを既存のEJBを利用して開発した場合の移行手順について説明します。

移行手順

WSDL2Javaコマンドを使用してクライアントのスタブを再生成します。

ユーザ実装部分でSOAP通信基盤が提供するAPIを使用している場合は，パッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

Java2WSDDコマンドを使用してサービスデプロイ定義ファイルを再生成します。

DD（web.xml）中のパッケージ名「com.cosminexus.c4web.*」を「com.cosminexus.cws.*」に変更します。

J2EEサーバに配置するためのアーカイブ（WARファイル）を作成します。

アーカイブの作成については，「3.9　アーカイブ（WARファイル）の作成」を参照してください。

WARファイルをデプロイします。

これでSOAPアプリケーションの移行は完了です。

(3)　メッセージング形態のSOAPアプリケーションの移行

メッセージングを利用したSOAPアプリケーションでは，SAAJを利用したSOAPアプリケーションの形態に変更する必要があります。SAAJを利用したSOAPアプリケーションの開発例については，「6.　メッセージング形態のSOAPアプリケーションの開発例」を参照してください。

付録B　添付ファイル使用時に作成される退避ファイル

添付ファイル付きのSOAPメッセージを受信した場合，メモリ使用量を抑制するために，添付ファイルのサイズに応じて退避ファイルが作成されます。ここでは，作成される退避ファイルについて説明します。

付録B.1　退避ファイルの詳細

ここでは，退避ファイルの格納先，サイズ，および個数について説明します。

(1)　退避ファイルの格納先

退避ファイルの格納先を次の表に示します。

表B‒1　退避ファイルの格納先

分類

説明

出力先ディレクトリ

動作定義ファイルの「c4web.attachment.attachment_temp_directory」または「c4web.attachment.<識別子>.attachment_temp_directory」で設定したディレクトリです。動作定義ファイルの設定については，「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照してください。動作定義ファイルで退避ファイルの出力先ディレクトリを設定していない場合や，設定したディレクトリが使用できない場合，退避ファイルは次の場所に格納されます※。

Windowsの場合：

<Application Serverのインストールフォルダ>¥c4web¥attachments

Windows以外の場合：

/opt/Cosminexus/c4web/attachments

ファイル名

ファイル名は，SOAPアプリケーションが動作する形態によって異なります。ファイル名は変更しないでください。

コマンドラインで動作するSOAPアプリケーションの場合：

CosmiSOAP_<数字とアンダースコアから構成される文字列>.tmp

J2EEサーバ上で動作するSOAPアプリケーションの場合：

CosmiSOAP_j2ee_<J2EEサーバ名>_<数字とアンダースコアから構成される文字列>.tmp

注※

動作定義ファイルで退避ファイルの出力先ディレクトリを設定する場合，次のことを確認してください。

・指定したディレクトリが存在すること

・指定したディレクトリにアクセスできること

(2)　退避ファイルのサイズ

退避ファイルと添付ファイルは1対1で対応しているため，個々の退避ファイルのサイズは，受信する添付ファイルのサイズと同じサイズとなります。

退避ファイルのディスク使用量の見積もりについては，「付録B.3　退避ファイルのディスク使用量の見積もり方法」を参照してください。

(3)　退避ファイルの数

受信した添付ファイルのうち，退避ファイルを生成する条件に当てはまる添付ファイルの数と同じ数だけ退避ファイルが生成されます。一つのSOAPメッセージに複数の添付ファイルがある場合，一度のSOAPメッセージ受信で複数の退避ファイルが生成されることもあります。

退避ファイルを生成する条件については，「付録B.2(1)　退避ファイルが生成される条件」を参照してください。

付録B.2　退避ファイルの生成と削除

ここでは，退避ファイルが生成される条件，および退避ファイルが削除されるタイミングについて説明します。

(1)　退避ファイルが生成される条件

受信したメッセージの添付ファイルのサイズが16KBより大きい場合，退避ファイルが生成されます。一つのSOAPメッセージに複数の添付ファイルがある場合は，サイズが16KBより大きい添付ファイルに対してだけ退避ファイルが生成されます。添付ファイルのサイズが16KB以下の場合は，退避ファイルは生成されません。

(2)　退避ファイルの削除

退避ファイルは，次の場合にSOAP通信基盤によって自動的に削除されます。

添付ファイルへの参照がすべて破棄された場合

JavaVMのファイナライズ処理の実行時に，添付ファイルへの参照がなければ，退避ファイルは自動的に削除されます。添付ファイルへの参照が残っている場合，退避ファイルは削除されません。

退避ファイルの占有期間を短くするためにも，JAFのjavax.activation.DataHandlerオブジェクトへの参照や，javax.activation.DataHandlerオブジェクトから取得できるjava.io.InputStreamオブジェクトへの参照などは，不要になった時点ですぐに破棄することをお勧めします。

SOAPサービスの呼び出しが終了する場合

受信した添付ファイルに対応する退避ファイルは自動的に削除されます。

JavaVMが終了する場合

J2EEサーバの停止や，コマンドラインから実行したSOAPクライアントの終了など，JavaVMが終了するタイミングで退避ファイルは自動的に削除されます。

また，APIを使用して退避ファイルを削除することもできます。

ManagementクラスのdisconnectClientIDtoCurrentThreadメソッドが呼び出された時に，退避ファイルが削除されます。このとき，connectClientIDtoCurrentThreadメソッドの呼び出しからdisconnectClientIDtoCurrentThreadメソッドの呼び出しまでに，現在のスレッドで受信した添付ファイルに対応する退避ファイルが削除されます。

なお，connectClientIDtoCurrentThreadメソッドの呼び出しからdisconnectClientIDtoCurrentThreadメソッドの呼び出しまでに，SOAPサービスを複数回呼び出した場合は，対応するすべての退避ファイルが削除されます。

Managementクラスの詳細については，「3.7.2　ManagementクラスとClientIDクラスの使用」を参照してください。

注意事項

J2EEサーバのプロセスを強制停止した場合など，ユーザが意図しないでSOAP通信基盤が停止されたときは，退避ファイルが削除されないことがあります。この場合は退避ファイルの格納先を確認し，必要に応じて手動で退避ファイルを削除してください。

付録B.3　退避ファイルのディスク使用量の見積もり方法

ここでは，退避ファイルのディスク使用量を見積もり方法について説明します。

退避ファイルのディスク使用量の算出式を次に示します。

SOAPサービスの場合

退避ファイルの最大ディスク使用量＝
<受信添付ファイルの最大サイズ※1> × <受信添付ファイルの最大数※2> × <同時実行数※3>

＜例＞

次の条件の場合，退避ファイルの最大ディスク使用量は，100,000MBとなります。

受信できる添付ファイルの最大サイズ：100MB

受信できる添付ファイルの最大数：100個

同時実行数：10

SOAPクライアントの場合

退避ファイルの最大ディスク使用量＝
<受信添付ファイルの最大サイズ※1> × <受信添付ファイルの最大数※2> × <サービス呼び出し回数※4>

＜例＞

次の条件の場合，退避ファイルの最大ディスク使用量は，10,000MBとなります。

受信できる添付ファイルの最大サイズ：100MB

受信できる添付ファイルの最大数：100個

SOAPサービスを呼び出す回数：1回

注※1

受信添付ファイルのサイズは，生成される退避ファイルのサイズに影響します。生成される退避ファイルのサイズが大きくなるとディスク使用量が増えるため，注意してください。受信できる添付ファイルの最大サイズは，動作定義ファイルの「c4web.attachment.receive_max_attachment_size」または「c4web.attachment.<識別子>.receive_max_attachment_size」で設定できます。動作定義ファイルの設定については，「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照してください。

注※2

受信添付ファイルの個数は，生成される退避ファイルの個数に影響します。生成される退避ファイルの個数が多くなるとディスク使用量が増えるため，注意してください。受信できる添付ファイルの最大の個数は，動作定義ファイルの「c4web.attachment.receive_max_attachment_count」または「c4web.attachment.<識別子>.receive_max_attachment_count」で設定できます。動作定義ファイルの設定については，「10.　動作定義ファイルおよび実行時オプションの設定項目」を参照してください。

注※3

同時実行数は，生成される退避ファイルの個数に影響します。生成される退避ファイルの個数が多くなるとディスク使用量が増えるため，注意してください。J2EEサーバ上で動作するSOAPサービスの場合，J2EEサーバの同時実行スレッド数の設定や，Webサーバの同時接続数の設定をすることで，同時実行数を制限できます。

J2EEサーバの同時実行スレッド数の設定については，マニュアル「アプリケーションサーバ 機能解説 基本・開発編(Webコンテナ)」を参照してください。Webサーバの同時接続数の設定については，マニュアル「HTTP Server」を参照してください。

注※4

サービス呼び出し回数は，生成される退避ファイルの個数に影響します。生成される退避ファイルの個数が多くなるとディスク使用量が増えるため，注意してください。

サービス呼び出し回数とは，ManagementクラスのconnectClientIDtoCurrentThreadメソッドの呼び出しからdisconnectClientIDtoCurrentThreadメソッドの呼び出しまでに，現在のスレッドでSOAPクライアントがSOAPサービスを呼び出す回数です。

SOAPサービスを繰り返し呼び出す場合，および複数のSOAPサービスを呼び出す場合，すべての呼び出しの回数を合計してください。

付録C　WS-I Basic Profileに適合したシステムを構築するための注意事項

付録C.1　WS-I Basic Profileについて

WS-I Basic Profile Version 1.0aは，Webサービスの相互接続性を向上させるために，SOAP仕様およびWSDL仕様を明確にすることを目的としてWeb Services Interoperability Organization（WS-I）が制定したガイドラインです。このガイドラインには，WSDL定義を記述するときの記述のあいまいさを軽減したり，SOAPアプリケーションの振る舞いを統一したりする要件が含まれています。このガイドラインに対応すると，同じく対応したほかのシステムとの相互接続性を高めることができます。

SOAPアプリケーション開発支援機能およびSOAP通信基盤では，このガイドラインに沿ったSOAPアプリケーションおよびSOAPアプリケーションを利用するクライアントアプリケーションを開発，運用できます。しかし，そのためにはSOAPアプリケーションおよびクライアントアプリケーション開発時にもガイドラインを意識する必要があります。

付録C.2　新しくSOAPアプリケーションを開発する場合

新しくSOAPアプリケーションを開発する場合，SOAPアプリケーション開発支援機能使用時にWS-I Basic Profileに対応させるために必要となる設定は特にありません。ガイドラインを意識してSOAPアプリケーションを開発してください。

付録C.3　WS-I Basic Profile 1.0aに対応するための注意事項

SOAP通信基盤によってWS-I Basic Profile 1.0aに対応したSOAPアプリケーションを運用する場合の注意事項について説明します。

(1)　メッセージ送信時のHTTPバージョンについて

SOAP通信基盤を利用してSOAPクライアントを運用する場合，SOAPメッセージはHTTP/1.0を使用して送信されます。

(2)　WSDL定義とメッセージとの整合性の確認順序について

SOAP通信基盤では，SOAPメッセージを受信した場合，WSDL定義とメッセージとの整合性を次に示す順に確認してください。矛盾がある場合には，対応するfaultcodeを持つフォルトを返します。また，メッセージがXML的に不正だった場合などに，この順番に関係なくSOAP通信基盤独自のfaultcode"Server"を持つフォルトを返す場合があります。

SOAPエンベロープの名前空間が正しいかどうか

正しくなければVersionMismatchを返します。

サービスが処理しなければならないヘッダを処理しているかどうか

処理していなければMustUnderstandを返します。

それ以外の矛盾がある場合

SOAP通信基盤独自のServerを返します。

(3)　faultcodeについて

サービス実装内でfaultcodeが必要になった場合は，独自の名前空間を用意して独自のfaultcodeを生成するか，SOAP1.1のfaultcodeを使用してください。そのとき，ドット表記で詳細コードを追加することは避けてください。

（例）

×：SomeFaultCode.moreDetailCode

○：SomeFaultCode

独自のfaultcodeを用意しても，ドット表記で詳細コードを追加すると，WS-I Basic Profileに対応しない可能性があります。

SOAPメッセージヘッダ中に，自サービスがあて先として指定されているにもかかわらず，対処できないmustUnderstand属性が"1"であるヘッダがある場合，MustUnderstandのfaultcodeを持つフォルトを作成してください。MustUnderstand以外のfaultcodeを持つフォルトを作成すると，WS-I Basic Profileに対応しない可能性があります。

(4)　RPCでリテラルエンコーディングを使用する場合のbody要素のnamespace属性について

リテラルエンコーディングに対応したWSDL定義を生成する場合は，body要素にはnamespace属性を付加してください。また，その属性値には名前空間を表す絶対URIを指定してください。Body要素にnamespace属性がなかったり属性値が絶対URIでなかったりする場合，WS-I Basic Profileに対応しない可能性があります。

(5)　ユーザ定義配列の型名について

SOAP通信基盤では，開発支援コマンドを使用してユーザ定義クラスの配列を含むソースからWSDL定義を生成する場合，ユーザ定義型名にSequenceOfというプレフィクスを付加した型名を用意します。形名は変更できますが，名称の選択には注意してください。プレフィクスをArrayOfなどに変更すると，WS-I Basic Profileに対応しない可能性があります。

付録D　SOAP通信基盤が返すHTTPステータスコード

SOAP通信基盤が返す HTTPステータスコード，およびHTTPステータスコードを返す条件を次に示します。

表D‒1　SOAP通信基盤が返すHTTPステータスコード

項番

HTTPステータスコード

HTTPステータスコードを返す条件

1

200 OK

SOAPサービスの呼び出しが正常終了した場合。

2

400 Bad Request

SOAPサービスが受信したSOAPメッセージが次に示す状態の場合。

整形式のXML文書ではない不正なXMLである

SOAPサービスのWSDLに従っていない

3

415 Unsupported Media Type

SOAPサービスが受信したHTTP リクエストのContent-Typeヘッダの値が，次に示す値以外の場合。

"text/xml"

"multipart/related"

4

500 Internal Server Error

項番1〜項番3の場合以外で，SOAPサービスがSOAPフォルトを返す場合。

付録E　用語解説

マニュアルで使用する用語について

マニュアル「アプリケーションサーバ & BPM/ESB基盤 用語解説」を参照してください。

索引

記号

.NET Framework使用時のWSDLの生成[1]

.NET Framework使用時のサービスデプロイ定義の生成[1]

.NET Framework使用時の前提条件[1]

.NET Framework使用時のソースコードの生成[1]

.NET Framework使用時の注意事項[1]

A

anyType型のデータ型の送信に関する注意[1]

Application Serverで提供しているSOAPクライアント以外のクライアントから通信できません。原因として何が考えられますか？[1]

AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合の上限サイズ[1]

B

bindingTemplate[1]

businessEntity[1]

businessService[1]

C

C4Fault[1]、[2]

C4Faultクラス（SOAP Fault情報の保持）[1]

C4Propertyクラス（実行時オプションの設定）[1]

C4QName[1]

C4QNameクラス（名前空間の保持）[1]

C4Sessionクラス（セッションの管理）[1]

Callインタフェース（サービスの呼び出し）[1]

Callインタフェース（サービス呼び出しの情報取得）[1]

ClientIDクラス[1]

ClientIDクラス（クライアント識別子）[1]

D

DD（web.xml）での設定項目とサービスロケーションの関係について[1]

DeployScopeに関する注意事項[1]

DeployScopeを「Session」にしたSOAPアプリケーションに関する注意[1]

DII[1]

DIIでのユーザ定義のデータ型クラスの使用[1]

DIIのクライアント側の処理を実装する[1]

DIIの使用時にWSDLに必要な情報[1]

DIIを使用したクライアントの開発[1]

DIIを使用して開発する場合[1]

DOCUMENT[1]

document/literal[1]

document/literal使用時のSOAPメッセージの送信[1]

document/literal使用時のWSDLの生成[1]

document/literal使用時のサービスデプロイ定義の生成[1]

document/literal使用時のソースコードの生成[1]

document/literalに対応したSOAPアプリケーションの開発[1]

DOCUMENT／LITERALを指定した場合のWSDLの生成例[1]

E

EJBHomeオブジェクトリファレンスの別名付与（ユーザ指定名前空間機能）を使用する場合の注意事項[1]

EJBからSOAPサービスを呼び出す場合の注意事項[1]

EJB呼び出し環境を設定する[1]

EJB利用時の注意事項[1]

EJBをSOAPサービスのエンドポイントとして利用する場合の注意事項[1]

EJBを利用したSOAPアプリケーション[1]

EJBを利用したSOAPアプリケーションの移行[1]

ENCODED[1]

ENCODED指定時のSOAPメッセージに関する注意[1]

equals[1]

extension要素を使用した場合のメッセージ形式[1]

F

FAQ[1]

finalizeClient[1]

G

getFaultActor[1]

getFaultCode[1]

getFaultDetails[1]

getFaultString[1]

getInstance[1]、[2]

getLocalPart[1]

getNamespaceURI[1]

getProperty[1]

getterの作成規則[1]

getterのマッピング規則（DII）[1]

GETプロトコルを使用したWSDLファイルの取得に関する注意[1]

H

hashCode[1]

HolderクラスによるINOUTパラメタの格納[1]

Holderクラスの生成例[1]

HTTPステータスコード[1]

HTTPセッションに関するオプション[1]

HTTPセッションの維持（クライアント定義ファイル）[1]

HTTPセッションの維持（サーバ定義ファイル）[1]

HTTPバインディング[1]

I

initializeClient[1]

invalidate[1]

J

J2EEサーバ用オプション定義ファイルの定義[1]

Java2WSDDコマンド（サービスデプロイ定義の生成）[1]

Java2WSDLコマンド（WSDLの生成）[1]

Javaインタフェースでの指定個所と添付ファイルで指定できるJava型の対応（RPC）[1]

JavaインタフェースとWSDLのマッピング[1]

JavaインタフェースとWSDLのマッピング例（RPC）[1]

Javaインタフェースのメソッドのパラメタ名[1]

Javaインタフェースを作成する〔RPC新規〕[1]

Javaインタフェースを作成する〔添付ファイル〕[1]

JavaクラスからWSDLを生成する場合のデータ型の関係[1]

Javaソース生成時の出力先ディレクトリ（DII）[1]

Javaソースファイルおよびクラスファイルの出力ディレクトリ（クライアント定義ファイル）[1]

Javaソースファイルおよびクラスファイルの出力ディレクトリ（サーバ定義ファイル）[1]

Javaの基本データ型のサポート範囲[1]

Javaの予約語を定義した場合[1]

Java例外からSOAP Faultへのマッピング[1]

Java例外からWSDLへのマッピング[1]

Java例外の種類[1]

JAXR 1.0との対応[1]

JAXR APIの一覧[1]

JAXRPCExceptionクラス（JAX-RPCに関する例外）[1]

JAXRトレース[1]

JAXRのパッケージ[1]

JNDI名前空間の指定[1]

L

LITERAL[1]

LITERAL指定時のSOAPメッセージに関する注意[1]

M

Managementクラス[1]

Managementクラス（クライアントの開始，終了）[1]

Managementクラスの使用に関する注意事項[1]

MimeHeaderオブジェクトで指定できる文字コードに関する注意[1]

MIMEヘッダの扱い（メッセージング）[1]

N

nillable属性に"false"を指定した場合の動作[1]

nonwrapped形式のWSDL[1]

O

onMessage[1]

P

publisherAssertion[1]

R

RemoteException[1]

ReqResListenerインタフェース（SAAJを利用したSOAPアプリケーションの実装）[1]

RPC[1]

RPC／ENCODEDを指定した場合のWSDLの生成例[1]

RPC／LITERALを指定した場合のWSDLの生成例[1]

RPC形態のSOAPアプリケーション[1]

RPC形態のSOAPアプリケーション開発の流れ[1]

RPC形態のSOAPアプリケーションの移行[1]

RPC形態のSOAPアプリケーションの開発例[1]

RPC形態の添付ファイルの使用[1]

RPC構造[1]

RuntimeException[1]

S

SAAJ 1.2との対応[1]

ServiceExceptionクラス（サービスに関する例外）[1]

ServiceFactoryクラス（サービスのファクトリクラス）[1]

Serviceインタフェース（サービスインタフェース）[1]

setProperty[1]

setPropertyメソッドで指定するプロパティ値に関する注意[1]

setPropertyメソッドで指定するプロパティのデフォルト値[1]

setterの作成規則[1]

setterのマッピング規則（DII）[1]

soap:binding要素[1]

soap:body要素[1]

soap:fault要素[1]

soap:operation要素[1]

SOAP 1.1との対応[1]

SOAPAction値の扱い（サーバ定義ファイル）[1]

SOAPAction値の扱いに関するオプション[1]

soapencoding型のサポート範囲[1]

soapencoding型のサポート範囲（DII使用時）[1]

SOAP Fault[1]

SOAPFaultException[1]

SOAP FaultからJava例外へのマッピング[1]

SOAP Faultに関する注意事項[1]

SOAPアプリケーション運用時の注意事項[1]

SOAPアプリケーション開発支援機能およびSOAP通信基盤の設定[1]

SOAPアプリケーション開発支援機能の特長[1]

SOAPアプリケーションの移行[1]

SOAPアプリケーションの開始と停止[1]

SOAPアプリケーションの概要[1]

SOAPアプリケーションのサービス名に関する注意[1]、[2]

SOAPアプリケーションの動作定義ファイルの設定[1]

SOAPアプリケーションを支える技術[1]

SOAPアプリケーションを設計する〔EJB〕[1]

SOAPアプリケーションを設計する〔RPC既存〕[1]

SOAPアプリケーションを設計する〔RPC新規〕[1]

SOAPアプリケーションを設計する〔SAAJ〕[1]

SOAPアプリケーションを設計する〔添付ファイル〕[1]

SOAPエンコーディング[1]

SOAPクライアントからSSLを使用してSOAPサービスに接続するにはどのようにすればよいですか？[1]

SOAPサービス[1]

SOAPサービスでメッセージを処理できません。どのように対処すればよいですか？[1]

SOAPサービスの表示[1]

SOAPサービスを呼び出す時にユーザ認証が必要な場合，どのようにユーザIDやパスワードを設定すればよいですか？[1]

SOAP通信基盤が返すHTTPステータスコード[1]

SOAPトレース[1]

SOAPの概要[1]

SOAP符号化規則[1]

SOAPヘッダの名前修飾チェックオプション（クライアント定義ファイル）[1]

SOAPヘッダの名前修飾チェックオプション（サーバ定義ファイル）[1]

SOAPヘッダの名前修飾に関するオプション[1]

SOAPメッセージ[1]

SOAPメッセージがサーバに届きません。原因として何が考えられますか？[1]

SOAPメッセージで要素の省略を含んだ配列を使用するにはどのようにしたらよいですか？[1]

SOAPメッセージのコードに関するオプション[1]

T

tModel[1]

toString[1]

toStringメソッドの使用に関する注意事項[1]

U

UDDIインタフェースおよびクラス[1]

UDDIクライアント開発，実行時の注意事項[1]

UDDIクライアント実行時の環境設定[1]

UDDIクライアントの開発手順[1]

UDDIクライアントライブラリ[1]

UDDIのAPI[1]

UDDIの概要[1]

UDDIのデータ構造[1]

UDDIレジストリ[1]

W

Webサービスの概要[1]

wrapped形式のWSDL[1]

wrapped形式の要素展開規則[1]

wsdl:fault要素[1]

wsdl:import要素[1]

wsdl:import要素の構文[1]

wsdl:import要素の書式[1]

wsdl:import要素の定義例[1]

wsdl:operation要素[1]

wsdl:part要素[1]

wsdl:service要素[1]

wsdl:types要素[1]

WSDL 1.1仕様のサポート範囲[1]

WSDL 1.1との対応[1]

WSDL2Javaコマンド（ソースコードの生成）[1]

WSDL解析およびJavaソース生成のタイムアウト値（クライアント定義ファイル）[1]

WSDL解析およびJavaソース生成のタイムアウト値（サーバ定義ファイル）[1]

WSDL解析とJavaソース生成のタイムアウト[1]

WSDLからJava例外へのマッピング[1]

WSDLからソースコードを生成する場合のデータ型の関係[1]

WSDL検証機能[1]、[2]

WSDL定義で使用できる文字[1]

WSDL定義での記号の扱い[1]

WSDL定義とHolderクラスの対応[1]

WSDL定義とソースコードのデータ型の関係[1]

WSDLとJavaソースコードのマッピング[1]

WSDLとソースコードのマッピング例（RPC）[1]

WSDLとユーザ定義のデータ型クラスのマッピング規則（DII）[1]

WSDLとユーザ定義のデータ型クラスのマッピング例（DII）[1]

WSDLのインポート[1]

WSDLの概要[1]

WSDLのキャッシュ[1]

WSDLの構文[1]

WSDLのスタイル[1]

WSDLのスタイルの指定[1]

WSDLファイル名に使用できない文字[1]

WSDLを生成する〔EJB〕[1]

WSDLを生成する〔RPC既存〕[1]

WSDLを生成する〔RPC新規〕[1]

WSDLを生成する〔添付ファイル〕[1]

WS-I Attachments Profile - Version 1.0との対応[1]

WS-I Basic Profile について[1]

WS-I Basic Profileに適合したシステムを構築するための注意事項[1]

X

XML Processor[1]

XML Processorを使用した受信メッセージの解析[1]

XML Processorを使用した送信メッセージの生成[1]

XML SchemaのURI[1]

XML Schemaのインクルード[1]

XML Schemaのインポート[1]

XML Schemaのサポート範囲[1]

XML Schemaのデータ型のサポート範囲[1]

XML Schemaのデータ型のサポート範囲（DII使用時）[1]

XMLデータ型のサポート範囲（DII使用時）[1]

XMLの技術を利用しているため，拡張性の高いシステムが開発できる[1]

xsd:import要素の構文[1]

xsd:import要素の書式[1]

xsd:import要素の定義例[1]

xsd:import要素の有効範囲[1]

xsd:include要素の構文[1]

xsd:include要素の書式[1]

xsd:include要素の定義例[1]

xsd:include要素の有効範囲[1]

xsd:schema要素[1]

あ

アーカイブ（WARファイル）の作成[1]

アーカイブ（WARファイル）を作成する〔EJB〕[1]

アーカイブ（WARファイル）を作成する〔RPC既存〕[1]

アーカイブ（WARファイル）を作成する〔RPC新規〕[1]

アーカイブ（WARファイル）を作成する〔SAAJ〕[1]

アーカイブ（WARファイル）を作成する〔添付ファイル〕[1]

アクセサ[1]

アプリケーションログ[1]

アプリケーションログが出力されません。どのように対処すればよいですか？[1]

アプリケーションログ出力の重要度[1]

アプリケーションログ出力の重要度（共通定義ファイル）[1]

アプリケーションログに出力される内容[1]、[2]

アプリケーションログのサイズ（共通定義ファイル）[1]

アプリケーションログの面数（共通定義ファイル）[1]

い

異常発生時のアプリケーションログ出力（共通定義ファイル）[1]

異常発生時のアプリケーションログの出力[1]

インタフェースおよびクラスの一覧[1]

か

開発支援コマンドに関する注意事項[1]

開発支援コマンドを使用して効率良く開発できる[1]

拡張要素[1]

各メソッドで発生する例外[1]

き

既存のEJBを利用して開発する場合[1]

既存のJavaクラスを利用して開発した場合の移行手順（RPC）[1]

既存のJavaクラスを利用して開発する場合[1]

既存のJavaプログラムを有効活用できる[1]

共通定義ファイル[1]

共通定義ファイルの設定[1]

共通要素[1]

く

クッキーについて[1]、[2]

クッキーの有効期限[1]、[2]

クライアントからSOAPメッセージが正しく出力されません。どのように対処すればよいですか？[1]

クライアント側の処理の実装例〔RPC新規〕[1]

クライアント側の処理の実装例〔添付ファイル〕[1]

クライアント側の処理を実装する〔EJB〕[1]

クライアント側の処理を実装する〔RPC既存〕[1]

クライアント側の処理を実装する〔RPC新規〕[1]

クライアント側の処理を実装する〔SAAJ〕[1]

クライアント側の処理を実装する〔添付ファイル〕[1]

クライアント定義ファイル[1]

クライアント定義ファイルの設定[1]

クライアント定義ファイルの例[1]

クライアントで返信用メッセージを処理できません。どのように対処すればよいですか？[1]

クライアントの開発[1]

クライアントのソケットの書き込みタイムアウト値（クライアント定義ファイル）[1]

クライアントのソケットの接続タイムアウト値（クライアント定義ファイル）[1]

クライアントのソケットの読み込みタイムアウト値（クライアント定義ファイル）[1]

クライアントへ返信用SOAPメッセージが届いていません。どのように対処すればよいですか？[1]

クライアントログ[1]

クラスパスに追加するJARファイル[1]

こ

コネクション[1]

コネクションが維持された状態でのHTTP Serverの終了方法[1]

コネクションのタイムアウト（共通定義ファイル）[1]

コネクションの利用回数（共通定義ファイル）[1]

コネクションプーリング[1]

コネクションプーリングの設定（共通定義ファイル）[1]

コマンドラインの実行[1]

コマンドライン利用時の設定[1]

コマンドライン利用時の注意事項[1]

さ

サーバから返信用SOAPメッセージが正しく出力されていません。原因として何が考えられますか？[1]

サーバ側の処理を実装する〔RPC新規〕[1]

サーバ側の処理を実装する〔SAAJ〕[1]

サーバ側の処理を実装する〔添付ファイル〕[1]

サーバ兼クライアントのソケットの書き込みタイムアウト値（サーバ定義ファイル）[1]

サーバ兼クライアントのソケットの接続タイムアウト値（サーバ定義ファイル）[1]

サーバ兼クライアントのソケットの読み込みタイムアウト値（サーバ定義ファイル）[1]

サーバ定義ファイル[1]

サーバ定義ファイルの設定[1]

サーバ定義ファイルの例[1]

サーバログ[1]

サービスクラス[1]

サービスデプロイ定義を生成する〔EJB〕[1]

サービスデプロイ定義を生成する〔RPC既存〕[1]

サービス呼び出し処理の実装[1]

サービスロケーションの指定[1]

最大コネクション数（共通定義ファイル）[1]

し

識別子について[1]

実行時オプションの設定項目[1]

受信できるSOAPEnvelopeの最大バイト数（クライアント定義ファイル）[1]

受信できるSOAPEnvelopeの最大バイト数（サーバ定義ファイル）[1]

受信できる各添付データの最大バイト数（クライアント定義ファイル）[1]

受信できる各添付データの最大バイト数（サーバ定義ファイル）[1]

受信できる添付データの最大個数（クライアント定義ファイル）[1]

受信できる添付データの最大個数（サーバ定義ファイル）[1]

受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合の注意[1]

照会API[1]

障害対策の流れ[1]

障害発生時に取得する資料[1]

新規開発した場合の移行手順（RPC）[1]

新規に開発する場合[1]

す

スケルトンおよびサービスデプロイ定義を生成する〔RPC新規〕[1]

スケルトンおよびサービスデプロイ定義を生成する〔添付ファイル〕[1]

スタブの内容[1]

スタブを生成する〔EJB〕[1]

スタブを生成する〔RPC既存〕[1]

スタブを生成する〔RPC新規〕[1]

スタブを生成する〔添付ファイル〕[1]

せ

生成されたWSDLの例〔RPC新規〕[1]

生成されたWSDLの例〔添付ファイル〕[1]

性能解析トレース[1]

性能解析トレース出力オプション（クライアント定義ファイル）[1]

性能解析トレース出力オプション（サーバ定義ファイル）[1]

性能解析トレース使用時の注意事項[1]

性能解析トレースのトレース取得ポイント[1]

性能解析トレースの利用方法[1]

性能解析トレースファイルをフィルタリングした例[1]

接続プロパティの設定[1]

そ

相互接続性の高いシステムを開発できる[1]

送受信データのサイズチェックオプション[1]

送信できるSOAPEnvelopeの最大バイト数（クライアント定義ファイル）[1]

送信できるSOAPEnvelopeの最大バイト数（サーバ定義ファイル）[1]

送信できる各添付データの最大バイト数（クライアント定義ファイル）[1]

送信できる各添付データの最大バイト数（サーバ定義ファイル）[1]

送信できる添付データの最大個数（クライアント定義ファイル）[1]

送信できる添付データの最大個数（サーバ定義ファイル）[1]

送信メッセージのHTTPヘッダについて[1]

ソケットタイムアウト値オプション[1]

た

退避ファイル[1]

退避ファイルの格納ディレクトリ名[1]

退避ファイルを格納するディレクトリ名[1]

他社クライアントおよび他社サービスと通信する場合のデータ型に関する注意[1]

他社製品と接続するときにHTTPヘッダ中のSOAPAction値の設定が必要なケースがあります。Application ServerのSOAPクライアントでSOAPAction値は設定できますか？[1]

他社製品と接続する場合の多重配列送受信形式の確認[1]

多重参照（クライアント定義ファイル）[1]

多重参照（サーバ定義ファイル）[1]

多重参照オプション[1]

て

データ型定義（クライアント定義ファイル）[1]

データ型定義（サーバ定義ファイル）[1]

データ型定義オプション[1]

データ型についての注意事項[1]

添付できるファイル（RPC）[1]

添付できるファイル（メッセージング）[1]

添付ファイル使用時のWSDLの生成[1]

添付ファイル使用時のソースコードの生成[1]

添付ファイル付きSOAPメッセージの実装（メッセージング）[1]

添付ファイルに使用できるJava型（RPC）[1]

添付ファイルの拡張子とMIMEタイプの対応（RPC）[1]

添付ファイルの拡張子とMIMEタイプの対応（メッセージング）[1]

添付ファイルの個数の上限値（RPC）[1]

添付ファイルの個数の上限値（メッセージング）[1]

添付ファイルのサイズの上限値（RPC）[1]

添付ファイルのサイズの上限値（メッセージング）[1]

添付ファイルの文字コードと改行コード（メッセージング）[1]

添付ファイルを使用して開発する場合[1]

と

同一データ型の変数名の定義[1]

動作定義ファイル設定時の注意事項[1]

動作定義ファイルの記述規則[1]

トレースファイル[1]

トレースファイル，アプリケーションログのプレフィクス（クライアント定義ファイル）[1]

トレースファイル，アプリケーションログのプレフィクス（サーバ定義ファイル）[1]

トレースファイルおよびアプリケーションログの出力[1]

トレースファイル出力の重要度[1]

トレースファイル出力の重要度（共通定義ファイル）[1]

トレースファイルに出力される内容[1]

トレースファイルのサイズ（共通定義ファイル）[1]

トレースファイルの出力先[1]

トレースファイルの見積もり方法[1]

トレースファイルの面数（共通定義ファイル）[1]

トレースプロパティの設定[1]

な

名前空間に属さない要素を追加する場合の注意[1]

は

派生データ型の定義[1]

発行API[1]

ひ

標準仕様との対応[1]

ふ

ファイルを削除する場合の例[1]

フィルタリングに使用するイベントIDが示すトレース取得ポイント[1]

複数個のAttachmentPartオブジェクトを追加する場合の注意[1]

プロキシオプション[1]

プロキシサーバの認証ユーザID（クライアント定義ファイル）[1]

プロキシサーバの認証ユーザID（サーバ定義ファイル）[1]

プロキシサーバの認証ユーザIDに対応するパスワード（クライアント定義ファイル）[1]

プロキシサーバの認証ユーザIDに対応するパスワード（サーバ定義ファイル）[1]

プロキシサーバのポート番号（クライアント定義ファイル）[1]

プロキシサーバのポート番号（サーバ定義ファイル）[1]

プロキシサーバのホスト名またはIPアドレス（クライアント定義ファイル）[1]

プロキシサーバのホスト名またはIPアドレス（サーバ定義ファイル）[1]

プロキシサーバを越えて外部のSOAPサービスを利用できますか？[1]

プロキシサーバを使用しないホスト名またはIPアドレス群（クライアント定義ファイル）[1]

プロキシサーバを使用しないホスト名またはIPアドレス群（サーバ定義ファイル）[1]

プロパティ[1]

ほ

ホスト名の検証（クライアント定義ファイル）[1]

ホスト名の検証（サーバ定義ファイル）[1]

ま

マニュアルの説明，プレフィクスと名前空間URI[1]

マルチスレッドでの動作について[1]

み

未宣言パラメタの無視[1]、[2]

未宣言要素の無視[1]、[2]

め

メッセージレベルでセキュアなシステムが開発できる[1]

メッセージング形態での添付ファイルの使用[1]

メッセージング形態のSOAPアプリケーション[1]

メッセージング形態のSOAPアプリケーション開発の流れ[1]

メッセージング形態のSOAPアプリケーションの開発例[1]

も

文字参照形式オプション（クライアント定義ファイル）[1]

文字参照形式オプション（サーバ定義ファイル）[1]

問題発生個所の切り分け[1]

ゆ

ユーザ定義のデータ型クラスのClassオブジェクトを取得する方法[1]

ユーザ定義のデータ型クラスの作成規則[1]

ユーザ定義のデータ型クラスの使用の流れ（DII）[1]

ユーザ定義例外[1]

ユーザ定義例外の定義[1]

よ

用語解説[1]

ら

ラウンドロビンポリシーによるCORBAネーミングサービスの検索機能を使用する場合の注意事項[1]

り

リテラルエンコーディング[1]

リテラルエンコーディングと多重参照オプション（do_multirefs）に関する注意[1]

リモートインタフェース[1]

リモートインタフェースおよびユーザ定義のデータ型クラスでの配列の使用[1]

リモートインタフェースで使用できる型とクラス[1]

リモートインタフェースの作成規則[1]

リモートインタフェースの定義[1]

れ

例外処理の実装[1]