4. Webサービス

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

4.1. JAX-WS

4.1.1. 注意事項

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

  2. JAX-WSのDispatchを使用し、 WSDLのschemaの定義でメッセージの型に次のいずれかを指定した場合、 その型の上限値や下限値を超える値の指定が可能ですが受信側では問題を検出することはできません。 この場合、アプリケーションの引数や戻り値は、不正な値に変換されてしまいます。 そのため送信側で事前にチェックが必要です。
  3. wsimportコマンドはWSDLへのアクセスを行う際に、 デフォルトでシステムのプロキシ設定を使用します。 システムのプロキシ設定の内容やネットワーク環境により、WSDLへのアクセスに失敗する場合があります。 この場合、wsimportコマンドファイルを編集し、wsimport実行時のシステムプロパティに以下の設定を追加してください。
    -Dcom.nec.webotx.webservice.tools.ws.Invoker.noSystemProxies=true
    

4.1.2. 制限事項

  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 <SOAPMessageContext> {
    
     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.2. JAX-RPC

4.2.1. 注意事項

4.2.1.1. 配備時またはwscompileコマンド実行時

4.2.2. 制限事項

4.2.2.1. SOAP通信高速化設定を有効にした場合

4.2.2.2. UTF-16エンコーディングのSOAPメッセージ

4.3. JAX-RS

4.3.1. 注意事項

4.3.1.1. OSSのJerseyのライブラリ使用について

OSSのJerseyを使用する場合、ライブラリをwarファイルに含めず$INSTANCE_ROOT/domains/domain1/lib直下に配置して使用ください。使用するOSSのJerseyのバージョンによって手順が異なります。

4.3.1.2. アノテーションのパラメータjava.util.SortedSetの使用

4.3.2. 制限事項

特にありません。