第7章 アプリケーションの移行における変更の理解

このセクションでは、アプリケーションを JBoss EAP 6.4 または 7.x から JBoss EAP 8.0 に移行するために必要な変更について説明します。

7.1. Web サービスアプリケーションの変更

主に Apache CXFApache WSS4J、および Apache Santuario コンポーネントがアップグレードされ、JBossWS 5 は JBoss EAP 7 の Web サービスに新機能と改良されたパフォーマンスを提供します。JBoss EAP 8.0 は、JBossWS 7 を使用してその機能をサポートします。

7.1.1. JAX-RPC サポートの変更

XML ベースの RPC (JAX-RPC) は Java EE 6 で非推奨となり、Java EE 7 ではオプションとなりました。JBoss EAP 7 以降、サポートされなくなりました。JAX-RPC を使用するアプリケーションは、現在の Jakarta EE 標準 Web サービスフレームワークである Jakarta XML Web Services を使用するように移行する必要があります。

JAX-RPC web サービスの使用は、以下のいずれかの方法で特定できます。

  • JAX-RPC マッピングファイルの存在。 これは、root 要素 <java-wsdl-mapping> のある XML ファイルです。
  • webservices.xml XML 記述子ファイルの存在。このファイルには <jaxrpc-mapping-file> 子要素が含まれる <webservice-description> 要素があります。以下に JAX-RPC Web サービスを定義する webservices.xml 記述子ファイルの例を示します。

    <webservices xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd" version="1.1">
      <webservice-description>
        <webservice-description-name>HelloService</webservice-description-name>
        <wsdl-file>WEB-INF/wsdl/HelloService.wsdl</wsdl-file>
        <jaxrpc-mapping-file>WEB-INF/mapping.xml</jaxrpc-mapping-file>
        <port-component>
          <port-component-name>Hello</port-component-name>
          <wsdl-port>HelloPort</wsdl-port>
          <service-endpoint-interface>org.jboss.chap12.hello.Hello</service-endpoint-interface>
          <service-impl-bean>
            <servlet-link>HelloWorldServlet</servlet-link>
          </service-impl-bean>
        </port-component>
      </webservice-description>
    </webservices>
  • ejb-jar.xml ファイルの存在。 これには、JAX-RPC マッピングファイルを参照する <service-ref> が含まれます。

7.1.2. Apache CXF Spring Web サービスの変更

以前のリリースの JBoss EAP では、エンドポイントデプロイメントアーカイブを jbossws-cxf.xml 設定ファイルに含め、JBossWS と Apache CXF の統合をカスタマイズすることができました。このユースケースの 1 つが、Apache CXF バスで Web サービスクライアントおよびサーバーエンドポイントのインターセプターチェインを設定することでした。この統合には、JBoss EAP サーバーに Spring をデプロイする必要がありました。

Spring 統合は JBoss EAP 8 ではサポートされなくなりました。jbossws-cxf.xml 記述子設定ファイルが含まれるアプリケーションを編集し、このファイルに定義されているカスタム設定を置き換える必要があります。JBoss EAP 7 でも Apache CXF API に直接アクセスすることはできますが、アプリケーションは移植できないことに注意してください。

可能な場合は、Spring のカスタム設定を新しい JBossWS 記述子設定オプションに置き換えることが推奨されます。この JBossWS 記述子ベースの方法では、クライアントエンドポイントコードを編集する必要がなく、同様の機能を提供できます。場合によっては、Spring を Context and Dependency Injection (コンテキストと依存性の注入、CDI) に置き換えることができます。

7.1.2.1. Apache CXF インターセプター

JBossWS 記述子は、クライアントエンドポイントコードを編集せずにインターセプターを宣言できる新しい設定オプションを提供します。cxf.interceptors.in および cxf.interceptors.out プロパティーのインターセプタークラス名のリストを指定して、事前定義されたクライアントおよびエンドポイント設定内でインターセプターを宣言します。

以下は、これらのプロパティーを使用してインターセプターを宣言する jaxws-endpoint-config.xml ファイルの例です。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jakartaee="https://jakarta.ee/xml/ns/jakartaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:5.0 schema/jbossws-jaxws-config_5_0.xsd">
  <endpoint-config>
    <config-name>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointImpl</config-name>
    <property>
      <property-name>cxf.interceptors.in</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointInterceptor,org.jboss.test.ws.jaxws.cxf.interceptors.FooInterceptor</property-value>
    </property>
    <property>
      <property-name>cxf.interceptors.out</property-name>
      <property-value>org.jboss.test.ws.jaxws.cxf.interceptors.EndpointCounterInterceptor</property-value>
    </property>
  </endpoint-config>
</jaxws-config>

7.1.2.2. Apache CXF の機能

JBossWS 記述子を使用すると、cxf.features プロパティーの機能クラス名のリストを指定して、事前定義のクライアントおよびエンドポイント設定内で機能を宣言できます。

以下は、このプロパティーを使用して機能を宣言する jaxws-endpoint-config.xml ファイルの例です。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:5.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jakartaee="https://jakarta.ee/xml/ns/jakartaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:5.0 schema/jbossws-jaxws-config_5_0.xsd">
  <endpoint-config>
    <config-name>Custom FI Config</config-name>
    <property>
      <property-name>cxf.features</property-name>
      <property-value>org.apache.cxf.feature.FastInfosetFeature</property-value>
    </property>
  </endpoint-config>
</jaxws-config>

7.1.2.3. Apache CXF HTTP トランスポート

Apache CXF では、org.apache.cxf.transport.http.HTTPConduit オプションを指定すると HTTP トランスポートの設定を実行できます。JBossWS の統合により、以下のように Apache CXF API を使用して conduit がプログラム的に編集されます。

import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

// Set chunking threshold before using a JAX-WS port client
...
HTTPConduit conduit = (HTTPConduit)ClientProxy.getClient(port).getConduit();
HTTPClientPolicy client = conduit.getClient();

client.setChunkingThreshold(8192);
...

また、システムプロパティーを設定すると Apache CXF HTTPConduit のデフォルト値を制御および上書きできます。

プロパティー説明

cxf.client.allowChunking

Boolean

チャンキングを使用してリクエストを送信するかどうかを指定します。

cxf.client.chunkingThreshold

Integer

非チャンキングからチャンキングモードに切り替えるしきい値を設定します。

cxf.client.connectionTimeout

Long

接続タイムアウトをミリ秒単位で設定します。

cxf.client.receiveTimeout

Long

受信タイムアウトをミリ秒単位で設定します。

cxf.client.connection

String

Keep-Alive または close 接続タイプを使用するかどうかを指定します。

cxf.tls-client.disableCNCheck

Boolean

CN ホスト名チェックを無効化するかどうかを指定します。

7.1.3. WS-Security の変更

このセクションでは、JBoss EAP 6.4 および JBoss EAP 7.0 でのアプリケーションの WS-Security のさまざまな変更について説明します。

  • アプリケーションに、org.apache.ws.security.WSPasswordCallback クラスにアクセスするカスタムコールバックハンドラーが含まれている場合、このクラスは org.apache.wss4j.common.ext パッケージに移動されたため注意してください。
  • org.apache.ws.security.saml.ext パッケージの SAML bean オブジェクトのほとんどは、org.apache.wss4j.common.saml パッケージに移動されました。
  • RSA v1.5 キートランスポートおよびすべての関連アルゴリズムの使用は、デフォルトでは許可されていません。
  • これまで、セキュリティートークンサービス (STS) は onBehalfOf トークンのみを検証しました。ActAs トークンも検証するようになりました。そのため、ActAs トークンに提供される UsernameToken に有効なユーザー名とパスワードを指定する必要があります。
  • SAML Bearer トークンには内部署名が必要になりました。署名の検証を有効または無効にするため、org.apache.wss4j.dom.validate.SamlAssertionValidator クラスに setRequireBearerSignature() メソッドが含まれるようになりました。

7.1.4. JBoss モジュール構造の変更

cxf-api および cxf-rt-core JAR が 1 つの cxf-core JAR に統合されました。そのため、JBoss EAP の org.apache.cxf モジュールに cxf-core JAR が含まれるようになり、これまでのリリースよりも多いクラスが公開されました。

7.1.5. Bouncy Castle の要件および変更

XML/WS-Security での対称暗号化で Galois/Counter Mode (GCM) を用いた AES 暗号化を使用したい場合、BouncyCastle Security Provider が必要になります。

JBoss EAP 7 以降、これは org.bouncycastle モジュールに含まれており、JBossWS はそのクラスローダーを信頼して BouncyCastle セキュリティープロバイダーを取得して使用できるようになりました。そのため、現在の JVM に BouncyCastle を静的にインストールする必要がなくなりました。コンテナーの外部で実行しているアプリケーションの場合、BouncyCastle ライブラリーをクラスパスに追加すると JBossWS はこのセキュリティープロバイダーを使用できます。

この動作を無効にするには、jaxws-endpoint-config.xml デプロイメント記述子ファイル (サーバーの場合) または jaxws-client-config.xml 記述子ファイル (クライアントの場合) で org.jboss.ws.cxf.noLocalBC プロパティーの値を true に設定します。

JBoss EAP に同梱されるバージョンでないものを使用したい場合は、BouncyCastle を静的に JVM にインストールできます。この場合、静的にインストールされた BouncyCastle Security Provider はクラスパスに存在するプロバイダーよりも優先的に選択されます。問題を回避するには、BouncyCastle 1.72 以降を使用する必要があります。

7.1.6. Apache CXF バス選択ストラテジー

コンテナー内で実行されているクライアントのデフォルトのバス選択ストラテジーが THREAD_BUS から TCCL_BUS に変更されました。コンテナー外部で実行されているクライアントのデフォルトストラテジーは THREAD_BUS で、変更はありません。以下の方法の 1 つを使用すると、以前のリリースでの動作を復元できます。

  • org.jboss.ws.cxf.jaxws-client.bus.strategy システムプロパティーの値を THREAD_BUS に設定して JBoss EAP サーバーを起動します。
  • クライアントコードで選択ストラテジーを明示的に設定します。

7.1.7. WebServiceRef の Jakarta XML Web Services 2.2 要件

コンテナーは、コンストラクターで WebServiceFeature クラスが引数として含まれる Jakarta XML Web Services 2.2 スタイルのコンストラクターを使用して、web サービス参照に注入されるクライアントをビルドする必要があります。JBossWS 4 が同梱される JBoss EAP 6.4 はこの要件を隠します。JBossWS 5 を含む JBoss EAP 7 以降、この要件は隠蔽されていません。これは、コンテナーによって注入されるユーザー提供のサービスクラスは、1 つ以上の WebServiceFeature 引数を含む jakarta.xml.ws.Service コンストラクターを使用するように既存のコードを更新することにより、Jakarta XML Web Services 2.2 以降を実装する必要があることを示しています。

protected Service(URL wsdlDocumentLocation,
       QName serviceName,
       WebServiceFeature... features)

7.1.8. IgnoreHttpsHost CN チェックの変更

以前のリリースでは、システムプロパティー org.jboss.security.ignoreHttpsHosttrue に設定すると、証明書にあるサービスの一般名 (CN) に対する HTTPS URL ホスト名チェックを無効にすることができました。このシステムプロパティー名は cxf.tls-client.disableCNCheck に置き換えられました。

7.1.9. サーバー側設定およびクラスローディング

サービスエンドポイントおよびサービスクライアントハンドラーへのインジェクションが有効になったため、org.jboss.as.webservices.server.integration JBoss モジュールから自動的にハンドラークラスをロードすることができなくなりました。アプリケーションが事前定義の設定に依存する場合、デプロイメントの新しいモジュール依存関係を明示的に定義する必要があることがあります。詳細は、明示的なモジュール依存関係の移行 を参照してください。

7.1.10. Java Endorsed Standards Override Mechanism が非推奨となる

Java Endorsed Standards Override Mechanism は JDK 1.8_40 では非推奨になり、JDK 9 では削除される予定です。これは、JAR を JRE 内の endorsed ディレクトリーに置くことで、デプロイされたアプリケーションすべてがライブラリーを利用できるメカニズムです。

JBoss EAP 7 リリース以降、アプリケーションが Apache CXF の JBossWS 実装を使用している場合は、必要な依存関係が正しい順序で確実に追加されるようになり、ユーザーはこの変更による影響を受けることはありません。アプリケーションが Apache CXF に直接アクセスする場合、アプリケーションデプロイメントの一部として JBossWS の依存関係の後に Apache CXF の依存関係を提供する必要があります。

7.1.11. EAR アーカイブでの記述子の仕様

以前のリリースの JBoss EAP では、Jakarta Enterprise Beans Web サービスデプロイメントの jboss-webservices.xml デプロイメント記述子ファイルを JAR アーカイブの META-INF/ ディレクトリーまたは POJO Web サービスデプロイメントの WEB-INF/ ディレクトリーと、WAR アーカイブにバンドル化された Jakarta Enterprise Beans Web サービスエンドポイントに設定することができました。

JBoss EAP 7 以降では、EAR アーカイブの META-INF/ ディレクトリーに jboss-webservices.xml デプロイメント記述子ファイルを設定できるようになりました。jboss-webservices.xml ファイルが EAR アーカイブおよび JAR または WAR アーカイブで見つかった場合、JAR または WAR の jboss-webservices.xml ファイル内の設定データは、EAR 記述子ファイル内の対応するデータをオーバーライドします。