Menu Close

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 サービスプロバイダー用に生成されるクラス

ファイル説明

portTypeName.java

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

serviceName.java

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

portTypeNameImpl.java

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

portTypeNameServer.java

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

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

生成されるパッケージ

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

マッピングアルゴリズムは以下のようになります。

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