27.2. 開始点コードの生成

概要

JAX-WS は、WSDL で定義されたサービスから、そのサービスをサービスプロバイダーとして実装する Java クラスへの詳細なマッピングを指定します。wsdl:portType 要素で定義される論理インターフェイスは、サービスエンドポイントインターフェイス (SEI) にマッピングされます。WSDL で定義された複合型はすべて、Java Architecture for XML Binding (JAXB) 仕様で定義されたマッピングに従って Java クラスにマップされます。wsdl:service 要素で定義されるエンドポイントも、サービスを実装するサービスプロバイダーにアクセスするためにコンシューマーによって使用される Java クラスに生成されます。

cxf-codegen-plugin Maven プラグインはこのコードを生成します。また、実装の開始点コードを生成するためのオプションも提供します。コードジェネレーターは、生成されたコードを制御するためのいくつかのオプションを提供します。

コードジェネレーターの実行

例27.1「サービスコード生成」 は、コードジェネレーターを使用してサービスの開始点コードを生成する方法を示しています。

例27.1 サービスコード生成

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>outputDir</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>wsdl</wsdl>
                        <extraargs>
                            <extraarg>-server</extraarg>
                            <extraarg>-impl</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
       </execution>
    </executions>
</plugin>

これは次のことを行います。

  • -impl オプションは、WSDL コントラクトの各 wsdl:portType 要素にシェル実装クラスを生成します。
  • -server オプションは、サービスプロバイダーをスタンドアロンのアプリケーションとして実行する単純な main() を生成します。
  • sourceRoot は、生成されたコードが outputDir という名前のディレクトリーに書き込まれることを指定します。
  • WSDL 要素は、コードが生成される WSDL コントラクトを指定します。

コードジェネレーターのオプションの完全なリストについては、「cxf-codegen-plugin」 を参照してください。

生成されたコード

表27.1「サービスプロバイダー用に生成されたクラス」 サービスプロバイダーを作成するために生成されるファイルについて説明します。

表27.1 サービスプロバイダー用に生成されたクラス

File説明

portTypeName.java

SEI。このファイルには、サービスプロバイダーが実装するインターフェイスが含まれています。このファイルは編集しないでください。

serviceName.java

エンドポイント。このファイルには、コンシューマーがサービスで要求を行うために使用する Java クラスが含まれています。

portTypeNameImpl.java

スケルトン実装クラス。このファイルを変更して、サービスプロバイダーを構築します。

portTypeNameServer.java

サービスプロバイダーをスタンドアロンプロセスとして展開できるようにする基本的なサーバーメインライン。詳細は、31章サービスの公開 を参照してください。

さらに、コードジェネレーターは、WSDL コントラクトで定義されているすべてのタイプの Java クラスを生成します。

生成されたパッケージ

生成されたコードは、WSDL コントラクトで使用されている名前空間に基づいてパッケージに配置されます。(wsdl:portType 要素、wsdl:service 要素、および wsdl:port 要素に基づき) サービスをサポートするために生成されたクラスは、WSDL コントラクトのターゲット namespace に基づいてパッケージに配置されます。コントラクトの types 要素で定義された型を実装するために生成されたクラスは、types 要素の targetNamespace 属性に基づいてパッケージに配置されます。

マッピングアルゴリズムは次のとおりです。

  1. 先頭の http:// または urn:// は名前空間から取り除かれます。
  2. namespace の最初の文字列が有効なインターネットドメイン (例: .com または .gov で終わる) である場合、先頭の www. は文字列から取り除かれ、残りの 2 つのコンポーネントは反転される。
  3. namespace の最後の文字列がパターン .xxx または .xx のファイル拡張子で終わる場合、エクステンションは取り除かれる。
  4. 名前空間の残りの文字列は、結果の文字列に追加され、ドットで区切られます。
  5. すべての文字は小文字になります。