4. Webサービス

Webサービスを利用する際の注意制限事項について説明します。

 
4.1. 相互接続性に関する制限事項

Webサービスの相互接続時に発生しうる問題・制限事項について説明します。

 
SOAP通信高速化設定を有効にした場合の制限事項

 

 
4.2. セキュリティに関する制限事項

(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を利用する場合、以下の制限事項があります。

  1. JAX-WSでは、encoded形式のSOAPメッセージをサポートしていません。literal形式のSOAPメッセージを利用してください。


  2.   例) 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 {
          :
        }

  3. javax.xml.ws.Dispatchを利用して動的呼び出しを行う場合に、JAXBContextを利用したMESSAGEモードでの呼び出しはサポートしていません。JAXBContextを利用する場合は、PAYLOADモードを指定してください。


  4.   例) プログラムで指定する場合

        Service service = ・・・;
        QName qname = ・・・;
        JAXBContext context = ・・・;
        Dispatch dispatch = service.createDispatch(qname, context, Service.Mode.PAYLOAD);

  5. javax.xml.ws.Dispatchを利用して非同期通信を行う場合に、ハンドラのhandleMessage()およびhandleFault()の戻り値でfalseを返却する場合の動作はサポートしていません。必ずtrueを返却するようにハンドラを実装してください。


  6.   例) ハンドラの実装例
      
        public class SomeHandler implements SOAPHandler {

          public boolean handleMessage(SOAPMessageContext context) {
            :
            :
            return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
          }

          public boolean handleFault(SOAPMessageContext context) {
            :
            :
            return true; // 非同期通信で呼ばれるハンドラは必ずtrueを返すようにします
          }
        }

  7. rpc/literalもしくは、document/literalのbare型でのjava.util.Collectionクラスの送受信はサポートしていません。java.util.Collectionクラスを送受信する場合は、document/literalのwrapped型を利用してください。


  8.   例) 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) {
            :
            :
          }
        }

  9. 配備記述子に記述するエンドポイントURLでは、暗黙URL(URLに"*."を利用している)はサポートしていません。


  10. メソッドのパラメータや戻り値にインタフェースを指定することはできません。メソッドのパラメータや戻り値には、実装クラスを指定するようにしてください。
 
4.3.2. JAX-WSを利用する場合の注意事項

JAX-WSを利用する場合の注意事項を以下に示します。

  1. JAX-WSはJAX-RPCの後継仕様ですが、Java-XMLバインディングにJAXBを利用しているため、一部互換性がありません。クライアントアプリケーションを作成する際には以下の注意が必要です。


    1. サービスエンドポイントの実装クラスのクラス名やメソッド名に"_"がある場合、wsimportコマンドでクライアント側のスタブを生成すると、"_"が削除された名前でスタブが生成されます。また、"_"の次の文字が小文字の場合は、大文字に変換されて生成されます。

      "_"をそのまま利用したい場合には、JAXBのglobalBindingsの指定で、underscoreBinding="asCharInWord"を指定してください。

    2. サービスエンドポイントの実装クラスのパッケージ名に大文字がある場合、wsimportコマンドでクライアント側のスタブを生成すると、パッケージ名の大文字が小文字に変換されて生成されます。

      パッケージ名で大文字をそのまま利用したい場合は、wsimportの-pオプションでパッケージ名を指定してください。

    3. サービスエンドポイントの実装クラスで、実装クラスとは異なるパッケージ名をもつユーザ定義クラスを利用している場合に、wsimportコマンドでクライアント側のスタブを生成すると、ユーザ定義クラスのパッケージ名がサービスエンドポイントの実装クラスのパッケージ名に変換されて生成されます。

      ユーザ定義クラスが修正できる場合は、ユーザ定義クラスで@XmlTypeアノテーションを記述し、ネームスペースを設定することでネームスペースのパッケージ名で出力されるようになります。ユーザ定義クラスが修正できない場合は、対応できません。

    4. ユーザ定義クラスのメンバとして配列を定義している場合に、wsimportコマンドでクライアント側のスタブを生成すると、配列がListとして出力されます。

      配列として扱いたい場合は、JAXBのglobalBindingsの指定でcollectionType="indexed"を指定してください。

    5. 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"/>

4.4. WS-R、WS-RMの注意事項

(1) WebOTX V7で作成したアプリケーションを動作させる場合の注意

    WebOTX V7で提供していた高信頼メッセージング機能とは設定ファイルに互換性がありません。V7の高信頼メッセージング機能を利用しているWebサービスを使用する場合、アプリケーションに含む配備記述子等の設定ファイルを修正して下さい。設定ファイルの作成方法はアプリケーション開発ガイドを参照してください。