4. Webサービス

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

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

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

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

 

4.2. Webサービス作成ウィザードにおける制限事項

WebOTX Developer の「Webサービス作成ウィザード」について、次のような問題が確認されているため、対処方法を示します。

(1)複数メソッドの同時選択に関する既知の問題

Webサービスの実装形式で「Webアプリケーション」を選択している時、ビジネスロジックのあるクラス内に同じメソッド名で引数の数や型が違うものが複数存在している場合、それらのいくつかを同時にWebサービス化することができません。
この問題を回避するためには、同時に選択しようとしている同名メソッドの属するパッケージ、クラスの名前を変更したコピーを作成するか、メソッド名を変更してください。

(2)Webサービスを含むEARファイル作成時の既知の問題

エンタープライズ・アプリケーション・プロジェクト(WTP)を作成するとき、EARに追加するJ2EEモジュール画面でWebサービスプロジェクトを選択せずに、そのまま終了してください。同様に、他の手順でもエンタープライズ・アプリケーション・プロジェクト(WTP)にWebサービスプロジェクトを追加しないで下さい。Webサービスプロジェクトが通常のJavaプロジェクトと誤認され、EARファイルを配備してもWebサービスが動作しない不具合があります。
この問題に対処するには、Webサービスプロジェクトから一旦エクスポート機能を使ってWAR、またはEJB-JARファイルを作成しておき、これらをエンタープライズ・アプリケーション・プロジェクト(WTP)に取り込みます。取り込む方法は、エンタープライズ・アプリケーション・プロジェクト(WTP)のコンテントディレクトリ(初期値ではEarContentという名前です)に作成しておいたWAR、またはEJB-JARファイルをコピーします。その後、それと同じ場所にあるMETA-INFフォルダにあるapplication.xmlを開き、次のような記述を追加します。

WARファイルの場合

<application>
 …
  <module>
   <web>
    <web-uri>追加するWARファイル名</web-uri>
    <context-root>Webサービス作成ウィザードで指定したものと同じコンテキストルートの値</context-root>
   </web>
  </module>
 …
</application>

EJB-JARファイルの場合

<application>
 …
  <module>
   <ejb>追加するEJB-JARファイル名</ejb>
  </module>
 …
</application>

なお、ファイル名にパスをつける必要はありません。これが終了したら、application.xmlを保存し、通常通りEARファイルのエクスポートを行えば、Webサービスを含むEARファイルを作成することができます。

 

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

(1) SSLに関する制限事項

    Webコンテナの内蔵Webサーバ使用時、双方向認証ができません。

 

4.4. JAX-WSを利用する場合の注意制限事項
 
4.4.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.4.2. JAX-WSを利用する場合の注意事項

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

  1. JAX-WSを動作させるためには、JDK 5.0 Update 2以上が必要になります。


  2. JDK 6.0を使用してクライアントアプリケーションを実行する場合、WebOTXのJAX-WSを利用するには次のJavaシステムプロパティを設定する必要があります。
    -Djavax.xml.ws.spi.Provider=com.nec.webotx.webservice.xml.ws.spi.ProviderImpl
    なお、JDK 6.0のパスを指定してWebOTX ASをインストールした場合、サーバ側の設定は自動的に行われます。


  3. 高信頼性メッセージングサービスを利用する場合は、JAX-WSを有効にする必要があります。セットアップガイドのインストール後の作業に従ってJAX-WSを有効にしてください。
    なお、有効化したJAX-WSを再度無効化する場合は、以下のコマンドを実行してください。

    Windows : <WebOTXインストールディレクトリ>\lib\jaxws\uninstall_jaxws.bat
    Unix : /opt/WebOTX/lib/jaxws/uninstall_jaxws.sh

    <WebOTXインストールディレクトリ>はWebOTXをインストールしたディレクトリを表しています。


  4. 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ではCalenderクラスの実装としてGregorianCallendarクラスを使用していましたが、JAX-WSではデフォルトとしてXMLGregorianCallendarが使用されます。

      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.5. その他の注意事項

(1) 外部Webサーバとの連携を行った環境でEJBサービスエンドポイントを動作させる場合の注意

    外部Webサーバとの連携を行った環境でEJBサービスエンドポイントを動作させるには、EJBサービスエンドポイントを配備したドメインにJava VMオプションを追加する必要があります。

      ・ オプションの追加方法

      運用管理コマンドを起動し、次のように実行します。

      otxadmin> login --port 6212 --user admin --password ****** (ログインの例です)

      otxadmin> create-jvm-options -Dwebotx.webcontainer.serverconfig.NoRoot=false

      最後にドメインを再起動します。