SAAJを使用して,SOAPアプリケーションを開発する場合の注意事項について説明します。
RPC形態,メッセージング形態,およびEJB形態のSOAPサービスで,同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると,予期しない動作をするおそれがあります。
複数個のAttachmentPartオブジェクトを追加する場合,AttachmentPartオブジェクトを追加する個数分,生成するようにしてください。同一のAttachmentPartオブジェクトをSOAPMessage#addAttachmentPart(AttachmentPart AttachmentPart)メソッドの引数として指定し,処理を複数回実行しても,SOAPメッセージ上には一つしか存在しない場合があります。
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例外は発生しません。
SOAPMessage#setProperty(java.lang.String property,java.lang.Object value)メソッドで指定できるCHARACTER_SET_ENCODING,およびWRITE_XML_DECLARATIONのvalue値には,Stringオブジェクトを指定してください。Stringオブジェクト以外を設定した場合,java.lang.ClassCastException例外が発生することがあります。
MimeHeaderオブジェクト生成時に,引数で,name,およびvalueに非US-ASCII文字列を指定しないでください。MimeHeaderオブジェクト生成時の引数で,name,およびvalueに非US-ASCII文字列を指定しても,java.lang.IllegalArgumentException例外が発生しない場合があります。
各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 |
SOAPPart#setContent(javax.xml.transform.Source source)メソッドの引数には,正しいSOAPメッセージを表すソースオブジェクトを指定してください。正しいSOAPメッセージを表すソースオブジェクトを指定しなかった場合,不正なSOAPメッセージを送信してしまう場合があります。
AttachmentPartオブジェクトのContent-Typeヘッダがtext/plainの場合,送受信できる添付ファイルのサイズの上限は1MBです。1MBより大きいサイズの添付ファイルを受信してAttachmentPartのContentを取得すると,1MBを超えた部分が切り捨てられたStringオブジェクトが返されます。
Webサーバから受け取ったクッキーは,SOAPConnectionオブジェクトが保持します。クッキーを利用する場合,メッセージングサービスを呼び出すたびに,SOAPConnectionオブジェクトを破棄することなく,継続して使用してください。
SAAJの各メソッドは,スレッドセーフではありません。SAAJのオブジェクトをマルチスレッドで共有しないでください。共有した場合には,動作を保障できません。
受信電文のSOAPヘッダおよびSOAPボディの子孫ノードにテキストノードが存在する場合,兄弟ノードのすべてのテキストノードを連結し,そのテキストノードを同じ階層の最後に追加します。
受信電文のBody要素に対するjavax.xml.soap.SOAPElement#getChildElementsおよびorg.w3c.dom.Node#getChildNodesの結果を示します。
<soapenv:Body><a/>△△foo△△<b/>△△bar△△</soapenv:Body>
Iteratorの最初の要素 : Elementノード <a/>
Iteratorの二番目の要素 : Elementノード <b/>
Iteratorの三番目の要素 : Textノード △△foo△△△△bar△△
NodeListの最初のノード : Elementノード <a/>
NodeListの二番目のノード : Elementノード <b/>
NodeListの三番目のノード : Textノード △△foo△△△△bar△△
注 △は半角スペースを表します。
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" ) );