3. Webサービス

3.1. JAX-RPC

3.1.1. 注意事項

3.1.1.1. JDK 11 の環境で配備時にJAX-RPCのwscompileを使用する場合について

ドメインディレクトリの config/server.policy に定義を追加し、権限を追加する必要があります。ドメインが停止した状態で、server.policy ファイルを開き、以下のコメンアウトを外してください。

        // grant codeBase "jrt:/jdk.compiler" {
        //    permission java.lang.RuntimePermission "closeClassLoader";
        //    permission java.lang.RuntimePermission "createClassLoader";
        //    permission java.lang.RuntimePermission "getenv.JDK_JAVAC_OPTIONS";
        // };

3.1.2. 制限事項

3.1.2.1. SOAP通信高速化設定を有効にした場合
3.1.2.2. UTF-16エンコーディングのSOAPメッセージ

3.2. JAX-WS

3.2.1. 注意事項

3.2.1.1. JAX-RPCとの互換性

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

3.2.1.2. javax.xml.ws.Dispatchインタフェースの使用

javax.xml.ws.Dispatchインタフェースを使用し、 WSDLのschemaの定義でメッセージの型に次のいずれかを指定した場合、 その型の上限値や下限値を超える値の指定が可能ですが受信側では問題を検出することはできません。 この場合、アプリケーションの引数や戻り値は、不正な値に変換されてしまいます。 そのため送信側で事前にチェックが必要です。


3.2.1.3. wsimportコマンド使用時のプロキシ使用

wsimportコマンドはWSDLへのアクセスを行う際に、 デフォルトでシステムのプロキシ設定を使用します。 システムのプロキシ設定の内容やネットワーク環境により、WSDLへのアクセスに失敗する場合があります。 この場合、{WebOTXインストールフォルダ}\bin\wsimport.bat を編集し、「%JAVA_CMD%」で始まる行について、wsimport実行時のシステムプロパティに以下の設定を追加してください。

-Dcom.nec.webotx.webservice.tools.ws.Invoker.noSystemProxies=true

3.2.1.4. JDK 11での実行

JDK 11で、クライアントアプリケーション(Javaアプリケーション)を実行した場合、次のような、リフレクションに関する警告メッセージが出力されます。動作には影響しませんが、この警告を抑止するには、Javaコマンドの引数に、--add-opens java.base/java.lang=ALL-UNNAMED を追加してください。

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.sun.xml.bind.v2.runtime.reflect.opt.Injector (file:/opt/WebOTX/modules/wows-rt.jar) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int)
WARNING: Please consider reporting this to the maintainers of com.sun.xml.bind.v2.runtime.reflect.opt.Injector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

3.2.2. 制限事項

3.2.2.1. encoded形式のSOAPメッセージの未サポート

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 {
     :
 }

3.2.2.2. JAXBContextクラスを利用したMESSAGEモードでの呼び出しの未サポート

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

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

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

3.2.2.3. ハンドラの戻り値でfalseを返却する動作の未サポート

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を返すようにします
     }
 }

3.2.2.4. parameterStyle属性にBAREを指定したWebサービスでのjava.util.Collectionクラスの送受信の未サポート

rpc/literal形式もしくはdocument/literal形式でparameterStyle属性にBAREを指定したWebサービスは、 java.util.Collectionクラスの送受信をサポートしていません。java.util.Collectionクラスを送受信する場合は、document/literal形式の parameterStyle属性に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) {
         :
         :
     }
 }

3.2.2.5. 配備記述子に記述するエンドポイントURLでの暗黙URLの未サポート

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

3.2.2.6. メソッドのパラメータや戻り値へのインタフェースの指定について

メソッドのパラメータや戻り値にインタフェースを指定することはできません。メソッドのパラメータや戻り値には、実装クラスを指定するようにしてください。

3.3. JAX-RS

3.3.1. 注意事項

3.3.1.1. リソースクラスをEJBとして実装した場合のインジェクション
3.3.1.2. JAX-RSによるコンストラクタ・インジェクションの使用
3.3.1.3. OSSのJerseyライブラリ使用について

オープンソースソフトウェア(OSS)として公開されるJerseyをアプリケーション中で使用する場合には以下の手順を実施ください。

  1. WebOTXのドメインを停止
  2. WebOTXのJAX-RSのライブラリを退避
    $AS_INSTALL/modulesに配置している下記ファイルをクラスパスが通っていない場所に退避してください。
  3. $INSTANCE_ROOT/osgi-cacheを削除
  4. $INSTANCE_ROOT/config/server.policyに以下のポリシーを追加
    grant codeBase "file:${com.nec.webotx.instanceRoot}/lib/-" {
        permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
        permission org.osgi.framework.AdminPermission "*", "resource";
        permission java.lang.RuntimePermission  "createClassLoader";                
    };
  5. WebOTXのドメインを起動

以下の点をご注意ください。