4. Webサービス
Webサービスを利用する際の注意制限事項について説明します。
4.1. JAX-WSについて
4.1.1. 注意事項
-
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"/>
-
JAX-WSのDispatchを使用し、
WSDLのschemaの定義でメッセージの型に次のいずれかを指定した場合、
その型の上限値や下限値を超える値の指定が可能ですが受信側では問題を検出することはできません。
この場合、アプリケーションの引数や戻り値は、不正な値に変換されてしまいます。
そのため送信側で事前にチェックが必要です。
- xsd:int
- xsd:short
- xsd:byte
-
wsimportコマンドはWSDLへのアクセスを行う際に、
デフォルトでシステムのプロキシ設定を使用します。
システムのプロキシ設定の内容やネットワーク環境により、WSDLへのアクセスに失敗する場合があります。
この場合、wsimportコマンド実行時のシステムプロパティに以下の指定をしてください。
-Dcom.nec.webotx.webservice.tools.ws.Invoker.noSystemProxies=true
4.1.2. 制限事項
-
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 <SOAPMessageContext> {
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.2. JAX-RPCについて
4.2.1. 注意事項
配備時またはwscompileコマンド実行時の警告ログ・表示について
JAX-RPCのWebサービスを配備した場合、およびwscompileコマンドを実行してWSDLからJavaソースコードを生成した場合、自動生成されたJavaソースコードのJavaコンパイルに際してWebOTXのログ、またはコンソールに次の警告が出ることがあります。
注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
当該条件の場合、この警告について何ら対策を講じる必要はありません。この警告が出ていても、Javaコンパイル、wscompileコマンド、および配備処理は正常に動作しています。
4.2.2. 制限事項
SOAP通信高速化設定を有効にした場合の制限事項
- UTF-16でエンコーディングされたSOAPメッセージを扱うことができなくなります。UTF-16でエンコーディングされたSOAPメッセージを使用する場合は、SOAP通信高速化設定を無効にしてください。
- SOAPメッセージの要素の内容のテキストとして <('<') , >('>') , &('&') を含めることはできません。要素の内容のテキストとして <('<') , >('>') , &('&') を使用する場合は、SOAP通信高速化設定を無効にしてください。
- SOAPメッセージの要素の内容のテキストとして A 等の文字参照の表記を含めることはできません。要素の内容のテキストとして文字参照の表記を使用する場合は、SOAP通信高速化設定を無効にしてください。
UTF-16エンコーディングのSOAPメッセージのBOMについて
Byte Order Mark(BOM)を含まないUTF-16エンコーディングのSOAPメッセージはサポートしていません。BOMを含めたUTF-16エンコーディングのSOAPメッセージを利用してください。
4.3. セキュリティについて
4.3.1. WS-Securityに関する注意事項
SAMLアサーションを使用する場合の注意
SAMLの認証機能を使用する場合、SOAP通信をする前にSAMLアサーションを事前に取得しておき、SAMLAssertionCallbackHandlerにてそのSAMLアサーションを組み込んでください。SAMLアサーションの取得方法は、WebSAM
SECUREMASTER / ACPIのマニュアルをご参照ください。
4.4. 高信頼メッセージングついて
4.4.1. WS-R、WS-RMに関する注意事項
WebOTX V7で作成したアプリケーションを動作させる場合の注意
WebOTX
V7で提供していた高信頼メッセージング機能とは設定ファイルに互換性がありません。V7の高信頼メッセージング機能を利用しているWebサービスを使用する場合、アプリケーションに含む配備記述子等の設定ファイルを修正して下さい。設定ファイルの作成方法はアプリケーション開発ガイドを参照してください。
高信頼メッセージング機能で送受信可能なSOAPメッセージサイズに関する注意事項
高信頼メッセージング機能では、信頼性を確保するため送受信実行時のメモリ使用量、処理時間とも一般のSOAP通信より増大する傾向があります。これは実行環境に依存します。必ずご自身の作成したアプリケーションを用いて最大サイズのSOAPメッセージにて評価を行い、正常に送受信可能なことを確認してください。
高信頼メッセージング機能のSOAPメッセージ送信に関する注意事項
高信頼メッセージング機能のSOAPメッセージ送信は順序保障するときは同時に複数のスレッドからのご利用はできません。
4.4.2. WS-R、WS-RMに関する制限事項
高信頼メッセージング機能のSOAPメッセージ送信に関する制限事項
高信頼メッセージング機能のSOAPメッセージ送信は順序保障しない場合にも同時に複数のスレッドからのご利用はできません。
4.5. Java SE 7 対応
- Webサービスの以下の機能に関しては Java SE 7 で未サポートです。