Webサービスを利用する際の注意制限事項について説明します。
Webサービスの相互接続時に発生しうる問題・制限事項について説明します。
SOAP通信高速化設定を有効にした場合の制限事項
- UTF-16でエンコーディングされたSOAPメッセージを扱うことができなくなります。UTF-16でエンコーディングされたSOAPメッセージを使用する場合は、SOAP通信高速化設定を無効にしてください。
- SOAPメッセージの要素の内容のテキストとして <('<') , >('>') , &('&') を含めることはできません。要素の内容のテキストとして <('<') , >('>') , &('&') を使用する場合は、SOAP通信高速化設定を無効にしてください。
- SOAPメッセージの要素の内容のテキストとして A 等の文字参照の表記を含めることはできません。要素の内容のテキストとして文字参照の表記を使用する場合は、SOAP通信高速化設定を無効にしてください。
(1) SSLに関する制限事項
Webコンテナの内蔵Webサーバ使用時、双方向認証ができません。
(2) WS-Securityに関する制限事項
SAMLの認証機能を使用する場合、SOAP通信をする前にSAML Assertionを事前に取得しておき、SAMLAssertionCallbackHandlerにてそのSAML Assertionを組み込んでください。
SAML Assertionの取得方法は、WebSAM SECUREMASTER / ACPIのマニュアルをご参照ください。
| 4.3. JAX-WSを利用する場合の注意制限事項 |
| 4.3.1. JAX-WSを利用する場合の制限事項 |
JAX-WSを利用する場合、以下の制限事項があります。
- JAX-WSでは、encoded形式のSOAPメッセージをサポートしていません。literal形式のSOAPメッセージを利用してください。
例) WSDLで指定する場合
<operation name="someOperation">
<soap:operation soapAction="" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
<fault name="someOperationFault">
<soap:fault name="someOperationFault" use="literal" />
</fault>
</operation>
例) プログラムで指定する場合
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@SOAPBinding(use=SOAPBinding.Use.LITERAL)
@WebService
public class ServerImpl {
:
}
- javax.xml.ws.Dispatchを利用して動的呼び出しを行う場合に、JAXBContextを利用したMESSAGEモードでの呼び出しはサポートしていません。JAXBContextを利用する場合は、PAYLOADモードを指定してください。
例) プログラムで指定する場合
Service service = ・・・;
QName qname = ・・・;
JAXBContext context = ・・・;
Dispatch dispatch = service.createDispatch(qname, context, Service.Mode.PAYLOAD);
- javax.xml.ws.Dispatchを利用して非同期通信を行う場合に、ハンドラのhandleMessage()およびhandleFault()の戻り値でfalseを返却する場合の動作はサポートしていません。必ずtrueを返却するようにハンドラを実装してください。
例) ハンドラの実装例
public class SomeHandler implements SOAPHandler {
public boolean handleMessage(SOAPMessageContext context) {
:
:
return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
}
public boolean handleFault(SOAPMessageContext context) {
:
:
return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
}
}
- rpc/literalもしくは、document/literalのbare型でのjava.util.Collectionクラスの送受信はサポートしていません。java.util.Collectionクラスを送受信する場合は、document/literalのwrapped型を利用してください。
例) WSDLで指定する場合
<xs:complexType name="someOperation">
<xs:sequence>
<xs:element name="arg0" type="xs:int"/>
<xs:element name="arg1" type="xs:int"/> // bareだと同じパラメータは1回しか現れない
</xs:sequence>
</xs:complexType>
<message name="someOperation">
<part name="parameters" element="tns:someOperation"/> // bareだとここでパラメータを複数指定する
</message>
<operation name="someOperation">
<input message="tns:someOperation"/>
<output message="tns:someOperationResponse"/>
</operation>
例) プログラムで指定する場合、デフォルトでdocument/literalのwrapped型が
使用されます。javax.jws.soap.SOAPBindingアノテーションで指定するため、
プログラム中でjavax.jws.soap.SOAPBindingアノテーションを指定している
場合は注意が必要です。
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
@WebService
public class ServerImpl {
public int someOperation(int arg0, int arg1) {
:
:
}
}
- 配備記述子に記述するエンドポイントURLでは、暗黙URL(URLに"*."を利用している)はサポートしていません。
- メソッドのパラメータや戻り値にインタフェースを指定することはできません。メソッドのパラメータや戻り値には、実装クラスを指定するようにしてください。
| 4.3.2. JAX-WSを利用する場合の注意事項 |
JAX-WSを利用する場合の注意事項を以下に示します。
- JAX-WSはJAX-RPCの後継仕様ですが、Java-XMLバインディングにJAXBを利用しているため、一部互換性がありません。クライアントアプリケーションを作成する際には以下の注意が必要です。
-
サービスエンドポイントの実装クラスのクラス名やメソッド名に"_"がある場合、wsimportコマンドでクライアント側のスタブを生成すると、"_"が削除された名前でスタブが生成されます。また、"_"の次の文字が小文字の場合は、大文字に変換されて生成されます。
"_"をそのまま利用したい場合には、JAXBのglobalBindingsの指定で、underscoreBinding="asCharInWord"を指定してください。
- サービスエンドポイントの実装クラスのパッケージ名に大文字がある場合、wsimportコマンドでクライアント側のスタブを生成すると、パッケージ名の大文字が小文字に変換されて生成されます。
パッケージ名で大文字をそのまま利用したい場合は、wsimportの-pオプションでパッケージ名を指定してください。
- サービスエンドポイントの実装クラスで、実装クラスとは異なるパッケージ名をもつユーザ定義クラスを利用している場合に、wsimportコマンドでクライアント側のスタブを生成すると、ユーザ定義クラスのパッケージ名がサービスエンドポイントの実装クラスのパッケージ名に変換されて生成されます。
ユーザ定義クラスが修正できる場合は、ユーザ定義クラスで@XmlTypeアノテーションを記述し、ネームスペースを設定することでネームスペースのパッケージ名で出力されるようになります。ユーザ定義クラスが修正できない場合は、対応できません。
- ユーザ定義クラスのメンバとして配列を定義している場合に、wsimportコマンドでクライアント側のスタブを生成すると、配列がListとして出力されます。
配列として扱いたい場合は、JAXBのglobalBindingsの指定でcollectionType="indexed"を指定してください。
- JAX-RPCではCalendarクラスの実装としてGregorianCalendarクラスを使用していましたが、JAX-WSではデフォルトとしてXMLGregorianCalendarが使用されます。
Calendarクラスの実装としてGregorianCalendarを使用したい場合は、JAXBのglobalBindingsのjavaTypeで以下の指定をしてください。
<javaType name="java.util.Calendar"
xmlType="xs:dateTime"
parseMethod="javax.xml.bind.DatatypeConverter.parseDate"
printMethod="javax.xml.bind.DatatypeConverter.printDate"/>
(1) WebOTX V7で作成したアプリケーションを動作させる場合の注意
WebOTX V7で提供していた高信頼メッセージング機能とは設定ファイルに互換性がありません。V7の高信頼メッセージング機能を利用しているWebサービスを使用する場合、アプリケーションに含む配備記述子等の設定ファイルを修正して下さい。設定ファイルの作成方法はアプリケーション開発ガイドを参照してください。