5.4 SAAJを使用したSOAPアプリケーション開発時の注意事項

SAAJを使用して,SOAPアプリケーションを開発する場合の注意事項について説明します。

<この節の構成>
(1) SOAPアプリケーションのサービス名に関する注意
(2) 複数個のAttachmentPartオブジェクトを追加する場合の注意
(3) setPropertyメソッドで指定するプロパティのデフォルト値
(4) setPropertyメソッドで指定するプロパティ値に関する注意
(5) MimeHeaderオブジェクトで指定できる文字コードに関する注意
(6) 各メソッドで発生する例外
(7) setContentメソッドの引数に関する注意
(8) AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合の上限サイズ
(9) クッキーについて
(10) マルチスレッドでの動作について
(11) 受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合の注意
(12) 名前空間に属さない要素を追加する場合の注意

(1) SOAPアプリケーションのサービス名に関する注意

RPC形態,メッセージング形態,およびEJB形態のSOAPサービスで,同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると,予期しない動作をするおそれがあります。

(2) 複数個のAttachmentPartオブジェクトを追加する場合の注意

複数個のAttachmentPartオブジェクトを追加する場合,AttachmentPartオブジェクトを追加する個数分,生成するようにしてください。同一のAttachmentPartオブジェクトをSOAPMessage#addAttachmentPart(AttachmentPart AttachmentPart)メソッドの引数として指定し,処理を複数回実行しても,SOAPメッセージ上には一つしか存在しない場合があります。

(3) setPropertyメソッドで指定するプロパティのデフォルト値

SOAPMessage#setProperty(java.lang.String property,java.lang.Object value)メソッドで指定できるプロパティは次の二つだけです。

CHARACTER_SET_ENCODINGのデフォルト値は"utf-8",WRITE_XML_DECLARATIONのデフォルト値は"false"です。CHARACTER_SET_ENCODING,WRITE_XML_DECLARATION以外をプロパティとして指定しても,javax.xml.soap.SOAPException例外は発生しません。

(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) MimeHeaderオブジェクトで指定できる文字コードに関する注意

MimeHeaderオブジェクト生成時に,引数で,name,およびvalueに非US-ASCII文字列を指定しないでください。MimeHeaderオブジェクト生成時の引数で,name,およびvalueに非US-ASCII文字列を指定しても,java.lang.IllegalArgumentException例外が発生しない場合があります。

(6) 各メソッドで発生する例外

各APIに関して不正な引数を与えた場合にスローされる例外を次に示します。

表5-2 各APIに関して不正な引数を与えた場合にスローされる例外

SAAJ仕様書に記載の各メソッドのthrows:の内容各APIでスローされる例外
javax.xml.soap.SOAPExceptionjavax.xml.soap.SOAPException
java.lang.IllegalArgumentExceptionjava.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

(7) setContentメソッドの引数に関する注意

SOAPPart#setContent(javax.xml.transform.Source source)メソッドの引数には,正しいSOAPメッセージを表すソースオブジェクトを指定してください。正しいSOAPメッセージを表すソースオブジェクトを指定しなかった場合,不正なSOAPメッセージを送信してしまう場合があります。

(8) AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合の上限サイズ

AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合,送受信できる添付ファイルのサイズの上限は1MBです。1MBより大きいサイズの添付ファイルを受信してAttachmentPartのContentを取得すると,1MBを超えた部分が切り捨てられたStringオブジェクトが返されます。

(9) クッキーについて

Webサーバから受け取ったクッキーは,SOAPConnectionオブジェクトが保持します。クッキーを利用する場合,メッセージングサービスを呼び出すたびに,SOAPConnectionオブジェクトを破棄することなく,継続して使用してください。

(10) マルチスレッドでの動作について

SAAJの各メソッドは,スレッドセーフではありません。SAAJのオブジェクトをマルチスレッドで共有しないでください。共有した場合には,動作を保障できません。

(11) 受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合の注意

受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合,兄弟ノードのすべてのテキストノードを連結し,そのテキストノードを同じ階層の最後に追加します。

受信電文のBody要素に対するjavax.xml.soap.SOAPElement#getChildElementsおよびorg.w3c.dom.Node#getChildNodesの結果を示します。

注 △は半角スペースを表します。

(12) 名前空間に属さない要素を追加する場合の注意

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