第3章 JAX-WS Web サービスの開発


XML ベースの Web サービス (JAX-WS) 向けの Java API は、Web サービスにアクセスして公開するために使用されるクラスや、AIX と Java 間のマッピングを定義します。JBossWS は最新の JAX-WS specification を実装し、ユーザーはベンダーに依存しない Web サービス使用のニーズを参照できます。JAX-WS の Jakarta EE は Jakarta XML Web Services Specification 2.3 仕様 です。

3.1. JAX-WS ツールの使用

以下の JAX-WS コマンドラインツールは JBoss EAP ディストリビューションに含まれています。これらのツールは、サーバー およびクライアント側の開発にさまざまな方法で使用できます。

Expand
表3.1 JAX-WS コマンドラインツール
コマンド説明

wsprovide

JAX-WS の移植可能なアーティファクトを生成し、抽象的なコントラクトを提供します。ボトムアップ開発に使用します。

wsconsume

抽象的なコントラクト (WSDL や Schema ファイル) を使用し、サーバーとクライアントの両方に対してアーティファクトを生成します。トップダウンおよびクライアント開発に使用されます。

これらのツールの使用方法の詳細は、JAX-WS Tools を参照してください。

3.1.1. サーバー側開発ストラテジー

サーバー側で Web サービスエンドポイントを開発する場合、ボトムアップ開発 として知られる Java コードや、トップダウン開発というサービスを定義する WSDL から開始するオプションを利用できます。これが新しいサービスで、既存のコントラクトがない場合、ボトムアップアプローチが最速のルートになります。サービスを稼働させるためには、クラスにアノテーションをいくつか追加する必要があります。ただし、すでに定義されているコントラクトでサービスを開発する場合は、ツールによるアノテーション付きコードの生成を可能にするため、トップダウンアプローチを使用した方がはるかに簡単です。

ボトムアップのユースケース:

  • 既存の EJB3 Bean を Web サービスとして公開
  • 新規サービスの提供と、コントラクトが生成されるようにする。

トップダウンのユースケース:

  • 既存の Web サービスの実装を置き換え、古いクライアントとの互換性を失うことはできません。
  • サードパーティーが指定したコントラクトに準拠するサービスを公開している (たとえば、定義済みプロトコルを使用して返送するベンダー)。
  • 事前に開発した XML Schema と WSDL に準拠するサービスを作成します。
wsprovide を使用したダウンアップグレードストラテジー

ボトムアップストラテジーでは、サービスの Java コードを開発し、JAX-WS アノテーションを使用してアノテーションを付ける必要があります。これらのアノテーションを使用して、サービスに生成されるコントラクトをカスタマイズできます。XML ベースの Web Services の Jakarta EE は Jakarta XML Web Services Specification 2.3 です。たとえば、操作名を任意のものにマッピングするように変更できます。ただし、すべてのアノテーションには適切なデフォルトがあるため、@WebService アノテーションのみが必要になります。

これは、単一クラスを作成するのと同じように簡単に実行できます。

package echo;

@javax.jws.WebService
public class Echo {

   public String echo(String input) {
      return input;
   }
}

デプロイメントはこのクラスを使用して構築でき、JBossWS にデプロイするために必要な唯一の Java コードです。ラッパークラスと呼ばれるその他の Java アーティファクトは、デプロイ時に生成されます。

wsprovide ツールの主な目的は、移植可能な AX-WS アーティファクトを生成することです。さらに、サービスの WSDL ファイルを提供するのに使用できます。これは、-w オプションを使用して wsprovide を呼び出すことで取得できます。

$ javac -d . Echo.java
$ EAP_HOME/bin/wsprovide.sh --classpath=. -w echo.Echo

アクセスメントを検査すると、EchoService という名前のサービスが表示されます。

<wsdl:service name="EchoService">
  <wsdl:port name="EchoPort" binding="tns:EchoServiceSoapBinding">
    <soap:address location="http://localhost:9090/EchoPort"/>
  </wsdl:port>
</wsdl:service>

予想通りに、このサービスは、echo という操作を定義します。

<wsdl:portType name="Echo">
  <wsdl:operation name="echo">
    <wsdl:input name="echo" message="tns:echo">
    </wsdl:input>
    <wsdl:output name="echoResponse" message="tns:echoResponse">
    </wsdl:output>
  </wsdl:operation>
</wsdl:portType>

デプロイ時に、このツールを実行する必要はありません。これは、移植可能なアーティファクトまたはサービスの抽象的なコントラクトを生成する場合にのみ必要です。

デプロイメントの POJO エンドポイントは、簡単な web.xml ファイルに作成できます。

<web-app 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://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>Echo</servlet-name>
    <servlet-class>echo.Echo</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Echo</servlet-name>
    <url-pattern>/Echo</url-pattern>
  </servlet-mapping>
</web-app>

web.xml と単一の Java クラスを使用して WAR を作成できます。

$ mkdir -p WEB-INF/classes
$ cp -rp echo WEB-INF/classes/
$ cp web.xml WEB-INF
$ jar cvf echo.war WEB-INF
added manifest
adding: WEB-INF/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/echo/(in = 0) (out= 0)(stored 0%)
adding: WEB-INF/classes/echo/Echo.class(in = 340) (out= 247)(deflated 27%)
adding: WEB-INF/web.xml(in = 576) (out= 271)(deflated 52%)

WAR は JBoss EAP にデプロイできます。これにより、内部的に wsprovide が呼び出され、その WSDL が生成されます。デプロイメントに成功し、デフォルト設定を使用している場合は、管理コンソールで利用できるようにする必要があります。

注記

移植可能な JAX-WS デプロイメントでは、先に生成されたラッパークラスをデプロイメントに追加することができます。

wsconsume を使用したトップダウンストラテジー

トップダウンの開発ストラテジーは、サービスの抽象的なコントラクトで始まります。これには WSDL ファイルおよびゼロ以上のスキーマファイルが含まれます。wsconsume ツールを使用してこのコントラクトを消費し、アノテーション付きの Java クラスと、それを定義するオプションのプションのソースを生成します。

注記

wsconsume には、Unix システムのシンボリックリンクに問題がある可能性があります。

ボトムアップの例から WSDL ファイルを使用して、このサービスに準拠する新しい Java 実装を生成することができます。-k オプションは wsconsume に渡され、Java クラスのみを提供する代わりに、生成された Java ソースファイルを保存します。

$ EAP_HOME/bin/wsconsume.sh -k EchoService.wsdl

以下の表には、生成される各ファイルの目的をまとめています。

Expand
表3.2 生成されるファイル
ファイル目的

Echo.java

サービスエンドポイントインターフェース

EchoResponse.java

応答メッセージのラッパー Bean

EchoService.java

JAX-WS クライアントによってのみ使用されます。

Echo_Type.java

要求メッセージのラッパー Bean

ObjectFactory.java

JAXB XML レジストリー

package-info.java

JAXB パッケージのアノテーションのホルダー

サービスエンドポイントインターフェースを調べると、ボトムアップの例で手動で記述したクラスよりも明示的なアノテーションが表示されますが、これらは同じコントラクトに対して評価されます。

@WebService(targetNamespace = "http://echo/", name = "Echo")
@XmlSeeAlso({ObjectFactory.class})
public interface Echo {

    @WebMethod
    @RequestWrapper(localName = "echo", targetNamespace = "http://echo/", className = "echo.Echo_Type")
    @ResponseWrapper(localName = "echoResponse", targetNamespace = "http://echo/", className = "echo.EchoResponse")
    @WebResult(name = "return", targetNamespace = "")
    public java.lang.String echo(
        @WebParam(name = "arg0", targetNamespace = "")
        java.lang.String arg0
    );
}

パッケージ化以外の不明な部分は実装クラスで、上記のインターフェースを使用して記述できるようになりました。

package echo;

@javax.jws.WebService(endpointInterface="echo.Echo")
public class EchoImpl implements Echo {
   public String echo(String arg0) {
      return arg0;
   }
}

3.1.2. クライアント側の開発ストラテジー

クライアント側の詳細を確認する前に、Web サービスの中心となる切り離す概念を理解することが重要です。Web サービスは、この方法で使用することもできますが、内部 RPC には適していません。CORBA や RMI などのより優れた技術があります。Web サービスは、特に相互運用可能な粒度の細かい対応のために設計されました。Web サービスの対話に参加しているいかなるパーティも、特定のオペレーティングシステム上で実行したり、特定のプログラミング言語で記述されているといった保証はありません。そのため、クライアントおよびサーバー実装は明確に分離することが重要です。一般的なのは、抽象的なコントラクト定義のみです。何らかの理由でソフトウェアがこの原理に準拠しない場合は、Web サービスを使用しないことをお勧めします。上記の理由により、クライアント開発に推奨される方法は、クライアントが同じサーバーで実行されている場合でもトップダウンアプローチに従うことです。

wsconsume を使用したトップダウンストラテジー

このセクションは、サーバー側のトップダウンセクションのプロセスを繰り返しますが、デプロイ済みの WSDL を使用します。これは、デプロイ時に計算される soap:addressの正しい値を取得します (下記参照)。この値は、必要に応じて手動で編集できますが、正しいパスを指定する必要があります。

例: デプロイ済みコンポーネントの soap:address

<wsdl:service name="EchoService">
  <wsdl:port name="EchoPort" binding="tns:EchoServiceSoapBinding">
    <soap:address location="http://localhost.localdomain:8080/echo/Echo"/>
  </wsdl:port>
</wsdl:service>

wsconsume を使用して、デプロイされた WSDL の Java クラスを生成します。

$ EAP_HOME/bin/wsconsume.sh -k http://localhost:8080/echo/Echo?wsdl

EchoService.java クラスが、WSDL が取得元の場所を保存する方法に注目してください。

@WebServiceClient(name = "EchoService",
                  wsdlLocation = "http://localhost:8080/echo/Echo?wsdl",
                  targetNamespace = "http://echo/")
public class EchoService extends Service {

    public final static URL WSDL_LOCATION;

    public final static QName SERVICE = new QName("http://echo/", "EchoService");
    public final static QName EchoPort = new QName("http://echo/", "EchoPort");

    ...

    @WebEndpoint(name = "EchoPort")
    public Echo getEchoPort() {
        return super.getPort(EchoPort, Echo.class);
    }

    @WebEndpoint(name = "EchoPort")
    public Echo getEchoPort(WebServiceFeature... features) {
        return super.getPort(EchoPort, Echo.class, features);
    }
}

ご覧のとおり、この生成されたクラスは JAX-WS、javax.xml.ws.Service の主なクライアントエントリーポイントを拡張します。Service を直接使用することはできますが、設定情報を提供するため、これははるかに簡単です。サービスエンドポイントインターフェースのインスタンスを返す getEchoPort() メソッドに注意してください。返されたインターフェースでメソッドを呼び出すと、Web サービスの操作をすべて呼び出すことができます。

重要

実稼働環境のアプリケーションで、リモート WSDL URL を参照しないでください。これにより、Service オブジェクトをインスタンス化するたびにネットワーク I/O が発生します。代わりに、保存されたローカルコピーでツールを使用するか、またはコンストラクターの URL バージョンを使用して、新しい WSDL の場所を提供します。

クライアントの書き込みとコンパイル:

import echo.*;

public class EchoClient {

   public static void main(String args[]) {

      if (args.length != 1) {
          System.err.println("usage: EchoClient <message>");
          System.exit(1);
      }

      EchoService service = new EchoService();
      Echo echo = service.getEchoPort();
      System.out.println("Server said: " + echo.echo(args0));
   }
}

以下のように ENDPOINT_ADDRESS_PROPERTY を設定すると、ランタイム時に操作のエンドポイントアドレスを変更できます。

EchoService service = new EchoService();
Echo echo = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)echo;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args0));

3.2. JAX-WS Web サービスエンドポイント

3.2.1. JAX-WS Web サービスエンドポイント

JAX-WS Web サービスエンドポイントは、Web サービスのサーバーコンポーネントです。クライアントおよび他の Web サービスは、Simple Object Access Protocol (SOAP) と呼ばれる XML 言語を使用して HTTP プロトコルを介して通信します。エンドポイント自体は JBoss EAP コンテナーにデプロイされます。

WSDL 記述子は、以下のいずれかの方法で作成できます。

  • WSDL 記述子の手動書き込み
  • WSDL 記述子を自動的に作成する JAX-WS アノテーションを使用します。これは、WSDL 記述子を作成するための最も一般的な方法です。

エンドポイント実装 Bean には JAX-WS アノテーションが付けられ、サーバーにデプロイされます。サーバーは、クライアント消費のために、抽象的なコントラクトを自動的に生成し、パブリッシュします。すべてのマーシャリングおよびアンマーシャリングは、Java Architecture for XML Binding (JAXB) サービスに委任されます。

エンドポイント自体は Plain Old Java Object (POJO) または Jakarta EE Web アプリケーションである場合があります。EJB3 ステートレスセッション Bean を使用してエンドポイントを公開することもできます。Web アーカイブ (WAR) ファイルにパッケージ化されます。Java Service Endpoint (JSE) と呼ばれるエンドポイントをパッケージ化するための仕様は JSR-181 で定義されています。JAX-WS API 仕様の Jakarta EE は Jakarta Web Services Metadata Specification 2.1 です。

例: POJO エンドポイント

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class JSEBean {
    @WebMethod
    public String echo(String input) {
        ...
    }
}

例: Web サービスエンドポイント

<web-app ...>
  <servlet>
    <servlet-name>TestService</servlet-name>
    <servlet-class>org.jboss.quickstarts.ws.jaxws.samples.jsr181pojo.JSEBean01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestService</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

以下の EJB3 ステートレスセッション Bean は、リモートインターフェースとエンドポイント操作に同じメソッドを公開します。

@Stateless
@Remote(EJB3RemoteInterface.class)

@WebService

@SOAPBinding(style = SOAPBinding.Style.RPC)
public class EJB3Bean implements EJB3RemoteInterface {
    @WebMethod
    public String echo(String input) {
        ...
    }
}

サービスエンドポイントインターフェース

JAX-WS サービスは通常 Java サービスエンドポイントインターフェース (SEI) を実装します。これは、WSDL ポートタイプから、直接またはアノテーションを使用してマッピングされる可能性があります。この SEI は、Java オブジェクトとその XML 表現の詳細を隠す高度な抽象化を提供します。

エンドポイントプロバイダーインターフェース

JAX-WS サービスは、XML メッセージレベルで動作する必要があることがあります。エンドポイント Provider インターフェースは、この機能を実装する Web サービスにこの機能を提供します。

エンドポイントの使用およびアクセス

Web サービスをデプロイしたら、WSDL を消費してアプリケーションの基盤となるコンポーネントのスタブを作成できます。その後、アプリケーションはエンドポイントにアクセスしてその作業を実行できます。

3.2.2. JAX-WS Web サービスエンドポイントの開発およびデプロイ

JAX-WS サービスエンドポイントは、JAX-WS クライアントからのリクエストに応答し、それ自体の WSDL 定義を公開するサーバー側のコンポーネントです。

JAX-WS エンドポイントアプリケーションの開発方法の実例については、JBoss EAP に同梱される以下のクイックスタートを参照してください。

  • jaxws-addressing
  • jaxws-ejb
  • jaxws-pojo
  • jaxws-retail
  • wsat-simple
  • wsba-coordinator-completion-simple
  • wsba-participant-completion-simple

開発要件

Web サービスは、JAX-WS API および JSR 181: Web Services Metadata for the Java Platform 仕様の要件を満たす必要があります。有効な実装は以下の要件を満たします。Web Services Metadata の Jakarta EE に相当するものは、Jakarta Web Services Metadata Specification 2.1 仕様 に含まれています。

これらの要件を満たす Web サービス実装の例を以下に示します。

例: Web サービス実装

package org.jboss.quickstarts.ws.jaxws.samples.retail.profile;

import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.soap.SOAPBinding;

@Stateless

@WebService(
    name = "ProfileMgmt",
    targetNamespace = "http://org.jboss.ws/samples/retail/profile",
    serviceName = "ProfileMgmtService")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public class ProfileMgmtBean {
    @WebMethod
    public DiscountResponse getCustomerDiscount(DiscountRequest request) {
        DiscountResponse dResponse = new DiscountResponse();
        dResponse.setCustomer(request.getCustomer());
        dResponse.setDiscount(10.00);
        return dResponse;
    }
}

以下は、ProfileMgmtBean bean によって DiscountRequest の例です。アノテーションは詳細度のために含まれています。通常、これは JAXB デフォルトは妥当な設定であり、指定する必要はありません。

例: DiscountRequest クラス

package org.jboss.test.ws.jaxws.samples.retail.profile;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

import org.jboss.test.ws.jaxws.samples.retail.Customer;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
  name = "discountRequest",
  namespace="http://org.jboss.ws/samples/retail/profile",
  propOrder = { "customer" }
)
public class DiscountRequest {

   protected Customer customer;

   public DiscountRequest() {
   }

   public DiscountRequest(Customer customer) {
      this.customer = customer;
   }

   public Customer getCustomer() {
      return customer;
   }

   public void setCustomer(Customer value) {
      this.customer = value;
   }

}

デプロイメントのパッケージ化

実装クラスは JAR デプロイメントでラップされます。デプロイメントに必要なメタデータは、実装クラスとサービスエンドポイントインターフェース上のアノテーションから取得されます。管理 CLI または管理コンソールを使用して JAR をデプロイでき、HTTP エンドポイントが自動的に作成されます。

以下のリストは、EJB Web サービスの JAR デプロイメントの構造の例を示しています。

$ jar -tf jaxws-samples-retail.jar
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.class
org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.class
org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtBean.class
org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.class
org/jboss/test/ws/jaxws/samples/retail/profile/package-info.class

3.3. JAX-WS Web サービスクライアント

3.3.1. JAX-WS Web サービスの消費とアクセス

Web サービスエンドポイントの作成後、手動で、あるいは JAX-WS アノテーションを使用して、その WSDL にアクセスできます。XML ベースの Web Services の Jakarta EE は Jakarta Enterprise Web Services 1.4 仕様 です。これは、Web サービスと通信する基本的なクライアントアプリケーションを作成するのに使用できます。パブリッシュされた WSDL から Java コードを生成するプロセスは、Web サービスを使用すると呼ばれます。これは以下の場合に発生します。

クライアントアーティファクトの作成

クライアントアーティファクトを作成する前に、WSDL コントラクトを作成する必要があります。以下の WSDL コントラクトは、本セクションの残りの部分に記載の例に使用します。

以下の例は、ProfileMgmtService.wsdl ファイルにこの WSDL コントラクトがあることを前提としています。

<definitions
    name='ProfileMgmtService'
    targetNamespace='http://org.jboss.ws/samples/retail/profile'
    xmlns='http://schemas.xmlsoap.org/wsdl/'
    xmlns:ns1='http://org.jboss.ws/samples/retail'
    xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
    xmlns:tns='http://org.jboss.ws/samples/retail/profile'
    xmlns:xsd='http://www.w3.org/2001/XMLSchema'>

   <types>

      <xs:schema targetNamespace='http://org.jboss.ws/samples/retail'
                 version='1.0' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
         <xs:complexType name='customer'>
            <xs:sequence>
               <xs:element minOccurs='0' name='creditCardDetails' type='xs:string'/>
               <xs:element minOccurs='0' name='firstName' type='xs:string'/>
               <xs:element minOccurs='0' name='lastName' type='xs:string'/>
            </xs:sequence>
         </xs:complexType>
      </xs:schema>

      <xs:schema
          targetNamespace='http://org.jboss.ws/samples/retail/profile'
          version='1.0'
          xmlns:ns1='http://org.jboss.ws/samples/retail'
          xmlns:tns='http://org.jboss.ws/samples/retail/profile'
          xmlns:xs='http://www.w3.org/2001/XMLSchema'>

         <xs:import namespace='http://org.jboss.ws/samples/retail'/>
         <xs:element name='getCustomerDiscount'
                     nillable='true' type='tns:discountRequest'/>
         <xs:element name='getCustomerDiscountResponse'
                     nillable='true' type='tns:discountResponse'/>
         <xs:complexType name='discountRequest'>
            <xs:sequence>
               <xs:element minOccurs='0' name='customer' type='ns1:customer'/>

            </xs:sequence>
         </xs:complexType>
         <xs:complexType name='discountResponse'>
            <xs:sequence>
               <xs:element minOccurs='0' name='customer' type='ns1:customer'/>
               <xs:element name='discount' type='xs:double'/>
            </xs:sequence>
         </xs:complexType>
      </xs:schema>

   </types>

   <message name='ProfileMgmt_getCustomerDiscount'>
      <part element='tns:getCustomerDiscount' name='getCustomerDiscount'/>
   </message>
   <message name='ProfileMgmt_getCustomerDiscountResponse'>
      <part element='tns:getCustomerDiscountResponse'
            name='getCustomerDiscountResponse'/>
   </message>
   <portType name='ProfileMgmt'>
      <operation name='getCustomerDiscount'
                 parameterOrder='getCustomerDiscount'>

         <input message='tns:ProfileMgmt_getCustomerDiscount'/>
         <output message='tns:ProfileMgmt_getCustomerDiscountResponse'/>
      </operation>
   </portType>
   <binding name='ProfileMgmtBinding' type='tns:ProfileMgmt'>
      <soap:binding style='document'
                    transport='http://schemas.xmlsoap.org/soap/http'/>
      <operation name='getCustomerDiscount'>
         <soap:operation soapAction=''/>
         <input>

            <soap:body use='literal'/>
         </input>
         <output>
            <soap:body use='literal'/>
         </output>
      </operation>
   </binding>
   <service name='ProfileMgmtService'>
      <port binding='tns:ProfileMgmtBinding' name='ProfileMgmtPort'>

         <!-- service address will be rewritten to actual one when WSDL is requested from running server -->
         <soap:address location='http://SERVER:PORT/jaxws-retail/ProfileMgmtBean'/>
      </port>
   </service>
</definitions>
注記

JAX-WS アノテーションを使用して Web サービスのエンドポイントを作成すると、WSDL コントラクトは自動的に生成されます。その URL のみが必要になります。この URL を見つけるには、Runtime に移動して、該当するサーバーを選択し、Webservicesを 選択してエンドポイントを選択します。

Wsconsume.sh ツールまたは wsconsume.bat ツールは、抽象的なコントラクト (WSDL) を消費し、アノテーション付きの Java クラスと、これを定義するオプションのソースを生成するために使用されます。このファイルは EAP_HOME/bin/ ディレクトリーにあります。

$ ./wsconsume.sh --help
WSConsumeTask is a cmd line tool that generates portable JAX-WS artifacts from a WSDL file.

usage: org.jboss.ws.tools.cmd.WSConsume [options] <wsdl-url>

options:
    -h, --help                  Show this help message
    -b, --binding=<file>        One or more JAX-WS or Java XML Binding files
    -k, --keep                  Keep/Generate Java source
    -c  --catalog=<file>        Oasis XML Catalog file for entity resolution
    -p  --package=<name>        The target package for generated source
    -w  --wsdlLocation=<loc>    Value to use for @WebService.wsdlLocation
    -o, --output=<directory>    The directory to put generated artifacts
    -s, --source=<directory>    The directory to put Java source
    -t, --target=<2.0|2.1|2.2>  The JAX-WS target
    -q, --quiet                 Be somewhat more quiet
    -v, --verbose               Show full exception stack traces
    -l, --load-consumer         Load the consumer and exit (debug utility)
    -e, --extension             Enable SOAP 1.2 binding extension
    -a, --additionalHeaders     Enable processing of implicit SOAP headers
    -n, --nocompile             Do not compile generated sources

以下のコマンドは、出力に一覧表示されている .java ファイルを ProfileMgmtService.wsdl ファイルから生成します。ソースは、-p スイッチで指定されたパッケージのディレクトリー構造を使用します。

[user@host bin]$ wsconsume.sh -k -p org.jboss.test.ws.jaxws.samples.retail.profile ProfileMgmtService.wsdl
output/org/jboss/test/ws/jaxws/samples/retail/profile/Customer.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/package-info.java
output/org/jboss/test/ws/jaxws/samples/retail/profile/Customer.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountRequest.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/DiscountResponse.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ObjectFactory.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmt.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/ProfileMgmtService.class
output/org/jboss/test/ws/jaxws/samples/retail/profile/package-info.class

.java ソースファイルとコンパイルされた .class ファイルはどちらも、コマンドを実行するディレクトリー内の output/ ディレクトリーに生成されます。

Expand
表3.3 wsconsume.sh で作成されるアーティファクトの説明
ファイル説明

ProfileMgmt.java

サービスエンドポイントインターフェース。

Customer.java

カスタムデータタイプ。

Discount.java

カスタムデータタイプ。

ObjectFactory.java

JAXB XML レジストリー。

package-info.java

JAXB パッケージのアノテーション。

ProfileMgmtService.java

サービスファクトリー。

wsconsume コマンドは、すべてのカスタムデータタイプ (JAXB アノテーションが付けられたクラス)、サービスエンドポイントインターフェース、およびサービスファクトリークラスを生成します。これらのアーティファクトは、Web サービスクライアントの実装をビルドするために使用されます。

サービススタブの構成

Web サービスクライアントはサービススタブを使用して、リモート Web サービス呼び出しの詳細を抽象化します。クライアントアプリケーションの場合、Web サービスの呼び出しは他のビジネスコンポーネントの呼び出しと同様になります。この場合、サービスエンドポイントインターフェースはビジネスインターフェースとして機能し、サービスファクトリークラスはサービススタブとしての構築に使用されません。

以下の例では、まずは WSDL の場所とサービス名を使用してサービスファクトリーを作成します。次に、 wsconsume により作成されたサービスエンドポイントインターフェースを使用してサービススタブを構築します。最後に、スタブは他のビジネスインターフェースと同様に使用できます。

JBoss EAP 管理コンソールでは、エンドポイントの WSDL URL を確認できます。この URL を見つけるには、Runtime に移動して、該当するサーバーを選択し、Webservicesを 選択してエンドポイントを選択します。

import javax.xml.ws.Service;
[...]
Service service = Service.create(
new URL("http://example.org/service?wsdl"),
new QName("MyService")
);
ProfileMgmt profileMgmt = service.getPort(ProfileMgmt.class);

// Use the service stub in your application

3.3.2. JAX-WS クライアントアプリケーションの開発

クライアントは Java Enterprise Edition 7 コンテナーにデプロイされた JAX-WS エンドポイントと通信し、そこから要求を行います。以下のクラス、メソッド、およびその他の実装の詳細は、JBoss EAP に含まれる Javadocs バンドルの関連セクションを参照してください。

概要

Service は、WSDL サービスを表す抽象化です。WSDL サービスは、一連の関連ポートです。それぞれには、特定のプロトコルとエンドポイントアドレスに結合したポートタイプが含まれます。

通常、サービスの生成は、残りのコンポーネントのスタブが、既存の WSDL コントラクトから生成されると行われます。WSDL コントラクトは、デプロイされたエンドポイントの WSDL URL 経由で利用できます。または、EAP_HOME/bin/ ディレクトリーの wsprovide ツールを使用してエンドポイントソースから作成できます。

このタイプの使用は、静的なユースケースと呼ばれます。この場合、コンポーネントのスタブのいずれかとして作成された Service クラスのインスタンスを作成します。

Service.create メソッドを使用してサービスを手動で作成することもできます。これは、動的なユースケースと呼ばれます。

使用方法
静的ユースケース

JAX-WS クライアントの静的ユースケースでは、すでに WSDL コントラクトが存在することを前提としています。これは外部ツールで生成されるか、JAX-WS エンドポイントの作成時に適切な JAX-WS アノテーションを使用して生成される可能性があります。

コンポーネントのスタブを生成するには、EAP_HOME/bin に含まれる wsconsume ツールを使用します。このツールは、コンテナー URL またはファイルをパラメーターとして取り、ディレクトリーツリーで構造化された複数のファイルを生成します。Service を表すソースおよびクラスファイルはそれぞれ _Service.java_Service.class です。

生成された実装クラスには、引数のないパブリックコンストラクターと、2 つの引数を持つコンストラクターがあります。これら 2 つの引数はそれぞれ WSDL の場所 (java.net.URL) とサービス名 (javax.xml.namespace.QName) を表します。

引数なしのコンストラクターは最もよく使用されます。この場合、WSDL の場所とサービス名は WSDL にあるものです。これらは、生成されたクラスをデコレートする @WebServiceClient アノテーションから暗黙的に設定されます。

@WebServiceClient(name="StockQuoteService", targetNamespace="http://example.com/stocks", wsdlLocation="http://example.com/stocks.wsdl")
public class StockQuoteService extends javax.xml.ws.Service
{
   public StockQuoteService() {
      super(new URL("http://example.com/stocks.wsdl"), new QName("http://example.com/stocks", "StockQuoteService"));
   }

   public StockQuoteService(String wsdlLocation, QName serviceName) {
      super(wsdlLocation, serviceName);
   }
   ...
}

サービスからポートを取得する方法と、ポートでの操作の呼び出し方法に関する詳細は、Dynamic Proxy を参照してください。XML ペイロードを直接使用するか、SOAP メッセージ全体の XML 表現を使用する方法は、Dispatch を参照してください。

動的ユースケース

動的の場合、スタブは自動的に生成されません。代わりに、Web サービスクライアントは Service.create メソッドを使用して Service インスタンスを作成します。以下のコードはこのプロセスを示しています。

URL wsdlLocation = new URL("http://example.org/my.wsdl");
QName serviceName = new QName("http://example.org/sample", "MyService");
Service service = Service.create(wsdlLocation, serviceName);
ハンドラー解決

JAX-WS は、ハンドラーと呼ばれるメッセージ処理モジュールに柔軟なプラグインフレームワークを提供します。これらのハンドラーは JAX-WS ランタイムシステムの機能を拡張します。Service インスタンスは、getHandlerResolversetHandlerResolver メソッドのペア経由で HandlerResolver へのアクセスを提供し、サービス別、ポート別、またはプロトコル別のバインディングベースでハンドラーのセットを設定することができます。

Service インスタンスでプロキシーまたは Dispatch インスタンスを作成すると、現在サービスに登録されているハンドラーリゾルバーが必要なハンドラーチェーンを作成します。Service インスタンスに設定されたハンドラーリゾルバーへの変更は、以前に作成されたプロキシーまたは Dispatch インスタンスでのハンドラーには影響を与えません。

Executor

Service インスタンスは、java.util.concurrent.Executor を使用して設定できます。Executor は、アプリケーションによってリクエストされた非同期コールバックを呼び出します。ServicesetExecutor および getExecutor メソッドは、サービスに設定された Executor を変更および取得できます。

動的プロキシー

動的プロキシーは、Service で提供される getPort メソッドのいずれかを使用するクライアントプロキシーのインスタンスです。portName は、サービスが使用する WSDL ポートの名前を指定します。serviceEndpointInterface は、作成された動的プロキシーインスタンスでサポートされるサービスエンドポイントインターフェースを指定します。

public <T> T getPort(QName portName, Class<T> serviceEndpointInterface)
public <T> T getPort(Class<T> serviceEndpointInterface)

Service Endpoint Interface は通常 wsconsume ツールを使用して生成されます。これは、WSDL を解析し、そこから Java クラスを作成します。

ポートを返す、タイプ指定されたメソッドも提供されます。これらのメソッドは、SEI を実装する動的プロキシーも返します。以下の例を参照してください。

@WebServiceClient(name = "TestEndpointService", targetNamespace = "http://org.jboss.ws/wsref",
   wsdlLocation = "http://localhost.localdomain:8080/jaxws-samples-webserviceref?wsdl")

public class TestEndpointService extends Service {
    ...

    public TestEndpointService(URL wsdlLocation, QName serviceName) {
        super(wsdlLocation, serviceName);
    }

    @WebEndpoint(name = "TestEndpointPort")
    public TestEndpoint getTestEndpointPort() {
        return (TestEndpoint)super.getPort(TESTENDPOINTPORT, TestEndpoint.class);
    }
}
@WebServiceRef

@WebServiceRef アノテーションは Web サービスへの参照を宣言します。これは、JSR 250 で定義された javax.annotation.Resource アノテーションによって示されるリソースパターンに従います。これらのアノテーションの Jakarta EE と同等の Jakarta EE は、Jakarta Annotations 1.3 仕様 に含まれています。

  • これを使用して、生成される Service クラスであるタイプのリファンレスを定義できます。この例では、type および value 要素はそれぞれ、生成された Service クラスタイプを参照します。さらに、リファンレンスタイプがアノテーションが適用されるフィールドまたはメソッド宣言によって推定される場合、type および value 要素にはデフォルト値の Object.classが設定されることがあります。これは必須ではありません。タイプを推定できない場合、type 要素がデフォルト以外の値を持つ必要があります。
  • これは、タイプが SEI のリファンレスを定義するのに使用できます。この場合、リファレンスのタイプが annotated フィールドまたは method 宣言から推測される場合、type 要素はデフォルト値で存在することがあります (ただし、必須ではありません)。ただし、value 要素は常に存在し、javax.xml.ws.Service ファイルのサブタイプである、生成されたサービスクラスタイプを参照する必要があります。wsdlLocation 要素が存在する場合は、参照される生成サービスクラスの @WebService アノテーションで指定された WSDL の場所情報を上書きします。

    public class EJB3Client implements EJB3Remote
    {
       @WebServiceRef
       public TestEndpointService service4;
    
       @WebServiceRef
       public TestEndpoint port3;
     }
Dispatch

XML Web サービスは、Java EE コンテナーおよびすべてのクライアントにデプロイされる、エンドポイント間の通信に XML メッセージを使用します。XML メッセージは、Simple Object Access Protocol (SOAP) と呼ばれる XML 言語を使用します。JAX-WS API は、エンドポイントとクライアントのメカニズムを提供し、各エンドポイントが SOAP メッセージを送受信できるようにします。マーシャリングは、Java オブジェクトを SOAP XML メッセージに変換するプロセスです。マーシャリング解除とは、SOAP XML メッセージを Java オブジェクトに変換するプロセスのことです。

変換の結果ではなく、raw SOAP メッセージ自体にアクセスする必要がある場合があります。Dispatch クラスはこの機能を提供します。Dispatch は、以下の定数のいずれかによって識別される、2 つの使用モードのいずれかで動作します。

  • javax.xml.ws.Service.Mode.MESSAGE: このモードは、クライアントアプリケーションがプロトコル固有のメッセージ構造で直接動作するようにします。SOAP プロトコルバインディングを使用すると、クライアントアプリケーションは SOAP メッセージで直接機能します。
  • javax.xml.ws.Service.Mode.PAYLOAD: このモードでは、クライアントがペイロード自体と動作します。たとえば、SOAP プロトコルバインディングと使用すると、クライアントアプリケーションは SOAP メッセージ全体ではなく SOAP ボディーのコンテンツで動作します。

Dispatch は低レベルの API で、クライアントはメッセージまたはペイロードを XML として構成する必要があります。これは、個別のプロトコルの標準と、メッセージまたはペイロード構造の詳細な知識とメッセージに忠実に従った状態を意味します。Dispatch は、メッセージの入出力または、任意のタイプのメッセージペイロードに対応した汎用クラスです。

Service service = Service.create(wsdlURL, serviceName);
Dispatch dispatch = service.createDispatch(portName, StreamSource.class, Mode.PAYLOAD);

String payload = "<ns1:ping xmlns:ns1='http://oneway.samples.jaxws.ws.test.jboss.org/'/>";
dispatch.invokeOneWay(new StreamSource(new StringReader(payload)));

payload = "<ns1:feedback xmlns:ns1='http://oneway.samples.jaxws.ws.test.jboss.org/'/>";
Source retObj = (Source)dispatch.invoke(new StreamSource(new StringReader(payload)));
非同期呼び出し

BindingProvider インターフェースは、クライアントが使用できるプロトコルバインディングを提供するコンポーネントを表します。これはプロキシーによって実装され、Dispatch インターフェースによって拡張されます。

BindingProvider インスタンスは非同期操作機能を提供する可能性があります。非同期操作の呼び出しは、呼び出し時に BindingProvider インスタンスから切り離されます。操作が完了しても、応答コンテキストは更新されません。代わりに、Response インターフェースを使用して個別の応答コンテキストを利用できます。

public void testInvokeAsync() throws Exception {
   URL wsdlURL = new URL("http://" + getServerHost() + ":8080/jaxws-samples-asynchronous?wsdl");
   QName serviceName = new QName(targetNS, "TestEndpointService");
   Service service = Service.create(wsdlURL, serviceName);
   TestEndpoint port = service.getPort(TestEndpoint.class);
   Response response = port.echoAsync("Async");
   // access future
   String retStr = (String) response.get();
   assertEquals("Async", retStr);
}
@oneway 呼び出し

@oneway アノテーションは、指定の web メソッドが入力メッセージを取得し、出力メッセージを返しないことを示します。通常、@Oneway メソッドは、ビジネスメソッドの実行前に、制御のスレッドを呼び出しアプリケーションに戻します。

@WebService (name="PingEndpoint")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class PingEndpointImpl {
   private static String feedback;

   @WebMethod
   @Oneway
   public void ping() {
      log.info("ping");
      feedback = "ok";
   }

   @WebMethod
   public String feedback() {
      log.info("feedback");
      return feedback;
   }
}
タイムアウトの設定

2 種類のプロパティーが HTTP 接続のタイムアウトの動作と、メッセージの受信を待機しているクライアントのタイムアウトを制御します。最初のプロパティーは、javax.xml.ws.client.connectionTimeout で、次のプロパティーは、javax.xml.ws.client.receiveTimeout です。それぞれはミリ秒単位で示され、正しい構文を以下に示します。

public void testConfigureTimeout() throws Exception {
   //Set timeout until a connection is established
   ((BindingProvider)port).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "6000");

   //Set timeout until the response is received
   ((BindingProvider) port).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000");

   port.echo("testTimeout");
}

3.4. Web Services サブシステムの設定

JBossWS コンポーネントは Web サービスエンドポイントの処理を処理し、webservices サブシステムを介して JBoss EAP に提供されます。サブシステムは、パブリッシュされたエンドポイントアドレスおよびエンドポイントハンドラーチェーンの設定をサポートします。

デフォルトの webservices サブシステムはサーバーのドメインおよびスタンドアロン設定ファイルで提供されます。これには、事前定義されたエンドポイントおよびクライアント設定が複数含まれます。

<subsystem xmlns="urn:jboss:domain:webservices:2.0">
  <wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
  <endpoint-config name="Standard-Endpoint-Config"/>
  <endpoint-config name="Recording-Endpoint-Config">
    <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
      <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
    </pre-handler-chain>
  </endpoint-config>
  <client-config name="Standard-Client-Config"/>
</subsystem>

3.4.1. エンドポイント設定

JBossWS では、追加の設定データを事前定義し、エンドポイント実装に関連付けることができます。事前定義されたエンドポイント設定は JAX-WS クライアントおよび JAX-WS エンドポイントの設定に使用できます。エンドポイント設定には JAX-WS ハンドラーとキー/値のプロパティー宣言を含めることができます。この機能は、ハンドラーを Web サービスのエンドポイントに追加し、JBossWS および Apache CXF 内部を制御する key/value プロパティーを設定する便利な方法を提供します。

webservices サブシステムを使用すると、エンドポイント設定データの名前付きセットを定義できます。各エンドポイント設定にはサブシステム内で一意な名前を付ける必要があります。その後、org.jboss.ws.api.annotation.EndpointConfig アノテーションを使用して、デプロイされたプリケーションの JAX-WS 実装にエンドポイント設定を割り当てることができます。エンドポイント設定の割り当ての詳細は、Assigning a Configuration を参照してください。

デフォルトの JBoss EAP 設定には、事前定義されたエンドポイント設定があります。

  • Standard-Endpoint-Config は、明示的に割り当てられたエンドポイント設定のないエンドポイントに使用されるエンドポイント設定です。
  • Recording-Endpoint-Config は、録画ハンドラーを含むカスタムエンドポイント設定の例になります。
エンドポイント設定の追加

管理 CLI を使用して新しいエンドポイント設定を追加できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config:add
エンドポイント設定の構成

管理 CLI を使用してエンドポイント設定の key/value プロパティー宣言を追加できます。

/subsystem=webservices/endpoint-config=Standard-Endpoint-Config/property=PROPERTY_NAME:add(value=PROPERTY_VALUE)

これらのエンドポイント設定のhandler chains および handlers を設定できます。

エンドポイント設定の削除

管理 CLI を使用してエンドポイント設定を削除できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config:remove

3.4.2. ハンドラーチェーン

各エンドポイント設定は PRE または POST ハンドラーチェーンに関連付けることができます。各ハンドラーチェーンには JAX-WS 準拠のハンドラーが含まれ、メッセージに対して追加の処理を実行できます。アウトバウンドメッセージの場合、PRE ハンドラーチェーンハンドラーは、@HandlerChain アノテーションなどの標準の JAX-WS を使用してエンドポイントにアタッチされたハンドラーの前に実行されます。POST ハンドラーチェーンハンドラーは、通常のエンドポイントハンドラーの後に実行されます。受信メッセージには、逆が適用されます。

サーバーアウトバウンドメッセージ

Endpoint --> PRE Handlers --> Endpoint Handlers --> POST Handlers --> ... --> Client

サーバーインバウンドメッセージ

Client --> ... --> POST Handlers --> Endpoint Handlers --> PRE Handlers --> Endpoint

ハンドラーチェーンの追加

以下の管理 CLI コマンドを使用すると、POST ハンドラーチェーンをエンドポイント設定に追加できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain:add

以下の管理 CLI コマンドを使用すると、PRE ハンドラーチェーンをエンドポイント設定に追加できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/pre-handler-chain=my-pre-handler-chain:add
ハンドラーチェーンの設定

protocol-bindings 属性を使用して、ハンドラーチェーンの開始をトリガーするプロトコルを設定します。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain:write-attribute(name=protocol-bindings,value=##SOAP11_HTTP)

ハンドラーチェーンのハンドラーの設定に関する詳細は、ハンドラーのセクションを参照してください。

ハンドラーチェーンの削除

管理 CLI を使用してハンドラーチェーンを削除できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain:remove

3.4.3. ハンドラー

JAX-WS ハンドラーがハンドラーチェーンに追加され、ハンドラークラスの完全修飾名を指定します。エンドポイントがデプロイされると、参照デプロイメントごとにそのクラスのインスタンスが作成されます。org.jboss.as.webservices.server.integration モジュールのデプロイメントクラスローダーまたはクラスローダーのいずれかがハンドラークラスをロードできる必要があります。

利用可能なハンドラーの一覧は ハンドラー Javadoc を参照してください。

ハンドラーの追加

以下の管理 CLI コマンドを使用するとハンドラーをハンドラーチェーンに追加できます。ハンドラーのクラス名を指定する必要があります。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain/handler=my-handler:add(class="com.arjuna.webservices11.wsarj.handler.InstanceIdentifierInHandler")
ハンドラーの設定

管理 CLI を使用してハンドラーのクラスを更新できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain/handler=my-handler:add(class="org.jboss.ws.common.invocation.RecordingServerHandler")
ハンドラーの削除

管理 CLI を使用してハンドラーを削除できます。

/subsystem=webservices/endpoint-config=My-Endpoint-Config/post-handler-chain=my-post-handler-chain/handler=my-handler:

3.4.4. 公開されたエンドポイントアドレス

WSDL コントラクトで公開されるエンドポイントの <soap:address> 要素の書き換えがサポートされます。この機能は、各エンドポイントのクライアントに公開されるサーバーアドレスを制御するのに役立ちます。

以下の表は、この機能に設定できる属性を表しています。

Expand
名前説明

modify-wsdl-address

このブール値は、アドレスのリライト機能を有効化・無効化します。

modify-wsdl-addresstrue に設定され、<soap:address> の内容が有効な URL の場合、JBossWS は wsdl-host および wsdl-port または wsdl-secure-port の値を使用して URL を再書き込みします。

modify-wsdl-addressfalse に設定され、<soap:address> の内容が有効な URL の場合、JBossWS は URL を再書き込みしません。<soap:address> URL が使用されます。

<soap:address> の内容が有効な URL ではない場合、JBossWS は modify-wsdl-address の設定に関係なく書き直します。modify-wsdl-addresstrue に設定され、wsdl-host が定義されていないか、または jbossws.undefined.host に明示的に設定されている場合、<soap:address> URL の内容が使用されます。JBossWS は <soap:address> の書き換え時にリクエスターのホストを使用します。

modify-wsdl-address が定義されていない場合、JBossWS はデフォルト値の true を使用します。

wsdl-host

<soap:address> の書き換えに使用するホスト名または IP アドレス。wsdl-hostjbossws.undefined.host に設定されている場合、JBossWS は <soap:address> の書き換え時にリクエスターのホストを使用します。wsdl-host が定義されていない場合、JBossWS はデフォルト値の jbossws.undefined.host を使用します。

wsdl-path-rewrite-rule

この文字列は、サーバーから公開される各 <soap:address> URL のパスコンポーネントに対して JBossWS が実行される s/regexp/replacement/g などの SED の代コマンドを定義します。wsdl-path-rewrite-rule が定義されていない場合、JBossWS は各 <soap:address> URL の元のパスコンポーネントを保持します。Modify-ogg-addressfalse に設定されている場合、この要素は無視されます。

wsdl-port

SOAP アドレスの書き換えに使用される HTTP ポートを明示的に定義するには、このプロパティーを設定します。それ以外の場合は、インストールされた HTTP コネクターのリストをクエリーして HTTP ポートを特定します。

wsdl-secure-port

SOAP アドレスの書き換えに使用される HTTPS ポートを明示的に定義するには、このプロパティーを設定します。そうでない場合は、インストールされた HTTPS コネクターのリストをクエリーして HTTPS ポートを特定します。

wsdl-uri-scheme

このプロパティーは、<soap:address> の書き換えに使用する URI スキームを明示的に設定します 。有効な値は http および https です。この設定により、トランスポート保証が指定されている場合でも、エンドポイントの処理によって計算されたスキームが上書きされます。wsdl-port および wsdl-secure-port の指定の値、またはそのデフォルト値は、指定されたスキームによって異なります。

管理 CLI を使用してこれらの属性を更新できます。例を以下に示します。

/subsystem=webservices:write-attribute(name=wsdl-uri-scheme, value=https)

3.4.5. ランタイム情報の表示

各 Web サービスエンドポイントは、エンドポイント実装を提供するデプロイメントで公開されます。各エンドポイントはデプロイメントリソースとしてクエリーできます。各 Web サービスのエンドポイントは、Web コンテキストと WSDL URL を指定します。管理 CLI または管理コンソールを使用してこのランタイム情報にアクセスできます。

以下の管理 CLI コマンドは、jaxws-samples-handlerchain.war デプロイメントからの TestService エンドポイントの詳細を表示します。

/deployment="jaxws-samples-handlerchain.war"/subsystem=webservices/endpoint="jaxws-samples-handlerchain:TestService":read-resource(include-runtime=true)
{
    "outcome" => "success",
    "result" => {
        "average-processing-time" => 23L,
        "class" => "org.jboss.test.ws.jaxws.samples.handlerchain.EndpointImpl",
        "context" => "jaxws-samples-handlerchain",
        "fault-count" => 0L,
        "max-processing-time" => 23L,
        "min-processing-time" => 23L,
        "name" => "TestService",
        "request-count" => 1L,
        "response-count" => 1L,
        "total-processing-time" => 23L,
        "type" => "JAXWS_JSE",
        "wsdl-url" => "http://localhost:8080/jaxws-samples-handlerchain?wsdl"
    }
}
注記

read-resource 操作で include-runtime=true フラグを使用すると、ランタイム統計が返されます。ただし、Web サービスエンドポイントの統計収集はデフォルトで無効にされています。以下の管理 CLI コマンドを使用すると、Web サービスエンドポイントの統計を有効にできます。

/subsystem=webservices:write-attribute(name=statistics-enabled,value=true)

管理コンソールの Runtime タブから、Web サービスエンドポイントのランタイム情報を表示することもできます。そのためには、該当するサーバーを選択し、Webservices を選択してエンドポイントを選択します。

3.5. クライアントおよびエンドポイント設定の割り当て

クライアントおよびエンドポイント設定は以下の方法で割り当てることができます。

  • クライアントに対するアノテーション、エンドポイント、または API プログラムによる使用による明示的な割り当て。
  • デフォルト記述子からの設定の自動割り当て。
  • コンテナーからの設定の自動割り当て。

3.5.1. 明示的な設定の割り当て

明示的な設定割り当ては、指定の設定に従ってセットアップされる必要のあるエンドポイントまたはクライアントを開発者が事前に認識するためのものです。この設定は、アプリケーションデプロイメントに含まれる記述子か、または webservices サブシステムに含まれます。

3.5.1.1. 設定デプロイメント記述子

JAX-WS クライアントおよびエンドポイント実装を含むことができる Java EE アーカイブには、事前定義のクライアントおよびエンドポイント設定宣言が含まれる可能性があります。すべてのエンドポイントまたは特定のアーカイブのクライアント設定定義は、単一のデプロイメント記述子ファイルに提供する必要があります。これは、EAP_HOME/docs/schema/jbossws-jaxws-config_4_0.xsd にあるスキーマの実装である必要があります。デプロイメント記述子ファイルには、多くのエンドポイントまたはクライアント設定を定義できます。各設定には、アプリケーションがデプロイされるサーバー内で一意の名前が必要です。設定名は、アプリケーション外のエンドポイントまたはクライアント実装で参照することはできません。

例: 2 つのエンドポイント設定を持つ記述子

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd">
  <endpoint-config>
    <config-name>org.jboss.test.ws.jaxws.jbws3282.Endpoint4Impl</config-name>
    <pre-handler-chains>
      <javaee:handler-chain>
        <javaee:handler>
          <javaee:handler-name>Log Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.jbws3282.LogHandler</javaee:handler-class>
        </javaee:handler>
      </javaee:handler-chain>
    </pre-handler-chains>
    <post-handler-chains>
      <javaee:handler-chain>
        <javaee:handler>
          <javaee:handler-name>Routing Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.jbws3282.RoutingHandler</javaee:handler-class>
        </javaee:handler>
      </javaee:handler-chain>
    </post-handler-chains>
  </endpoint-config>
  <endpoint-config>
    <config-name>EP6-config</config-name>
    <post-handler-chains>
      <javaee:handler-chain>
        <javaee:handler>
          <javaee:handler-name>Authorization Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.jbws3282.AuthorizationHandler</javaee:handler-class>
        </javaee:handler>
      </javaee:handler-chain>
    </post-handler-chains>
  </endpoint-config>
</jaxws-config>

同様に、クライアント設定は記述子に指定できます。これは前述のスキーマを実装しています。

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd">
  <client-config>
    <config-name>Custom Client Config</config-name>
    <pre-handler-chains>
      <javaee:handler-chain>
        <javaee:handler>
          <javaee:handler-name>Routing Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.clientConfig.RoutingHandler</javaee:handler-class>
        </javaee:handler>
        <javaee:handler>
          <javaee:handler-name>Custom Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.clientConfig.CustomHandler</javaee:handler-class>
        </javaee:handler>
      </javaee:handler-chain>
    </pre-handler-chains>
  </client-config>
  <client-config>
    <config-name>Another Client Config</config-name>
    <post-handler-chains>
      <javaee:handler-chain>
        <javaee:handler>
          <javaee:handler-name>Routing Handler</javaee:handler-name>
          <javaee:handler-class>org.jboss.test.ws.jaxws.clientConfig.RoutingHandler</javaee:handler-class>
        </javaee:handler>
      </javaee:handler-chain>
    </post-handler-chains>
  </client-config>
</jaxws-config>

3.5.1.2. アプリケーションサーバー設定

JBoss EAP では、webservices サブシステムで JBossWS クライアントおよびサーバーの事前定義設定を宣言できます。そのため、サーバー全体のハンドラーを宣言して、特定の設定に割り当てられた各エンドポイントまたはクライアントのチェーンに追加することができます。

標準設定

同じ JBoss EAP インスタンスおよびエンドポイントで実行されているクライアントには、デフォルトで標準設定が割り当てられます。異なる設定が構成されていない限り、デフォルトが使用されます。これにより、管理者はクライアントおよびエンドポイント設定のデフォルトのハンドラーチェーンを調整することができます。webservices サブシステムで使用されるデフォルトのクライアントおよびエンドポイント設定の名前は、Standard-Client-Config および Standard-Endpoint-Config です。

ハンドラーのクラスロード

サーバー全体のハンドラーを設定する場合、ハンドラークラスは各 ws デプロイメントクラスローダーで利用可能である必要があります。そのため、特定の事前に定義された設定を使用するデプロイメントで適切なモジュール依存関係を指定する必要がある場合があります。適切なモジュール依存関係がデプロイメントで指定されるようにする方法として、org.jboss.ws.spi などのデプロイメントに対する依存関係として自動的に設定されるいずれかのモジュールのハンドラークラスを含むモジュールに依存関係を追加します。

設定例:

例: デフォルトのサブシステム設定

<subsystem xmlns="urn:jboss:domain:webservices:2.0">
    <!-- ... -->
    <endpoint-config name="Standard-Endpoint-Config"/>
    <endpoint-config name="Recording-Endpoint-Config">
        <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
            <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
        </pre-handler-chain>
    </endpoint-config>
    <client-config name="Standard-Client-Config"/>
</subsystem>

デプロイメント固有の ws-security エンドポイントセットアップの設定ファイル:

<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:javaee="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_0.xsd">
  <endpoint-config>
    <config-name>Custom WS-Security Endpoint</config-name>
    <property>
      <property-name>ws-security.signature.properties</property-name>
      <property-value>bob.properties</property-value>
    </property>
    <property>
      <property-name>ws-security.encryption.properties</property-name>
      <property-value>bob.properties</property-value>
    </property>
    <property>
      <property-name>ws-security.signature.username</property-name>
      <property-value>bob</property-value>
    </property>
    <property>
      <property-name>ws-security.encryption.username</property-name>
      <property-value>alice</property-value>
    </property>
    <property>
      <property-name>ws-security.callback-handler</property-name>
      <property-value>org.jboss.test.ws.jaxws.samples.wsse.policy.basic.KeystorePasswordCallback</property-value>
    </property>
  </endpoint-config>
</jaxws-config>

JBoss EAP のデフォルト設定は以下で SOAP メッセージの schema-validation にデフォルト設定変更されました。

<subsystem xmlns="urn:jboss:domain:webservices:2.0">
    <!-- ... -->
    <endpoint-config name="Standard-Endpoint-Config">
        <property name="schema-validation-enabled" value="true"/>
    </endpoint-config>
    <!-- ... -->
    <client-config name="Standard-Client-Config">
        <property name="schema-validation-enabled" value="true"/>
    </client-config>
</subsystem>

3.5.1.3. EndpointConfig アノテーション

任意のアプリケーションで設定が利用可能になるとorg.jboss.ws.api.annotation.EndpointConfig アノテーションを使用してエンドポイント設定を JAX-WS エンドポイント実装に割り当てます。webservices サブシステムに定義された設定を割り当てる場合は、設定名のみを指定する必要があります。アプリケーションに定義されている設定を割り当てる場合は、デプロイメント記述子への相対パスと設定名を指定する必要があります。

例: EndpointConfig アノテーション

@EndpointConfig(configFile = "WEB-INF/my-endpoint-config.xml", configName = "Custom WS-Security Endpoint")
public class ServiceImpl implements ServiceIface {
   public String sayHello() {
      return "Secure Hello World!";
   }
}

3.5.1.4. JAX-WS 機能

org.jboss.ws.api.configuration.ClientConfigFeature を使用することで JBossWS が提供する JAX-WS Feature 拡張の設定を行うこともできます。

import org.jboss.ws.api.configuration.ClientConfigFeature;

Service service = Service.create(wsdlURL, serviceName);

Endpoint port = service.getPort(Endpoint.class, new ClientConfigFeature("META-INF/my-client-config.xml", "Custom Client Config"));
port.echo("Kermit");

また、trueClientConfigFeature コンストラクターに渡すことで、指定された設定からプロパティーを設定することもできます。

Endpoint port = service.getPort(Endpoint.class, new ClientConfigFeature("META-INF/my-client-config.xml", "Custom Client Config"), true);

JBossWS は、現在のスレッドコンテキストクラスローダーを使用してリソースとして解決した後、指定された設定ファイルを解析します。EAP_HOME/docs/schema/jbossws-jaxws-config_4_0.xsd スキーマは記述子の内容を定義し、jbossws-spi アーティファクトに含まれます。

設定ファイルの null を渡すと、利用可能な場合に、現在のコンテナー設定から設定が読み込まれます。

Endpoint port = service.getPort(Endpoint.class, new ClientConfigFeature(null, "Container Custom Client Config"));

3.5.1.5. API での明示的なセットアップ

または、JBossWS API にはクライアントのビルド時に設定の割り当てに使用できるファシリティークラスが含まれています。

ハンドラー

JAX-WS ハンドラーは、以下のようにクライアント設定から読み込まれます。

import org.jboss.ws.api.configuration.ClientConfigUtil;
import org.jboss.ws.api.configuration.ClientConfigurer;

Service service = Service.create(wsdlURL, serviceName);
Endpoint port = service.getPort(Endpoint.class);
BindingProvider bp = (BindingProvider)port;

ClientConfigurer configurer = ClientConfigUtil.resolveClientConfigurer();
configurer.setConfigHandlers(bp, "META-INF/my-client-config.xml", "Custom Client Config");
port.echo("Kermit");

ClientConfigUtil ユーティリティークラスを使用してハンドラーを設定することもできます。

ClientConfigUtil.setConfigHandlers(bp, "META-INF/my-client-config.xml", "Custom Client Config");

デフォルトの ClientConfigurer 実装は、現在のスレッドコンテキストクラスローダーを使用してリソースとして解決した後、指定された設定ファイルを解析します。EAP_HOME/docs/schema/jbossws-jaxws-config_4_0.xsd スキーマは記述子の内容を定義し、jbossws-spi アーティファクトに含まれます。

設定ファイルの null を渡すと、利用可能な場合に、現在のコンテナー設定から設定が読み込まれます。

ClientConfigurer configurer = ClientConfigUtil.resolveClientConfigurer();
configurer.setConfigHandlers(bp, null, "Container Custom Client Config");
プロパティー

同様に、プロパティーは以下のようにクライアント設定から読み込まれます。

import org.jboss.ws.api.configuration.ClientConfigUtil;
import org.jboss.ws.api.configuration.ClientConfigurer;

Service service = Service.create(wsdlURL, serviceName);
Endpoint port = service.getPort(Endpoint.class);

ClientConfigUtil.setConfigProperties(port, "META-INF/my-client-config.xml", "Custom Client Config");
port.echo("Kermit");

ClientConfigUtil ユーティリティークラスを使用してプロパティーを設定することもできます。

ClientConfigurer configurer = ClientConfigUtil.resolveClientConfigurer();
configurer.setConfigProperties(port, "META-INF/my-client-config.xml", "Custom Client Config");

デフォルトの ClientConfigurer 実装は、現在のスレッドコンテキストクラスローダーを使用してリソースとして解決した後、指定された設定ファイルを解析します。EAP_HOME/docs/schema/jbossws-jaxws-config_4_0.xsd スキーマは記述子の内容を定義し、jbossws-spi アーティファクトに含まれます。

設定ファイルの null を渡すと、利用可能な場合に、現在のコンテナー設定から設定が読み込まれます。

ClientConfigurer configurer = ClientConfigUtil.resolveClientConfigurer();
configurer.setConfigProperties(port, null, "Container Custom Client Config");

3.5.2. デフォルト記述子からの自動設定

アプリケーション開発者は、クライアントおよびエンドポイントの実装に使用する必要がある設定を認識していない場合があります。その他の場合は、コンパイルタイム依存関係であるため、JBossWS API の明示的な使用が許可されない可能性があります。このようなシナリオに対応するため、JBossWS ではデフォルトのクライアント、jaxws-client-config.xml、およびエンドポイント、jaxws-endpoint-config.xml、記述子をルートディレクトリー内のアプリケーションに含めることができます。これらは、設定ファイル名が指定されていない場合に設定を取得するために解析されます。

<config-file>WEB-INF/jaxws-endpoint-config.xml</config-file>

設定名が指定されていない場合、JBossWS は以下のようにという名前の設定を自動的に検索します。

  • JAX-WS エンドポイントの場合、エンドポイント実装クラスの完全修飾名 (FQN)。
  • JAX-WS クライアントの場合、サービスエンドポイントインターフェースの FQN。

Dispatch クライアントの自動設定名は選択されません。

たとえば、事前設定されていないエンドポイント実装クラス org.foo.bar.EndpointImpl により、JBossWS はアプリケーションデプロイメントのルートで jaxws-endpoint-config.xml 記述子内で org.foo.bar.EndpointImpl という名前の設定を検索します。同様に、クライアント側では、org.foo.bar.Endpoint インターフェースを実装するクライアントプロキシーには、jaxws-client-config.xml 記述子の org.foo.bar.Endpoint という名前の設定からセットアップ読み取りが行われます。

3.5.3. コンテナーからの自動設定割り当て

JBossWS は、明示的な設定が指定されておらず、デフォルトの記述子が利用できないか、または関連する設定を含まない場合に、コンテナーから事前定義された設定を取得するようフォールバックします。この動作により、コンテナーはデプロイされたアプリケーションから独立して管理できるため、JAX-WS クライアントおよびエンドポイントの設定に対する追加の制御が管理者に付与されます。

JBossWS は明示的に名前が付けられた設定の webservices サブシステムにアクセスします。使用されるデフォルト設定名は以下のようになります。

  • JAX-WS エンドポイントの場合、エンドポイント実装クラスの完全修飾名。
  • JAX-WS クライアントの場合は、サービスエンドポイントインターフェースの完全修飾名。

Dispatch クライアントは自動的には設定されません。上記で計算した名前を使用して設定が見つからない場合、Standard-Client-Config および Standard-Endpoint-Config 設定がクライアントとエンドポイントにそれぞれ使用されます。

3.6. Web サービスアプリケーションのモジュール依存関係の設定

JBoss EAP Web サービスは、org.jboss.as.webservices.*org.jboss.ws.* モジュールを含むモジュールおよびライブラリーのセットとして提供されます。これらのモジュールを変更する必要はありません。

JBoss EAP では、対応するモジュールに依存関係を明示的に設定しない限り、直接 JBossWS 実装クラスを使用することはできません。デプロイメントに追加するモジュール依存関係を宣言します。

JBossWS API は、webservices サブシステムが利用可能になるたびにデフォルトで利用可能です。これらのモジュールの明示的な依存関係宣言を作成せずに使用できます。

3.6.1. MANIFEST.MF の使用

デプロイメントの依存関係を設定するには、MANIFEST.MF ファイルに追加します。例を以下に示します。

Manifest-Version: 1.0
Dependencies: org.jboss.ws.cxf.jbossws-cxf-client services export,foo.bar

この MANIFEST.MF ファイルは、org.jboss.ws.cxf.jbossws-cxf-client および foo.bar モジュールの依存関係を宣言します。エクスポート および サービス のオプションなど、MANIFEST.MF ファイルに依存関係を宣言する方法は、JBoss EAP 『開発ガイド』 の「 MANIFEST.MF への依存関係の設定の追加 」を参照してください。

Apache CXF エンドポイントやハンドラーなどのエンドポイントおよびハンドラーでアノテーションを使用する場合は、マニフェストファイルに適切なモジュール依存関係を追加します。この手順を省略すると、アノテーションは選択されず、完全に無視されます。

3.6.1.1. JAXB の使用

インコンテナーを実行しているクライアントまたはエンドポイントで JAXB コンテキストを正常に直接使用するには、JAXB 実装を設定します。たとえば、以下の依存関係を設定します。

Dependencies: com.sun.xml.bind services export

3.6.1.2. Apache CXF の使用

Apache CXF API および実装クラスを使用するには、org.apache.cxf (API) モジュールまたは org.apache.cxf.impl (実装) モジュールに依存関係を追加します。例を以下に示します。

Dependencies: org.apache.cxf services

依存関係は、JBossWS のカスタマイズや追加の拡張がない純粋な Apache CXF です。そのため、クライアント側の集約モジュールは、必要なすべての Web サービスの依存関係で利用できます。

3.6.1.3. クライアント側の Web サービスアグリゲーションモジュール

Web サービスの機能すべてを使用する場合は、便利なクライアントモジュールへの依存関係を設定できます。例を以下に示します。

Dependencies: org.jboss.ws.cxf.jbossws-cxf-client services

JBossWS 固有のクラスをロードしてすべての JBossWS 機能を有効にするには、services オプションが必要です。org.jboss.ws.cxf.jbossws-cxf-client および org.apache.cxf モジュールの依存関係を宣言する場合は、services オプションがほぼ常に必要になります。このオプションは、多くの JBossWS コンポーネントおよび Apache CXF Bus 拡張の接続に使用される Service API でのクラスのロードに影響します。

3.6.1.4. アノテーションのスキャン

アプリケーションサーバーは、ユーザーデプロイメントで JAX-WS エンドポイントを検出するためにアノテーションインデックスを使用します。web.xml 記述子で参照しているなど、異なるモジュールに属するクラスの Web サービスエンドポイントを宣言する場合は、annotations タイプ依存関係を使用します。この依存関係がないと、エンドポイントは webservices サブシステムのアノテーション付きクラスとして表示されないため、無視されます。

Dependencies: my.org annotations

3.6.2. jboss-deployment-structure.xml の使用

状況によっては、MANIFEST.MF ファイルでモジュールの依存関係を設定する便利なアプローチは機能しない場合があります。たとえば、MANIFEST.MF ファイルに依存関係を設定しても、指定のモジュール依存関係から特定のリソースをインポートおよびエクスポートしても機能しません。これらのシナリオでは、jboss-deployment-structure.xml 記述子ファイルをデプロイメントに追加し、そのデプロイメントにモジュール依存関係を設定します。

jboss-deployment-structure.xml の使用に関する詳細は、JBoss EAP 『開発ガイド』 の「 jboss-deployment-structure.xml への依存関係設定の追加 」を参照してください。

3.7. HTTP タイムアウトの設定

HTTP セッションタイムアウトは、指定した期間内にアクティビティーがないため、HTTP セッションが無効とみなされる期間を定義します。

HTTP セッションのタイムアウトは、以下の場所で優先順に設定できます。

  1. アプリケーション

    以下の設定をファイルに追加すると、アプリケーションの web.xml 設定ファイルで HTTP セッションタイムアウトを定義できます。この値は分単位です。

    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>

    WAR ファイルを変更した場合は、アプリケーションを再デプロイします。WAR ファイルを展開する場合、JBoss EAP は自動的にアプリケーションをアンデプロイおよび再デプロイするため、追加のアクションは必要ありません。

  2. サーバー

    以下の管理 CLI コマンドを使用すると、undertow サブシステムでデフォルトの HTTP セッションタイムアウトを設定できます。この値は分単位です。

    /subsystem=undertow/servlet-container=default:write-attribute(name=default-session-timeout,value=30)
  3. デフォルト

    デフォルトの HTTP セッションタイムアウトは 30 分です。

3.8. JAX-WS Web サービスのセキュア化

WS-Security は、HTTPS などのトランスポートレベルプロトコルを超えたサービスを保護する手段を提供します。WS-Security 標準で定義されたヘッダーなど、多くの標準を使用して以下を実行できます。

  • サービス間で認証トークンを渡します。
  • メッセージまたはメッセージの一部を暗号化する。
  • メッセージに署名します。
  • メッセージにタイムスタンプを付けます。

WS-Security は、公開鍵暗号および秘密鍵暗号を使用します。公開鍵暗号により、ユーザーは公開鍵と秘密鍵のペアを持ちます。これらは、高い素数とキー関数を使用して生成されます。

キーは関連するものですが、相互に派生させることはできません。これらの鍵を使用すると、メッセージを暗号化できます。たとえば、Scott が Adam にメッセージを送信する場合は、公開鍵を使用してメッセージを暗号化できます。次に、Adam は秘密鍵を使用してこのメッセージを復号化できます。秘密鍵のある唯一のメッセージであるため、このメッセージは Adam のみが復号化できます。

メッセージは署名することもできます。これにより、メッセージの信頼性を確保できます。Adam が Scott にメッセージを送信し、Scott が Adam からのメッセージであることを確認する必要がある場合、Adam は秘密鍵を使用してそのメッセージを署名できます。Scott は、公開鍵を使用して、メッセージが Adam からのものであることを検証できます。

3.8.1. Web Services Security (WS-Security) の適用

Web サービスは、WS-Security 機能が必要な多くの実際のシナリオをサポートします。これらのシナリオには、X509 証明書による署名および暗号化サポート、ユーザー名トークンによる認証および承認、および WS-SecurityPolicy 仕様でカバーされるすべての WS-Security 設定が含まれます。

その他の WS-* 機能については、WS-Security 機能のコアは Apache CXF エンジンを介して提供されます。さらに、JBossWS 統合では、WS-Security が有効なエンドポイントの設定を簡素化するいくつかの設定拡張が追加されました。

3.8.1.1. Apache CXF WS-Security 実装

Apache CXF は、複数の設定をサポートし、簡単に拡張できる WS-Security モジュールを特長としています。

システムは、低レベルのセキュリティー操作に対して Apache WSS4J に委譲するインターセプターに基づいています。インターセプターは、Spring 設定ファイルを使用するか、Apache CXF クライアント API を使用して直接設定できます。

Apache CXF の最近のバージョンでは、WS-SecurityPolicy のサポートが導入されました。WS-SecurityPolicy は、多くのセキュリティー設定をポリシーを介してサービスコントラクトに移動することを目的としています。これにより、クライアントがほぼ自動的に設定できるようになりました。これにより、ユーザーは必要なインターセプターの設定とインストールを手動で行う必要がなくなります。代わりに、Apache CXF WS-Policy エンジンがこれを行います。

3.8.1.2. WS-Security Policy のサポート

WS-SecurityPolicy は、特定の WSDL コントラクトで公開されるサービスとセキュアに通信するために必要なアクションを説明します。WSDL バインディングと操作は、WS-Policy フラグメントと、サービスと対話するためのセキュリティー要件を参照します。WS-SecurityPolicy 仕様は、暗号化にトランスポート (HTTPS) を使用して、暗号化に非対称および対称鍵などのものを指定できます。これは、暗号化または署名する部分またはヘッダー、その後に暗号化または署名するかどうか、タイムスタンプを含めるかどうか、派生キーを使用するかどうか、その他のキーを使用するかどうかなどを指定します。

ただし、一部の必須設定要素は公開されたエンドポイントコントラクトの一部やパブリックではなく、含まれるため、WS-SecurityPolicy では扱われません。これには、キーストアの場所、ユーザー名とパスワードなどが含まれます。Apache CXF では、Spring XML 記述子を使用するか、クライアント API またはアノテーションのいずれかを使用してこれらの要素を設定できます。

Expand
表3.4 サポートされる設定プロパティー
設定プロパティー説明

ws-security.username

UsernameToken ポリシーアサーションに使用するユーザー名。

ws-security.password

UsernameToken ポリシーアサーションに使用されるパスワード。指定されていない場合は、コールバックハンドラーが呼び出されます。

ws-security.callback-handler

キーストアおよび UsernameToken のパスワードを取得するために使用される WSS4J セキュリティー CallbackHandler

ws-security.signature.properties

署名キーストアと crypto オブジェクトを設定するための WSS4J プロパティーが含まれるプロパティーファイル/オブジェクト。

ws-security.encryption.properties

暗号キーストアおよび暗号化オブジェクトを設定するための WSS4J プロパティーが含まれるプロパティーファイル/オブジェクト。

ws-security.signature.username

使用される署名キーストアのキーのユーザー名またはエイリアス。指定されていない場合は、プロパティーファイルに設定されたデフォルトのエイリアスが使用されます。これが設定されておらず、キーストアに単一のキーのみが含まれる場合、そのキーが使用されます。

ws-security.encryption.username

使用される暗号キーストアのキーのユーザー名またはエイリアス。指定されていない場合は、プロパティーファイルに設定されたデフォルトのエイリアスが使用されます。これが設定されておらず、キーストアに単一のキーのみが含まれる場合、そのキーが使用されます。Web サービスプロバイダーの場合は、useReqSigCert キーワードを使用して、パブリックキーがサービスのトラストストアにあるクライアント (ws-security.encryption.properties で定義) を許可 (暗号化) できます。

ws-security.signature.crypto

これは、signature プロパティーを指定する代わりに、完全な WSS4J Crypto オブジェクトに向けることができます。これにより、暗号情報のプログラムによる設定が容易になります。

ws-security.encryption.crypto

これは、暗号化プロパティーを指定する代わりに、完全な WSS4J Crypto オブジェクトを参照します。これにより、暗号情報のプログラムによる設定が容易になります。

ws-security.enable.streaming

WS-Security メッセージのストリーミング (StAX ベースの) 処理を有効にします。

3.8.2. WS-Trust

WS-Trust は、WS-Security の拡張機能を定義する Web サービス仕様です。これは、分散システムにセキュリティーを実装するための一般的なフレームワークです。標準は、クライアントを認証し、さまざまなタイプの認証および承認データを含むトークンを発行できる集中型セキュリティートークンサービス (STS) に基づいています。この仕様は、セキュリティートークンの発行、交換、および検証に使用されるプロトコルを記述します。WS-Trust アーキテクチャーでは、以下の仕様が重要な役割を果たします。

  • WS-SecurityPolicy 1.2
  • SAML 2.0
  • ユーザー名トークンプロファイル
  • X.509 トークンプロファイル
  • SAML トークンプロファイル
  • Kerberos トークンプロファイル

WS-Trust 拡張機能は、複数のドメインにまたがり、セキュリティー鍵の共有を必要とするアプリケーションのニーズに対応します。これは、Web サービスプロバイダーと Web サービスプロバイダー間の信頼関係をブローカーするために、標準ベースの信頼できるサードパーティーの Web サービス (STS) を提供することで行います。このアーキテクチャーは、この情報の一般的な場所を提供することで、認証情報の変更を必要とするサービス更新の一時停止も軽減します。STS は、要求側とプロバイダーの両方がセキュリティートークンを取得し、検証する一般的なアクセスポイントです。

WS-Trust 仕様には、主に以下のコンポーネントがあります。

  • セキュリティートークンを発行、更新、および検証するためのセキュリティートークンサービス (STS)。
  • セキュリティートークン要求および応答のメッセージ形式。
  • 鍵交換のメカニズム。

次のセクションでは、基本的な WS-Trust シナリオについて説明します。高度なシナリオは、Advanced WS-Trust Scenarios を参照してください。

3.8.2.1. シナリオ: 基本的な WS-Trust

ここでは、基本的な WS-Trust シナリオの例を示します。これは、Web サービス要求側 (ws-requester)、Web サービスプロバイダー (ws-provider)、およびセキュリティートークンサービス (STS) で構成されます。

ws-provider では、非対称バインディングを使用して ws-requester によって提示される SAML 2.0 トークンが必要です。これらの通信要件は、ws-provider の WSDL で宣言されます。STS では、対称バインディングを使用して WSS UsernameToken 形式の要求に ws-requester 認証情報を提供する必要があります。STS からの応答には SAML 2.0 トークンが含まれています。これらの通信要件は、STS の WSDL で宣言されます。

  1. ws-requesterws-provider に接続し、その WSDL を消費します。セキュリティートークンの発行者要件を見つけると、ws-requester は、有効なリクエストを生成するために必要な情報を使って STSClient を作成し、設定します。
  2. STSClient は STS に接続し、その WSDL を使用します。セキュリティーポリシーが検出されます。STSClient は、適切な認証情報を使用して認証リクエストを作成し、送信します。
  3. STS はクレデンシャルを検証します。
  4. 応答として、STS は ws-requester が STS で認証したことを証明するセキュリティートークンを発行します。
  5. STSClient は、セキュリティートークンを含むメッセージを ws-provider に提示します。
  6. ws-provider は、トークンが STS によって発行されたことを確認し、ws-requester が STS で正常に認証されたことを証明します。
  7. ws-provider は要求されたサービスを実行し、結果を ws-requester に返します。

3.8.2.2. Apache CXF サポート

Apache CXF はオープンソースの完全な Web サービスフレームワークです。JBossWS オープンソースプロジェクトは JBoss Web Services (JBossWS) スタックを Apache CXF プロジェクトモジュールと統合し、WS-Trust およびその他の JAX-WS 機能を提供します。この統合により、Apache CXF STS 実装のデプロイメントが容易になります。Apache CXF API は、Web サービスリクエスターとその STS との通信を容易にする STSClient ユーティリティーも提供します。

3.8.3. セキュリティートークンサービス (STS)

Security Token Service (STS) は WS-Trust 仕様の中核となります。認証および承認の標準ベースのメカニズムです。STS は、トークンの形式、名前空間、または信頼の境界に基づいて、セキュリティートークンの発行、変更、および検証を行うための WS-Trust 仕様のプロトコルの実装です。STS は、Web サービス要求側と Web サービスプロバイダーとの間の信頼関係をブローカー化するために信頼できるサードパーティーとして機能する Web サービスです。これは、要求側とプロバイダーの両方が信頼する共通のアクセスポイントで、相互運用可能なセキュリティートークンを提供します。これにより、要求元とプロバイダー間の直接的な関係が不要になります。STS は認証用の標準ベースのメカニズムであるため、レルム間および異なるプラットフォーム間での相互運用性を確保します。

STS コントラクトは、他のアプリケーションおよびプロセスが対話する方法を定義します。特に、WSDL は WS-Trust ポリシーと WS-Security ポリシーを定義します。このポリシーでは、リクエストャーが STS のエンドポイントと正常に通信するために満たさなければならなりません。Web サービスリクエスターは STS のパッケージを使用し、STSClient ユーティリティーを使用して、指定されたセキュリティーポリシーに準拠するメッセージリクエストを生成し、STS エンドポイントに送信します。STS は要求を検証し、適切な応答を返します。

3.8.3.2. クライアントでの WS-Trust Security Token Service (STS) の使用

STS からセキュリティートークンを取得するようにクライアントを設定するには、org.picketlink.identity.federation.api.wstrust.WSTrustClient クラスを利用して STS に接続し、トークンを発行するように要求する必要があります。

最初にクライアントをインスタンス化する必要があります。

例: WSTrustClient の作成

 WSTrustClient client = new WSTrustClient("PicketLinkSTS", "PicketLinkSTSPort",
       "http://localhost:8080/SecureTokenService/PicketLinkSTS",
       new SecurityInfo(username, password));

次に、WSTrustClient を使用して SAML アサーションなどのトークンが発行されるように要求する必要があります。

例: アサーションの取得

org.w3c.dom.Element assertion = null;
try {
   assertion = client.issueToken(SAMLUtil.SAML2_TOKEN_TYPE);
} catch (WSTrustException wse) {
   System.out.println("Unable to issue assertion: " + wse.getMessage());
   wse.printStackTrace();
}

アサーションを取得したら、そのアサーションを SOAP メッセージに追加および送信する方法があります。

  • クライアントは、org.picketlink.trust.saml.assertion キー下で SOAP MessageContext に SAML2 Assertion をプッシュできます。例を以下に示します。

    bindingProvider.getRequestContext().put(SAML2Constants.SAML2_ASSERTION_PROPERTY, assertion);
  • SAML2 Assertion は、セキュリティーコンテキストで JAAS サブジェクトの一部として利用できます。これは、PicketLink STS ログインモジュールと JAAS の対話がある場合に生じる可能性があります。

3.8.3.3. STS クライアントプール

警告

JBoss EAP では、STS クライアントプール機能はサポートされていません

STS クライアントプールは、サーバーに STS クライアントのプールを設定できるようにする機能であり、STS クライアント作成のボトルネックをなくすことができます。クライアントプールは、STS クライアントが SAML チケットを取得する必要があるログインモジュールに使用できます。これらの型には次のようなものがあります。

  • org.picketlink.identity.federation.core.wstrust.auth.STSIssuingLoginModule
  • org.picketlink.identity.federation.core.wstrust.auth.STSValidatingLoginModule
  • org.picketlink.trust.jbossws.jaas.JBWSTokenIssuingLoginModule

各ログインモジュールのプール内のクライアントのデフォルト数は、initialNumberOfClients ログインモジュールオプションを使用して設定されます。

org.picketlink.identity.federation.bindings.stspool.STSClientPoolFactory クラスはクライアントプール機能をアプリケーションに提供します。

STSClientPoolFactory の使用

STS クライアントは、STSClientConfig 設定をキーとして使用し 、サブプールに挿入されます。STS クライアントをサブプールに挿入するには、STSClientPool インスタンスを取得して、設定に基づいてサブプールを初期化する必要があります。オプションで、プールを初期化する際に STS クライアントの最初の数を指定することができます。または、デフォルトの数を使用することもできます。

例: STS クライアントのサブプールへの挿入

final STSClientPool pool = STSClientPoolFactory.getPoolInstance();
pool.createPool(20, stsClientConfig);
final STSClient client = pool.getClient(stsClientConfig);

クライアントでの作業が完了したら returnClient() メソッドを呼び出し、クライアントをプールに返すことができます。

例: STS クライアントのサブプールへの返信

pool.returnClient();

例: 任意の設定でサブプールが存在するかどうかの確認

if (! pool.configExists(stsClientConfig) {
    pool.createPool(stsClientConfig);
}

picketlink-federation サブシステムを有効にすると、デプロイメント用に作成されたすべてのクライアントプールがアンデプロイプロセス中に自動的に破棄されます。プールを手動で破棄するには、以下を実行します。

例: サブプールの手動破棄

pool.destroyPool(stsClientConfig);

3.8.4. 認証済みアイデンティティー の EJB サブシステムへの伝搬

webservices サブシステムには、アダプターが含まれます。これは、アノテーションまたはデプロイメント記述子のいずれかを使用して、Web サービスエンドポイントをセキュアにするために Elytron セキュリティードメインの設定することができます。

Elytron セキュリティーを有効にすると、JAAS サブジェクトまたはプリンシパルを Apache CXF エンドポイントの SecurityContext にプッシュし、認証されたアイデンティティーを EJB コンテナーに伝播できます。

以下は、Apache CXF インターセプターを使用して、認証された情報を EJB コンテナーに伝播する方法の例になります。

public class PropagateSecurityInterceptor extends WSS4JInInterceptor {
    public PropagateSecurityInterceptor() {
      super();
      getAfter().add(PolicyBasedWSS4JInInterceptor.class.getName());
   }
   @Override
   public void handleMessage(SoapMessage message) throws Fault {
      ...
      final Endpoint endpoint = message.getExchange().get(Endpoint.class);
      final SecurityDomainContext securityDomainContext = endpoint.getSecurityDomainContext();
      //push subject principal retrieved from CXF to ElytronSecurityDomainContext
      securityDomainContext.pushSubjectContext(subject, principal, null)
      }
    }

3.9. JAX-WS ロギング

JAX-WS ハンドラー または Apache CXF ロギングインターセプター を使用して、インバウンドおよびアウトバウンドメッセージのロギングを処理できます。

3.9.1. JAX-WS ハンドラーの使用

JAX-WS ハンドラーは、渡されるメッセージをログに記録するように設定できます。@HandlerChain JAX-WS アノテーションを使用して、ハンドラーが希望のクライアントやエンドポイントに追加できるため、このアプローチは移植性があると言えます。

事前定義されたクライアントおよびエンドポイント設定メカニズムにより、ロギングハンドラーを任意のクライアントおよびエンドポイントの組み合わせに追加したり、一部のクライアントおよびエンドポイントのみに追加したりできます。ロギングハンドラーを一部のクライアントまたはエンドポイントのみに追加するには、@EndpointConfig アノテーションと JBossWS API を使用します。

org.jboss.ws.api.annotation.EndpointConfig アノテーションは、エンドポイント設定を JAX-WS エンドポイント実装に割り当てるために使用されます。webservices サブシステムに定義された設定を割り当てる場合、設定名のみが指定されます。アプリケーションに定義されている設定を割り当てる場合は、デプロイメント記述子への相対パスと設定名を指定する必要があります。

3.9.2. Apache CXF ロギングインターセプターの使用

Apache CXF には、コンソール、クライアントのログファイル、またはサーバーのログファイルにメッセージをログに記録するために使用できるロギングインターセプターが同梱されています。これらのインターセプターは、以下を含む複数の方法でクライアント、エンドポイント、およびバスに追加できます。

  • システムプロパティー

    org.apache.cxf.logging.enabled システムプロパティーを true に設定すると、ロギングインターセプターが、JVM で作成されるバスインスタンスに追加されます。システムプロパティーを pretty に設定して、きれいな形式の XML 出力を出力することもできます。以下の管理 CLI コマンドを使用すると、このシステムプロパティーを設定できます。

    /system-property=org.apache.cxf.logging.enabled:add(value=true)
  • 手動インターセプターの追加

    ロギングインターセプターは、Apache CXF アノテーション @org.apache.cxf.interceptor.InInterceptors および @org.apache.cxf.interceptor.OutInterceptors を使用してエンドポイントに選択的に追加できます。プログラムでロギングインターセプターの新しいインスンタスをクライアントまたはバスに追加することにより、クライアント側の同じ結果が得られます。

3.10. Web Services Addressing (WS-Addressing) の有効化

Web サービスのアドレス指定 (WS-Addressing) は、Web サービスと関連メッセージを処理するトランスポートに中立的なメカニズムを提供します。WS-Addressing を有効にするには、@Addressing アノテーションを Web サービスエンドポイントに追加し、アクセスするクライアントを設定する必要があります。

以下の例は、アプリケーションに既存の JAX-WS サービスおよびクライアント設定があることを前提としています。使用できる完全な例は、JBoss EAP に同梱される jaxws-addressing クイックスタートを参照してください。

  1. @Addressing アノテーションをアプリケーションの JAX-WS エンドポイントコードに追加します。

    例: @Addressing アノテーションのある JAX-WS エンドポイント

    package org.jboss.quickstarts.ws.jaxws.samples.wsa;
    
    import org.jboss.quickstarts.ws.jaxws.samples.wsa.ServiceIface;
    
    import javax.jws.WebService;
    import javax.xml.ws.soap.Addressing;
    
    @WebService(
        portName = "AddressingServicePort",
        serviceName = "AddressingService",
        wsdlLocation = "WEB-INF/wsdl/AddressingService.wsdl",
        targetNamespace = "http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
        endpointInterface = "org.jboss.quickstarts.ws.jaxws.samples.wsa.ServiceIface")
    @Addressing(enabled = true, required = true)
    public class ServiceImpl implements ServiceIface {
        public String sayHello() {
            return "Hello World!";
        }
    }

  2. JAX-WS クライアントコードを更新して WS-Addressing を設定します。

    例: WS-Addressing 用に設定された JAX-WS クライアント

    package org.jboss.quickstarts.ws.jaxws.samples.wsa;
    
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    import javax.xml.ws.soap.AddressingFeature;
    
    public final class AddressingClient {
        private static final String serviceURL =
            "http://localhost:8080/jaxws-addressing/AddressingService";
    
        public static void main(String[] args) throws Exception {
            // construct proxy
            QName serviceName =
                new QName("http://www.jboss.org/jbossws/ws-extensions/wsaddressing",
                    "AddressingService");
            URL wsdlURL = new URL(serviceURL + "?wsdl");
            Service service = Service.create(wsdlURL, serviceName);
            org.jboss.quickstarts.ws.jaxws.samples.wsa.ServiceIface proxy =
                (org.jboss.quickstarts.ws.jaxws.samples.wsa.ServiceIface) service.getPort(org.jboss.quickstarts.ws.jaxws.samples.wsa.ServiceIface.class,
                    new AddressingFeature());
            // invoke method
            System.out.println(proxy.sayHello());
        }
    }

クライアントおよびエンドポイントは WS-Addressing を使用して通信するようになりました。

3.11. Web サービス信頼できるメッセージングの有効化

Web Services Reliable Messaging (WS-Reliable Messaging) は、Apache CXF に内部で実装されます。インターセプターのセットは、信頼できるメッセージングプロトコルの低レベル要件と対話します。

WS-Reliable Messaging を有効にするには、以下のいずれかの手順を実行します。

  • 適切な WS-Reliable Messaging ポリシー、アサーション、またはそれらの両方を指定する WSDL コントラクトを消費します。
  • 信頼できるメッセージングインターセプターを手動で追加し、設定します。
  • オプションの CXF Spring XML 記述子で信頼できるメッセージングポリシーを指定します。
  • オプションの CXF Spring XML 記述子に Apache CXF 信頼性メッセージング機能を指定します。

最初のアプローチは移植可能な唯一の方法であり、Apache CXF WS-Policy エンジンに依存します。プロプライエタリーの他のアプローチにより、WS-Reliable Messaging Policy で対応していないプロトコル側面の詳細な設定が可能になります。

3.12. Web サービスポリシーの指定

Web Services Policies (WS-Policy) は Apache CXF WS-Policy フレームワークに依存します。このフレームワークは、以下の仕様に準拠しています。

ポリシーは、以下を含む複数の方法で使用することができます。

  • ポリシーアサーションを WSDL コントラクトに追加し、ランタイムにアサーションを消費させ、適切に動作させます。
  • CXF アノテーションまたは機能のいずれかを使用してエンドポイントポリシー添付を指定します。
  • Apache CXF ポリシーフレームワークを使用してカスタムアサーションを定義し、他のタスクを完了します。

3.13. Apache CXF の統合

JBoss EAP 上の JBossWS によって提供されるすべての JAX-WS 機能は、ほとんどの Apache CXF プロジェクトモジュールを含む JBossWS スタックの適切な統合によって提供されます。

Apache CXF はオープンソースサービスフレームワークです。JAX-WS を含むフロントエンドプログラミング API を使用してサービスを構築および開発でき、サービスは HTTP や JMS などのさまざまなトランスポート上で SOAP や XML/HTTP などのさまざまなプロトコルを通信します。

JBossWS と Apache CXF 間の統合レイヤーは主に以下の目的で使用されます。

  • JAX-WS などの標準の Web サービス API を JBoss EAP で使用可能。これは、ユーザーがこれに対応する必要なく、Apache CXF を内部的に活用します。
  • JBoss EAP 上で WS-* を含む Apache CXF の高度な機能を使用できるようにし、これらのコンテナーでの実行に必要な統合手順をユーザーが処理、設定、考慮したりする必要性を省きます。

これらの目的をサポートするため、Apache CXF を使用した JBossWS 統合は JBossWS エンドポイントデプロイメントメカニズムをサポートし、Apache CXF 上で多数の内部カスタマイズが提供されます。

Apache CXF アーキテクチャーの詳細は、Apache CXF 公式ドキュメント を参照してください。

3.13.1. サーバー側統合のカスタマイズ

JBossWS サーバー側の Apache CXF との統合では、提供された Web サービスデプロイメントに適切な Apache CXF 構造を内部で作成します。デプロイメントに複数のエンドポイントが含まれる場合、それらはすべて同じ Apache CXF バス内に存在し、他のデプロイメントのバスインスタンスとは分離されます。

JBossWS はサーバー側で Apache CXF 設定オプションのほとんどに対して適切なデフォルト値を設定しますが、ユーザーはデプロイメント用に作成される Bus インスタンスを微調整する必要があるかもしれません。jboss-webservices.xml 記述子はデプロイメントレベルのカスタマイズに使用できます。

3.13.1.1. デプロイメント記述子プロパティー

jboss-webservices.xml 記述子は、プロパティー値を提供するために使用できます。

<webservices xmlns="http://www.jboss.com/xml/ns/javaee" version="1.2">
  ...
  <property>
    <name>...</name>
    <value>...</value>
  </property>
  ...
</webservices>

Apache CXF との JBossWS 統合には、Apache CXF 内部を制御するために許可されるプロパティー名のセットが含まれています。

3.13.1.2. WorkQueue の設定

Apache CXF は、@Oneway 要求処理などの一部の操作を処理する WorkQueue インスタンスを使用します。WorkQueueManager は拡張として Bus にインストールされ、キューを追加または削除したり、既存のキューを制御したりできます。

サーバー側では、jboss-webservices.xmlcxf.queue.<queue-name>.* プロパティーを使用してキューを指定できます。たとえば、cxf.queue.default.maxQueueSize プロパティーを使用して、デフォルトの WorkQueue の最大キューサイズを設定できます。デプロイメント時に、JBossWS 統合は AutomaticWorkQueueImpl の新しいインスタンスを現在設定されている WorkQueueManager に追加できます。以下のプロパティーは、AutomaticWorkQueueImpl constructor パラメーターを埋めるために使用されます。

Expand
表3.5 AutomaticWorkQueueImpl コンストラクトープロパティー
プロパティーデフォルト値

cxf.queue.<queue-name>.maxQueueSize

256

cxf.queue.<queue-name>.initialThreads

0

cxf.queue.<queue-name>.highWaterMark

25

cxf.queue.<queue-name>.lowWaterMark

5

cxf.queue.<queue-name>.dequeueTimeout

120000

3.13.1.3. ポリシー代替セレクター

Apache CXF ポリシーエンジンは、ポリシーの代替に対応するさまざまなストラテジーをサポートします。JBossWS 統合のデフォルトは MaximalAlternativeSelector ですが、jboss-webservices.xml ファイルで cxf.policy.alternativeSelector プロパティーを使用して異なるセレクター実装を設定することもできます。

3.13.1.4. MBean 管理

Apache CXF を使用すると、JBoss EAP MBean サーバーにインストールされた MBean オブジェクトを管理できます。この機能は、jboss-webservices.xml ファイルの cxf.management.enabled プロパティーを使用してデプロイメントベースで有効にできます。cxf.management.installResponseTimeInterceptors プロパティーを使用して、CXF 応答時間インターセプターのインストールを制御することもできます。これらのインターセプターは、MBean 管理を有効にするとデフォルトで追加されますが、場合によっては必要ない可能性があります。

例: jboss-webservices.xml ファイルの MBean 管理

<webservices xmlns="http://www.jboss.com/xml/ns/javaee" version="1.2">
  <property>
    <name>cxf.management.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>cxf.management.installResponseTimeInterceptors</name>
    <value>false</value>
  </property>
</webservices>

3.13.1.5. スキーマの検証

Apache CXF には、クライアントとサーバーの両方での SOAP メッセージの受信および送信を検証する機能が含まれます。検証は、サービスプロキシー(クライアント側) のビルドに使用されるエンドポイントの WSDL コントラクト (サーバー側) または WSDL コントラクトの関連するスキーマに対して実行されます。

スキーマの検証は、以下のいずれかの方法で有効にできます。

  • JBoss EAP サーバー設定の最適化

    たとえば、以下の管理 CLI コマンドは、デフォルトの Standard-Endpoint-Config エンドポイント設定のスキーマ検証を有効にします。

    /subsystem=webservices/endpoint-config=Standard-Endpoint-Config/property=schema-validation-enabled:add(value=true)
  • 事前定義されたクライアントまたはエンドポイント設定ファイルです。

    参照された設定ファイルで schema-validation-enabled プロパティーを true に設定すると、事前に設定されている構成 に、コンテナー内で実行しているエンドポイントまたはクライアントを関連付けることができます。

  • クライアント側でプログラムで

    クライアント側では、スキーマ検証をプログラムで有効にできます。例を以下に示します。

    ((BindingProvider)proxy).getRequestContext().put("schema-validation-enabled", true);
  • サーバー側で @org.apache.cxf.annotations.SchemaValidation アノテーションを使用します。

    サーバー側では、@org.apache.cxf.annotations.SchemaValidation アノテーションを使用できます。例を以下に示します。

    import javax.jws.WebService;
    import org.apache.cxf.annotations.SchemaValidation;
    
    @WebService(...)
    @SchemaValidation
    public class ValidatingHelloImpl implements Hello {
       ...
    }

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

jboss-webservices.xml 記述子 では、cxf.interceptors.in および cxf.interceptors.out プロパティーを指定できます。これらのプロパティーにより、宣言しているインターセプターを、デプロイメントを提供するために作成された Bus インスタンスに割り当てることができます。

例: jboss-webservices.xml ファイル

<?xml version="1.1" encoding="UTF-8"?>
<webservices
  xmlns="http://www.jboss.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="1.2"
  xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee">

  <property>
    <name>cxf.interceptors.in</name>
    <value>org.jboss.test.ws.jaxws.cxf.interceptors.BusInterceptor</value>
  </property>
  <property>
    <name>cxf.interceptors.out</name>
    <value>org.jboss.test.ws.jaxws.cxf.interceptors.BusCounterInterceptor</value>
  </property>
</webservices>

以下の方法のいずれかを使用してインターセプターを宣言できます。

  • エンドポイントクラスのアノテーションの使用 (@org.apache.cxf.interceptor.InInterceptor または @org.apache.cxf.interceptor.OutInterceptor)。
  • org.apache.cxf.interceptor.InterceptorProvider インターフェースを使用したクライアント側での直接 API 使用。
  • JBossWS 記述子の使用方法。

JBoss EAP では Spring 統合がサポートされなくなったため、JBossWS 統合では、際のクライアントまたはエンドポイントコードの変更を不要にするために jaxws-endpoint-config.xml 記述子ファイルを使用します。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:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_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>

注記

指定された各インターセプタークラスの新規インスタンスは、設定が割り当てられるクライアントまたはエンドポイントに追加されます。インターセプタークラスには no-argument コンストラクターが必要です。

3.13.1.7. Apache CXF の機能

jboss-webservices.xml 記述子を使用すると、cxf.features プロパティーを指定できます。このプロパティーを使用すると、デプロイメントを提供するために作成された Bus インスタンスに属するエンドポイントに機能を宣言できます。

例: jboss-webservices.xml ファイル

<?xml version="1.1" encoding="UTF-8"?>
<webservices
  xmlns="http://www.jboss.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="1.2"
  xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee">

  <property>
    <name>cxf.features</name>
    <value>org.apache.cxf.feature.FastInfosetFeature</value>
  </property>
</webservices>

以下の方法のいずれかを使用して機能を宣言できます。

  • エンドポイントクラスでのアノテーション使用 (例: @org.apache.cxf.feature.Features)
  • org.apache.cxf.feature.AbstractFeature クラスの拡張により、クライアント側で API の直接使用。
  • JBossWS 記述子の使用方法。

JBoss EAP では Spring 統合がサポートされなくなったため、JBossWS 統合は追加の記述子 (jaxws-endpoint-config.xml ファイルベースのアプローチ) を追加して、実際のクライアントまたはエンドポイントコードへの変更を回避します。cxf.features プロパティーの機能クラス名のリストを指定して、事前定義のクライアントおよびエンドポイント設定内で機能を宣言できます。

例: jaxws-endpoint-config.xml ファイル

<?xml version="1.0" encoding="UTF-8"?>
<jaxws-config xmlns="urn:jboss:jbossws-jaxws-config:4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:javaee="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="urn:jboss:jbossws-jaxws-config:4.0 schema/jbossws-jaxws-config_4_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>

注記

指定された各機能クラスの新規インスタンスは、設定が割り当てられるクライアントまたはエンドポイントに追加されます。機能クラスには no-argument コンストラクターが必要です。

3.13.1.8. プロパティー駆動 Bean の作成

Apache CXF Interceptors および Apache CXF Features セクションでは、クライアントまたはエンドポイントの事前定義設定または jboss-webservices.xml 記述子でプロパティーを使用して CXF インターセプターおよび機能を宣言する方法を説明します。指定された feature または interceptor クラス名のみを取得することにより、コンテナーはクラスデフォルトコンストラクターを使用して bean インスタンスを作成しようとします。これは、vanilla CXF クラスのカスタム拡張機能が提供されない限り、機能またはインターセプター設定の制限を設定します。ただし、デフォルトのコンストラクター設定プロパティーは、最終的にスーパーコンストラクターを使用する前に設定されます。

この問題に対処するために、JBossWS 統合には、プロパティーからビルドする際に単純な bean 階層を設定するメカニズムが含まれています。プロパティーには bean 参照値を持たせることができます。これは、## で始まる文字列です。プロパティー参照キーは、bean クラス名と各属性の値を指定するために使用されます。

たとえば、以下のプロパティーを使用すると、スタックは機能インスタンスをインストールします。

Expand
キー

cxf.features

##foo, ##bar

##foo

org.jboss.Foo

##foo.par

34

##bar

org.jboss.Bar

##bar.color

blue

以下のコードでは、同じ結果を作成できます。

import org.Bar;
import org.Foo;
...
Foo foo = new Foo();
foo.setPar(34);
Bar bar = new Bar();
bar.setColor("blue");

このメカニズムは、クラスが適切な getter() および setter() メソッドを持つ有効な Bean であることを前提としています。値オブジェクトは、クラス定義を検査して正しいプリミティブ型にキャストされます。ネストされた Bean を設定することもできます。

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る