Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド

11g リリース1 (10.3.6)

B61645-05(原本部品番号:E13758-06)

目次

タイトルおよび著作権情報

はじめに

- ドキュメントのアクセシビリティについて

- 表記規則

1 概要

2 ユース・ケースとサンプル

- 簡単なHelloWorld Webサービスの作成

- サンプルHelloWorldImpl.java JWSファイル

- HelloWorldImpl.javaのサンプルAntビルド・ファイル

- ユーザー定義のデータ型を使用するWebサービスの作成

- サンプルBasicStruct JavaBean

- サンプルComplexImpl.java JWSファイル

- ComplexImpl.java JWSファイルのサンプルAntビルド・ファイル

- WSDLファイルからのWebサービスの作成

- サンプルWSDLファイル

- TemperatureService_TemperaturePortImpl Java実装ファイルのサンプル

- TemperatureServiceのサンプルAntビルド・ファイル

- Java SEアプリケーションからのWebサービスの呼出し

- サンプルJavaクライアント・アプリケーション

- Javaクライアント・アプリケーションをビルドするためのサンプルAntビルド・ファイル

- WebLogic WebサービスからのWebサービスの呼出し

- サンプルClientServiceImpl.java JWSファイル

- ClientServiceをビルドするためのサンプルAntビルド・ファイル

3 WebLogic Webサービスの開発

- WebLogic Webサービス・プログラミング・モデルの概要

- 高度なWebサービス機能のためのドメインの構成

- 高度なWebサービス機能に必要なリソース

- 高度なWebサービス機能用にドメインを拡張するスクリプト

- 高度なWebサービス機能のための構成ウィザードを使用したドメインの構成

- Webサービス拡張テンプレートを使用したドメインの作成

- Webサービス拡張テンプレートを使用したドメインの拡張

- Webサービス拡張テンプレートを使用したドメイン拡張でのWLSTの利用

- ドメインの拡張後に追加されたリソースの更新

- WebLogic Advanced Web Services for JAX-WS拡張テンプレートを適用するときの問題に関するトラブルシューティング

- Javaから開始するWebLogic Webサービスの開発: 主な手順

- WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順

- 基本的なAnt build.xmlファイルの作成

- jwsc WebLogic WebサービスAntタスクの実行

- jwscの使用例

- jwscの高度な使用方法

- wsdlc WebLogic WebサービスAntタスクの実行

- wsdlcで生成される途中まで作成済みのJWS実装クラス・ファイルの更新

- WebLogic Webサービスのデプロイとアンデプロイ

- wldeploy Antタスクを使用したWebサービスのデプロイ

- 管理コンソールを使用したWebサービスのデプロイ

- WebサービスのWSDLの参照

- 動的なWSDLで指定されたサーバー・アドレスの構成

- Webサービスがコールバック・サービスでなく、HTTP/Sを使用して呼び出せる場合

- Webサービスがコールバック・サービスである場合

- Webサービスがプロキシ・サーバーを使用して呼び出せる場合

- Webサービスのテスト

- WebサービスのWebLogic分割開発ディレクトリ環境への統合

4 JWSファイルのプログラミング

- JWSファイルとJWSアノテーションの概要

- JWSファイルのJava要件

- JWSファイルのプログラミング: 一般的な手順

- JWSファイルの例

- JWSファイルがWebサービスを実装することの指定(@WebServiceアノテーション)

- WebサービスとSOAPメッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)

- JWSメソッドをパブリック操作として公開することの指定(@WebMethodおよび@OneWayアノテーション)

- 操作のパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)

- 操作の戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)

- エンドポイントに使用するバインディングの指定(@BindingTypeアノテーション)

- Webサービスの実行時情報へのアクセス

- プロトコル・バインディング・コンテキストへのアクセス

- Webサービス・コンテキストへのアクセス

- MessageContextプロパティ値の使用

- ステートレス・セッションEJBを実装すべき場合

- ユーザー定義のJavaデータ型のプログラミング

- JWSファイルからの別のWebサービスの呼出し

- SOAP 1.2の使用

- XMLスキーマの検証

- サーバーでのスキーマ検証の有効化

- クライアントでのスキーマ検証の有効化

- JWSプログラミングのベスト・プラクティス

5 JAXBデータ・バインディングの使用

- JAXBを使用したデータ・バインディングの概要

- JAXBデータ・バインディング・アーティファクトの開発

- 標準データ型のマッピング

- サポートされる組込みデータ型

- 組込みデータ型のXML-to-Javaマッピング

- 組込みデータ型のJava-to-XMLマッピング

- サポートされるユーザー定義のデータ型

- サポートされるユーザー定義のXMLデータ型

- サポートされるユーザー定義のJavaデータ型

- JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ

- JAXBアノテーションの例

- フィールドおよびプロパティのデフォルト・シリアライゼーションの指定(@XmlAccessorTypeアノテーション)

- プロパティとローカル要素のマッピング(@XmlElement)

- MIMEタイプの指定(@XmlMimeTypeアノテーション)

- 最上位クラスとグローバル要素のマッピング(@XmlRootElement)

- 複数のクラスのバインディング(@XmlSeeAlso)

- 値クラスとスキーマ型のマッピング(@XmlType)

- バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ

- 外部バインディング宣言ファイルの作成

- JAX-WSバインディング宣言を使用した外部バインディング宣言ファイルの作成

- JAXBバインディング宣言を使用した外部バインディング宣言ファイルの作成

- バインディング宣言の埋め込み

- WSDLファイルへのJAX-WSまたはJAXBバインディング宣言の埋め込み

- XMLスキーマへのJAXBバインディング宣言の埋め込み

- JAX-WSカスタム・バインディング宣言

- JAXBカスタム・バインディング宣言

6 Webサービスの呼出し

- Webサービスの呼出しの概要

- Java SEクライアントからのWebサービスの呼出し

- クライアントのアーティファクトを生成するためのclientgen Antタスクの使用

- Webサービスに関する情報の取得

- Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述

- クライアント・アプリケーションのコンパイルと実行

- JavaクライアントのサンプルAntビルド・ファイル

- WebLogic WebサービスからのWebサービスの呼出し

- Webサービス・クライアントのサンプルbuild.xmlファイル

- Webサービスを呼び出すサンプルJWSファイル

- Webサービス・クライアントの構成

- @WebServiceRefアノテーションを使用したWebサービス参照の定義

- クライアントIDの管理

- ポート初期化時のクライアントIDの定義

- サーバー生成のクライアントIDのアクセス

- クライアントIDのライフサイクル

- Webサービス呼出し時のプロキシ・サーバーの使用

- ClientProxyFeature APIを使用したプロキシ・サーバーの指定

- システム・プロパティを使用したプロキシ・サーバーの指定

- Webサービスを再デプロイする際にクライアント側で考慮すべき事項

- Webサービスおよびクライアントを同一の管理対象サーバーにデプロイする場合のクライアントに関する考慮事項

7 Webサービスの管理

- WebLogic Webサービスの管理タスクの概要

- 管理ツール

- WebLogic Server管理コンソールの使用

- 管理コンソールの起動

- 管理コンソールでのWebサービスの表示

- Webサービスのセキュリティ構成の作成

- Oracle Enterprise Manager Fusion Middleware Controlの使用

- WebLogic Scripting Toolの使用

- WebLogic Antタスクの使用

- Java Management Extensions (JMX)の使用

- Java EE Deployment APIの使用

- ワーク・マネージャによるWebサービス作業の優先付けとスタック実行スレッドの削減

- Webサービスおよびクライアントの監視

- Webサービスの監視

- Webサービス・クライアントの監視

8 JAX-WSへのJAX-RPC Webサービスおよびクライアントの移行

- WebLogic Webサービスの最終コンテキスト・ルートの設定

- WebLogic独自のアノテーションの使用

- WSDLファイルの生成

- JAXBカスタム・タイプの使用

- EJB 3.0の使用

- RPCスタイルSOAPバインディングからの移行

- SOAPメッセージ・ハンドラの更新

- JAX-WSクライアントの呼出し

Oracle® Fusion Middleware

Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド

11g リリース1 (10.3.6)

B61645-05(原本部品番号:E13758-06)

2013年3月

このドキュメントでは、ソフトウェア開発者を対象に、Java API for XML-based Web services (JAX-WS)を使用してWebLogic Webサービスを開発する方法について説明します。

Oracle Fusion Middleware Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド, 11g リリース1 (10.3.6)

B61645-05

Copyright © 2007, 2013, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT RIGHTS Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, the use, duplication, disclosure, modification, and adaptation shall be subject to the restrictions and license terms set forth in the applicable Government contract, and, to the extent applicable by the terms of the Government contract, the additional rights set forth in FAR 52.227-19, Commercial Computer Software License (December 2007).Oracle America, Inc., 500 Oracle Parkway, Redwood City, CA 94065.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

はじめに

ここでは、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』で使用されるドキュメントのアクセシビリティ機能と表記規則について説明します。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害があるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。

表記規則

このドキュメントでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

斜体

イタリックは、ユーザーが特定の値を指定するプレースホルダー変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 概要

この章では、このガイドに記載されているトピックをまとめます。各トピックでは、Java API for XML-based Web Services (JAX-WS)を使用してWebLogic Webサービスをプログラミングする方法について説明します。JAX-WSは、Java Webサービスのコーディング、構築、デプロイメントに使用する標準ベースのAPIです。

JAX-WSは、WebサービスおよびWebアプリケーション内でJAX-RPCにかわるものとして設計されています。JAX-WSおよびJAX-RPCに対してサポートされている機能を比較するには、『Oracle WebLogic Server WebLogic Webサービスの紹介』のJAX-WSまたはJAX-RPCのいずれかを選択する際の判断基準に関する項を参照してください。JAX-RPC WebサービスからJAX-WSへの移行の詳細は、第8章「JAX-WSへのJAX-RPC Webサービスおよびクライアントの移行」を参照してください。

次の表に、このガイドの内容をまとめます。

表1-1 内容のまとめ

章

内容

第2章「ユース・ケースとサンプル」

一般的なユース・ケースとサンプルを実行します。

第3章「WebLogic Webサービスの開発」

WebLogic開発環境でWebサービスを開発します。

第4章「JWSファイルのプログラミング」

Webサービスを実装するJWSファイルをプログラムします。

第5章「JAXBデータ・バインディングの使用」

Java Architecture for XML Binding (JAXB)データ・バインディングを使用します。

第6章「Webサービスの呼出し」

スタンドアロン・クライアントまたは別のWebサービスからWebサービスを呼び出します。

第7章「Webサービスの管理」

管理コンソールを使用してWebLogic Webサービスを管理します。

第8章「JAX-WSへのJAX-RPC Webサービスおよびクライアントの移行」

JAX-RPC WebサービスをJAX-WSへ移行します。

注意:

Oracle WebLogic ServerのJAX-WS実装は、JAX-WS参照実装(RI)から拡張されて、Glassfish Communityによって開発されます(http://jax-ws.java.net/を参照してください)。JAX-WS仕様(JSR-224)で定義されたすべての機能は、Oracle WebLogic Serverによって完全にサポートされます。

また、JAX-WS RIにはGlassfishコントリビュータによって提供された様々な拡張があります。特に記載しないかぎり、JAX-WS RI拡張はOracle WebLogic Serverでの使用についてはサポートされません。

WebLogic Webサービスの概要、規格、サンプル、および関連ドキュメントは、『Oracle WebLogic Server WebLogic Webサービスの紹介』を参照してください。WebLogic Webサービスのセキュリティの詳細は、『Oracle WebLogic Server WebLogic Webサービスの保護』を参照してください。

既存のWebLogic Webサービスをアップグレードする際の注意点

10.xのWebLogic Webサービスをリリース10.3.1にアップグレードするために必要な手順はありません。10.xのWebサービスは、変更や再コンパイルなしにWebLogic Serverリリース10.3.1へ再デプロイすることができます。

2 ユース・ケースとサンプル

この章では、Java API for XML-based Web services (JAX-WS)を使用したWebLogic Webサービスの一般的なユース・ケースとサンプルについて説明します。

この章の内容は以下のとおりです。

- 簡単なHelloWorld Webサービスの作成

- ユーザー定義のデータ型を使用するWebサービスの作成

- WSDLファイルからのWebサービスの作成

- Java SEアプリケーションからのWebサービスの呼出し

- WebLogic WebサービスからのWebサービスの呼出し

各ユース・ケースでは、簡単なWebLogic Webサービスを作成する手順や、デプロイ済のWebサービスから操作を呼び出す手順を示します。これらの例には基本的なJavaコードとAnt build.xmlファイルが含まれており、それらをユーザーの開発環境で使用してサンプルを再現することや、現在の開発環境とは別の環境で指示に従ってサンプルを作成して実行することができます。

ユース・ケースではサンプルで使用されるプロセスやツールについては詳しく説明していません。詳細は、以降の章を参照してください。

注意:

高度なWebサービス機能を示すベスト・プラクティスの例では、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービス・クライアント開発のロードマップに関する項およびWebサービスおよびクライアント開発のロードマップに関する項を参照してください。

簡単なHelloWorld Webサービスの作成

このセクションでは、操作が1つの非常に簡単なWebサービスの作成方法について説明します。Webサービスを実装するJava Webサービス(JWS)・ファイルでは必須のJWSアノテーション@WebServiceを1つのみ使用しています。JWSファイルは、JWSメタデータ・アノテーションを使用してWebサービスの形式を指定した標準のJavaファイルです。メタデータ・アノテーションはJDK 5.0で導入され、Webサービス・ファイルにアノテーションを付けるために使用される一連のアノテーションはJWSアノテーションと呼ばれます。WebLogic Webサービスは標準のJWSアノテーションを使用します。サポートされるJWSアノテーションの完全なリストは、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスのアノテーション・サポートに関する項を参照してください。

次の例では、1つの操作sayHelloWorldを含むHelloWorldServiceというWebサービスを作成する方法を示します。簡単にするために、操作は入力された文字列値を戻すものとします。

1. WebLogic Server環境を設定します。
コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)スクリプトを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2. 次のようにプロジェクト・ディレクトリを作成します。

prompt> mkdir /myExamples/hello_world

3. プロジェクト・ディレクトリの下に、srcディレクトリと、JWSファイル(この手順で後述)のパッケージ名に対応するサブディレクトリを作成します。

prompt> cd /myExamples/hello_world
prompt> mkdir src/examples/webservices/hello_world

4. Webサービスを実装するJWSファイルを作成します。
任意のJava IDEまたはテキスト・エディタを開いて、「サンプルHelloWorldImpl.java JWSファイル」で指定されたJavaコードを使用してHelloWorldImpl.javaというJavaファイルを作成します。

サンプルJWSファイルでは、1つのパブリック・メソッドsayHelloWorld(String)を含むHelloWorldImplというJavaクラスが示されています。@WebServiceアノテーションは、JavaクラスがHelloWorldServiceというWebサービスを実装することを指定しています。デフォルトでは、すべてのパブリック・メソッドが操作として公開されます。

5. src/examples/webservices/hello_worldディレクトリにHelloWorldImpl.javaファイルを保存します。

6. プロジェクト・ディレクトリ(myExamples/hello_world/src)内に標準のAnt build.xmlファイルを作成し、taskdef Antタスクを追加して、jwscタスクの完全修飾Javaクラス名を指定します。

<project name="webservices-hello_world" default="all">
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
</project>

この手順で説明される追加のターゲット(clean、undeploy、client、およびrunなど)が含まれている、完全なサンプルbuild.xmlファイルについては、「HelloWorldImpl.javaのサンプルAntビルド・ファイル」を参照してください。完全なbuild.xmlファイルでは、EARディレクトリの名前を常にハード・コード化して使用するのではなく、${ear-dir}などのプロパティも使用しています。

7. 次のようなjwsc Antタスクの呼出しを、build-serviceターゲット内にラップして、build.xmlファイルに追加します。

<target name="build-service">
<jwsc
srcdir="src"
destdir="output/helloWorldEar">
<jws file="examples/webservices/hello_world/HelloWorldImpl.java"
type="JAXWS"/>
</jwsc>
</target>

jwsc WebLogic WebサービスAntタスクは、補助的なアーティファクトを生成し、ユーザーが作成および生成したJavaコードをコンパイルして、すべてのアーティファクトを、後でWebLogic Serverにデプロイされるエンタープライズ・アプリケーションEARファイルにアーカイブ化します。type="JAXWS"を使用して作成するWebサービス(JAX-WS)のタイプを指定します。

8. コマンド・ラインでbuild-serviceターゲットを指定して、jwsc Antタスクを実行します。

prompt> ant build-service

output/helloWorldEarディレクトリを見て、jwsc Antタスクによって生成されたファイルとアーティファクトを確認します。

9. WebサービスをデプロイするWebLogic Serverインスタンスを起動します。

10. 管理コンソールまたはwldeploy Antタスクを使用して、エンタープライズ・アプリケーションにパッケージ化されたWebサービスをWebLogic Serverにデプロイします。いずれの場合でも、outputディレクトリにあるhelloWorldEarエンタープライズ・アプリケーションをデプロイします。
wldeploy Antタスクを使用するには、以下のターゲットをbuild.xmlファイルに追加します。

<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="deploy">
<wldeploy action="deploy"
name="helloWorldEar" source="output/helloWorldEar"
user="${wls.username}" password="${wls.password}"
verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>

wls.username、wls.password、wls.hostname、wls.port、およびwls.server.nameの値は、ご使用のWebLogic Serverインスタンスの対応する値で置き換えます。

deployターゲットを実行して、WARファイルをデプロイします。

prompt> ant deploy

11. ブラウザでWSDLを呼び出して、Webサービスが正しくデプロイされていることをテストします。

http://host:port/HelloWorldImpl/HelloWorldService?WSDL

URLは、contextPathおよびserviceUri属性のデフォルト値を使用して構築します。contextPathのデフォルト値はJWSファイル内のJavaクラスの名前です。serviceURI属性のデフォルト値は@WebServiceアノテーションのserviceName要素です(指定されている場合)。そうでない場合、拡張子を除いたJWSファイルの名前の後にServiceを付けたものになります。たとえば、@WebServiceアノテーションのserviceName要素が指定されておらず、JWSファイルの名前がHelloWorldImpl.javaである場合、そのserviceUriのデフォルト値はHelloWorldImplServiceになります。

これらの属性は、次の「ユーザー定義のデータ型を使用したWebサービスの作成」の例で、明示的に設定されます。ご使用のWebLogic Serverインスタンスに適合したホスト名およびポートを選択してください。

build.xmlファイルでclean、build-service、undeploy、およびdeployターゲットを使用すると、開発プロセスの一環としてWebサービスを繰返し更新、再ビルド、アンデプロイ、および再デプロイできます。

Webサービスを実行するには、そのWebサービスを呼び出すクライアントを作成する必要があります。Webサービスを呼び出すJavaクライアント・アプリケーションの作成例は、「Java SEアプリケーションからのWebサービスの呼出し」を参照してください。

サンプルHelloWorldImpl.java JWSファイル

package examples.webservices.hello_world;
// Import the @WebService annotation
import javax.jws.WebService;
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
/**
* This JWS file forms the basis of simple Java-class implemented WebLogic
* Web Service with a single operation: sayHelloWorld
*/
public class HelloWorldImpl {
// By default, all public methods are exposed as Web Services operation
public String sayHelloWorld(String message) {
try {
System.out.println("sayHelloWorld:" + message);
} catch (Exception ex) { ex.printStackTrace(); }

return "Here is the message: '" + message + "'";
}
}

HelloWorldImpl.javaのサンプルAntビルド・ファイル

以下のbuild.xmlファイルでは、プロパティを使用してファイルを簡素化しています。

<project name="webservices-hello_world" default="all">
<!-- set global properties for this build -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="helloWorldEar" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/helloWorldEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all" depends="clean,build-service,deploy,client" />
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}">
<jws file="examples/webservices/hello_world/HelloWorldImpl.java"
type="JAXWS"/>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}"
failonerror="false"
user="${wls.username}" password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/HelloWorldImpl/HelloWorldService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.hello_world.client"
type="JAXWS"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/hello_world/client/**/*.java"/>
</target>
<target name="run">
<java classname="examples.webservices.hello_world.client.Main"
fork="true" failonerror="true" >
<classpath refid="client.class.path"/>
<arg
line="http://${wls.hostname}:${wls.port}/HelloWorldImpl/HelloWorldService"  />
</java> </target>
</project>

ユーザー定義のデータ型を使用するWebサービスの作成

前のユース・ケースでは、Webサービス操作のパラメータと戻り値として、単純データ型Stringのみを使用していました。次の例では、ユーザー定義のデータ型(特にBasicStructというJavaBean)を操作のパラメータおよび戻り値として使用するWebサービスの作成方法を示します。

Webサービスでユーザー定義のデータ型を使用する場合、データ型のJavaソースを作成して、それをJWSファイル内で適切に使用する以外に、プログラマが実際にすべきことはほとんどありません。jwsc Antタスクは、JWSファイルにユーザー定義のデータ型がある場合、XML表現(SOAPメッセージで使用)とJava表現(WebLogic Serverで使用)との間でデータを変換するのに必要な、すべてのデータ・バインディング・アーティファクトを自動的に生成します。データ・バインディング・アーティファクトには、Javaユーザー定義データ型に相当するXMLスキーマがあります。

次の手順は「簡単なHelloWorld Webサービスの作成」に記載されている手順とほぼ同じです。そのため、説明では必要な手順をすべて示していますが、簡単なHelloWorldサンプルと異なる手順のみ詳細に説明しています。

1. WebLogic Server環境を設定します。
コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)スクリプトを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2. プロジェクト・ディレクトリを作成します。

prompt> mkdir /myExamples/complex

3. プロジェクト・ディレクトリの下に、srcディレクトリと、JWSファイル(この手順で後述)のパッケージ名に対応するサブディレクトリを作成します。

prompt> cd /myExamples/complex
prompt> mkdir src/examples/webservices/complex

4. BasicStruct JavaBeanのソースを作成します。
任意のJava IDEまたはテキスト・エディタを開いて、「サンプルBasicStruct JavaBean」で指定されたJavaコードを使用して BasicStruct.javaというJavaファイルをプロジェクト・ディレクトリに作成します。

5. BasicStruct.javaファイルをプロジェクト・ディレクトリのsrc/examples/webservices/complexサブディレクトリに保存します。

6. 「サンプルComplexImpl.java JWSファイル」で指定されたJavaコードを使用して、Webサービスを実装するJWSファイルを作成します。
このサンプルJWSファイルでは、複数のJWSアノテーションを使用しています。@WebMethodでは、メソッドがWebサービス操作として公開されることを明示的に指定し、操作名をデフォルトのメソッド名echoStructからechoComplexTypeに変更します。@WebParamと@WebResultでは、パラメータと戻り値を構成します。@SOAPBindingでは、Webサービスのタイプを指定します。また、ComplexImpl.java JWSファイルではexamples.webservice.complex.BasicStructクラスをインポートして、echoStruct()メソッドのパラメータと戻り値としてユーザー定義データ型のBasicStructを使用します。

JWSファイルの作成に関するより詳細な情報については、第4章「JWSファイルのプログラミング」を参照してください。

7. ComplexImpl.javaファイルをプロジェクト・ディレクトリのsrc/examples/webservices/complexサブディレクトリに保存します。

8. プロジェクト・ディレクトリ内に標準のAnt build.xmlファイルを作成し、taskdef Antタスクを追加して、jwscタスクの完全修飾クラス名を指定します。

<project name="webservices-complex" default="all">
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
</project>

完全なサンプルbuild.xmlファイルについては、「ComplexImpl.java JWSファイルのサンプルAntビルド・ファイル」を参照してください。

9. 次のようなjwsc Antタスクの呼出しを、build-serviceターゲット内にラップして、build.xmlファイルに追加します。

<target name="build-service">
<jwsc
srcdir="src"
destdir="output/ComplexServiceEar" >
<jws file="examples/webservices/complex/ComplexImpl.java"
type="JAXWS">
<WLHttpTransport
contextPath="complex" serviceUri="ComplexService"
portName="ComplexServicePort"/>
</jws>
</jwsc>
</target>

上記の例で注目すべき点は以下のとおりです。

- <jws>要素のtype属性では、Webサービスのタイプ(JAX-WSまたはJAX-RPC)が指定されています。

- jwsc Antタスクの<jws要素の<WLHttpTransport子要素では、HTTP/Sトランスポートを介してWebサービスを呼び出す際に使用されるURLのコンテキスト・パスとサービスURIセクションに加え、生成されるWSDLのポートの名前も指定されています。コンテキスト・パスの定義に関する詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebLogic Webサービスのコンテキスト・パスの定義に関する項を参照してください。

10. jwsc Antタスクを使用します。

prompt> ant build-service

output/ComplexServiceEarディレクトリを見て、jwsc Antタスクによって生成されたファイルとアーティファクトを確認します。

11. WebサービスをデプロイするWebLogic Serverインスタンスを起動します。

12. 管理コンソールまたはwldeploy Antタスクを使用して、ComplexServiceEarエンタープライズ・アプリケーションにパッケージ化されたWebサービスをWebLogic Serverにデプロイします。例:

prompt> ant deploy

13. 管理コンソールまたはwldeploy Antタスクを使用して、エンタープライズ・アプリケーションにパッケージ化されたWebサービスをWebLogic Serverにデプロイします。いずれの場合でも、outputディレクトリにあるComplexServiceEarエンタープライズ・アプリケーションをデプロイします。
wldeploy Antタスクを使用するには、以下のターゲットをbuild.xmlファイルに追加します。

<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="deploy">
<wldeploy action="deploy"
name="ComplexServiceEar" source="output/ComplexServiceEar"
user="${wls.username}" password="${wls.password}"
verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>

wls.username、wls.password、wls.hostname、wls.port、およびwls.server.nameの値は、ご使用のWebLogic Serverインスタンスの対応する値で置き換えます。

deployターゲットを実行して、WARファイルをデプロイします。

prompt> ant deploy

14. ブラウザでWSDLを呼び出して、Webサービスが正しくデプロイされていることをテストします。

http://host:port/complex/ComplexService?WSDL

Webサービスを実行するには、そのWebサービスを呼び出すクライアントを作成する必要があります。Webサービスを呼び出すJavaクライアント・アプリケーションの作成例は、「Java SEアプリケーションからのWebサービスの呼出し」を参照してください。

サンプルBasicStruct JavaBean

package examples.webservices.complex;
/**
* Defines a simple JavaBean called BasicStruct that has integer, String,
* and String[] properties
*/
public class BasicStruct {
// Properties
private int intValue;
private String stringValue;
private String[] stringArray;
// Getter and setter methods
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getStringValue() {
return stringValue;
}
public void setStringValue(String stringValue) {
this.stringValue = stringValue;
}
public String[] getStringArray() {
return stringArray;
}
public void setStringArray(String[] stringArray) {
this.stringArray = stringArray;
}
public String toString() {
return "IntValue="+intValue+", StringValue="+stringValue;
}
}

サンプルComplexImpl.java JWSファイル

package examples.webservices.complex;
// Import the standard JWS annotation interfaces
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// Import the BasicStruct JavaBean
import examples.webservices.complex.BasicStruct;
// Standard JWS annotation that specifies that the portType name of the Web
// Service is "ComplexPortType", its public service name is "ComplexService",
// and the targetNamespace used in the generated WSDL is "http://example.org"
@WebService(serviceName="ComplexService", name="ComplexPortType",
targetNamespace="http://example.org")
// Standard JWS annotation that specifies this is a document-literal-wrapped
// Web Service
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
/**
* This JWS file forms the basis of a WebLogic Web Service.  The Web Services
* has two public operations:
*
*  - echoInt(int)
*  - echoComplexType(BasicStruct)
*
* The Web Service is defined as a "document-literal" service, which means
* that the SOAP messages have a single part referencing an XML Schema element
* that defines the entire body.
*/
public class ComplexImpl {
// Standard JWS annotation that specifies that the method should be exposed
// as a public operation.  Because the annotation does not include the
// member-value "operationName", the public name of the operation is the
// same as the method name: echoInt.
//
// The WebResult annotation specifies that the name of the result of the
// operation in the generated WSDL is "IntegerOutput", rather than the
// default name "return".   The WebParam annotation specifies that the input
// parameter name in the WSDL file is "IntegerInput" rather than the Java
// name of the parameter, "input".
@WebMethod()
@WebResult(name="IntegerOutput",
targetNamespace="http://example.org/complex")
public int echoInt(
@WebParam(name="IntegerInput",
targetNamespace="http://example.org/complex")
int input)
{
System.out.println("echoInt '" + input + "' to you too!");
return input;
}
// Standard JWS annotation to expose method "echoStruct" as a public operation
// called "echoComplexType"
// The WebResult annotation specifies that the name of the result of the
// operation in the generated WSDL is "EchoStructReturnMessage",
// rather than the default name "return".
@WebMethod(operationName="echoComplexType")
@WebResult(name="EchoStructReturnMessage",
targetNamespace="http://example.org/complex")
public BasicStruct echoStruct(BasicStruct struct)
{
System.out.println("echoComplexType called");
return struct;
}
}

ComplexImpl.java JWSファイルのサンプルAntビルド・ファイル

以下のbuild.xmlファイルでは、プロパティを使用してファイルを簡素化しています。

<project name="webservices-complex" default="all">
<!-- set global properties for this build -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="complexServiceEAR" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/complexServiceEar" />
<property name="clientclass-dir" value="${example-output}/clientclass" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all" depends="clean,build-service,deploy,client"/>
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}"
keepGenerated="true"
>
<jws file="examples/webservices/complex/ComplexImpl.java"
type="JAXWS">
<WLHttpTransport
contextPath="complex" serviceUri="ComplexService"
portName="ComplexServicePort"/>
</jws>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy"
name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}"/>
</target>
<target name="undeploy">
<wldeploy action="undeploy" failonerror="false"
name="${ear.deployed.name}"
user="${wls.username}" password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}"/>
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.complex.client"
type="JAXWS"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/complex/client/**/*.java"/>
</target>
<target name="run" >
<java fork="true"
classname="examples.webservices.complex.client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
<arg line="http://${wls.hostname}:${wls.port}/complex/ComplexService"
/>
</java>
</target>
</project>

WSDLファイルからのWebサービスの作成

Webサービスの作成に関するもう1つの一般的なユース・ケースは、既存のWSDLファイル(黄金のWSDLとも呼ばれます)から開始することです。WSDLファイルはWebサービスがどのようなものかを指定するパブリック・コントラクトであり、サポートされる操作のリスト、各操作のシグネチャと形式、操作を呼び出すときに使用されるプロトコルとトランスポート、データをトランスポートするときに使用されるXMLスキーマ・データ型などを指定します。WSDLファイルに基づいて、WebLogic Serverにデプロイできるように、Webサービスを実装するアーティファクトを生成します。wsdlc Antタスクを使用して次のアーティファクトを生成します。

- WSDLファイルで記述されたWebサービスを実装するJWSサービス・エンドポイント・インタフェース(SEI)。

- 生成されるJWS SEIの不完全な(途中まで作成済みの)実装が含まれるJWS実装ファイル。このファイルは開発者がカスタマイズする必要があります。

- JAXBデータ・バインディング・アーティファクト。

- (オプション)生成されるJWS SEIのJavadoc。

注意:

更新することになるwsdlc Antタスクによって生成されるファイルは、JWS実装ファイルのみです。JWS SEIおよびデータ・バインディング・アーティファクトが含まれるJARファイルを更新する必要はありません。

一般に、wsdlc Antタスクを1回実行して、生成されるJWS SEIファイルとデータ・バインディング・アーティファクトを含むJARファイルを生成し、その後で、インタフェースを実装する生成済JWSファイルをコーディングして、Webサービスのビジネス・ロジックを追加します。特に、Webサービス操作を実装するメソッドに、操作の動作に必要なJavaコードを追加し、JWSアノテーションを追加します。

JWS実装ファイルをコーディングしたら、前のセクションで説明されたものと同じ手順に従って、jwsc Antタスクを実行してデプロイ可能なWebサービスを生成します。相違点は、compiledWsdl属性を使用して、wsdlc Antタスクによって生成されるJARファイル(JWS SEIファイルとデータ・バインディング・アーティファクトを含む)を指定することのみです。

次の簡単な例は、「サンプルWSDLファイル」に示したWSDLファイルからWebサービスを作成する方法を示しています。このWebサービスには、郵便番号を渡されると気温を返すgetTempという1つの操作が含まれています。

1. WebLogic Server環境を設定します。
コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)スクリプトを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2. 作業ディレクトリを作成します。

prompt> mkdir /myExamples/wsdlc

3. WSDLファイルをコンピュータ上のアクセス可能なディレクトリに置きます。
この例では、WSDLファイルはTemperatureService.wsdlという名前で/myExamples/wsdlc/wsdl_filesディレクトリにあると仮定しています。ファイルの完全なリストについては、「サンプルWSDLファイル」を参照してください。

4. プロジェクト・ディレクトリ内に標準のAnt build.xmlファイルを作成し、taskdef Antタスクを追加して、wsdlcタスクの完全修飾Javaクラス名を指定します。

<project name="webservices-wsdlc" default="all">
<taskdef name="wsdlc"
classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>
</project>

この手順で説明される追加のターゲット(clean、undeploy、client、およびrunなど)が含まれている、完全なサンプルbuild.xmlファイルについては、「TemperatureServiceのサンプルAntビルド・ファイル」を参照してください。完全なbuild.xmlファイルでは、EARディレクトリの名前を常にハード・コード化して使用するのではなく、${ear-dir}などのプロパティも使用しています。

5. 次のようなwsdlc Antタスクの呼出しを、generate-from-wsdlターゲット内にラップして、build.xmlファイルに追加します。

<target name="generate-from-wsdl">
<wsdlc
srcWsdl="wsdl_files/TemperatureService.wsdl"
destJwsDir="output/compiledWsdl"
destImplDir="output/impl"
packageName="examples.webservices.wsdlc"
type="JAXWS"/>
</target>

このサンプルのwsdlcタスクでは、JWS SEIとデータ・バインディング・アーティファクトを含むJARファイルを、カレント・ディレクトリ下のoutput/compiledWsdlディレクトリに生成します。また、JWS SEIの部分的な実装ファイル(TemperatureService_TemperaturePortImpl.java))を、output/impl/examples/webservices/wsdlcディレクトリに生成します(このディレクトリは、destImplDirで指定された出力ディレクトリと、パッケージ名で指定されたディレクトリ階層を組み合わせたものです)。生成されたすべてのJWSファイルはexamples.webservices.wsdlcパッケージにパッケージ化されます。

6. コマンド・ラインでgenerate-from-wsdlターゲットを指定して、wsdlc Antタスクを実行します。

prompt> ant generate-from-wsdl

wsdlc Antタスクによってアーティファクトとファイルが生成されたことを調べるには、outputディレクトリを確認します。

7. 任意のJava IDEまたはテキスト・エディタを使用して、生成されたoutput/impl/examples/webservices/wsdlc/TemperatureService_TemperaturePortImpl.java JWS実装ファイルを編集し、目的の処理が行えるようにメソッドにJavaコードを追加します。
例は、「TemperatureService_TemperaturePortImpl Java実装ファイルのサンプル」を参照してください。追加されたJavaコードは太字になっています。生成されたJWS実装ファイルには@WebService JWSアノテーション値が自動的に含まれており、その値は元のWSDLファイルの値に対応しています。

注意:

WSDLから開始するユースケースでJWS実装ファイルに追加できるJWSアノテーションには制限があります。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のwsdlcに関する項を参照してください。

処理を簡単にするため、サンプルのTemperatureService_TemperaturePortImpl.javaのgetTemp()メソッドは、固定の数値を返します。実際のファイルの場合、このメソッドの実装では、特定の郵便番号で現在の気温をルックアップします。

8. 更新したTemperatureService_TemperaturePortImpl.javaファイルを永続的なディレクトリ(プロジェクト・ディレクトリの下のsrcディレクトリなど)にコピーします。パッケージ名に対応する子ディレクトリも必ず作成するようにしてください。

prompt> cd /examples/wsdlc
prompt> mkdir src/examples/webservices/wsdlc
prompt> cp output/impl/examples/webservices/wsdlc/TemperatureService_TemperaturePortImpl.java.java \src/examples/webservices/wsdlc/TemperatureService_TemperaturePortImpl.java.java

9. 更新されたJWS実装クラスに対してjwsc Antタスクを実行するbuild-serviceターゲットを、build.xmlファイルに追加します。jwscのcompiledWsdl属性を使用して、wsdlc Antタスクによって生成されるJARファイルの名前を指定します。

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}">
<jws file="examples/webservices/wsdlc/TemperatureService_TemperaturePortImpl.java"
compiledWsdl="${compiledWsdl-dir}/TemperatureService_wsdl.jar"
type="JAXWS">
<WLHttpTransport
contextPath="temp" serviceUri="TemperatureService"
portName="TemperaturePort">
</WLHttpTransport>
</jws>
</jwsc>
</target>

上記の例で注目すべき点は以下のとおりです。

- <jws>要素のtype属性では、Webサービスのタイプ(JAX-WSまたはJAX-RPC)が指定されています。

- jwsc Antタスクの<jws>要素の<WLHttpTransport>子要素では、HTTP/Sトランスポートを介してWebサービスを呼び出す際に使用されるURLのコンテキスト・パスとサービスURIセクションに加え、生成されるWSDLのポートの名前も指定されています。

10. build-serviceターゲットを実行してデプロイ可能なWebサービスを生成します。

prompt> ant build-service

JWSファイルを更新して再ビルドする場合、このターゲットを再実行します。

11. WebサービスをデプロイするWebLogic Serverインスタンスを起動します。

12. 管理コンソールまたはwldeploy Antタスクを使用して、エンタープライズ・アプリケーションにパッケージ化されたWebサービスをWebLogic Serverにデプロイします。いずれの場合でも、outputディレクトリにあるwsdlcEarエンタープライズ・アプリケーションをデプロイします。
wldeploy Antタスクを使用するには、以下のターゲットをbuild.xmlファイルに追加します。

<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="deploy">
<wldeploy action="deploy" name="wsdlcEar"
source="output/wsdlcEar" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>

wls.username、wls.password、wls.hostname、wls.port、およびwls.server.nameの値は、ご使用のWebLogic Serverインスタンスの対応する値で置き換えます。

deployターゲットを実行して、WARファイルをデプロイします。

prompt> ant deploy

13. ブラウザでWSDLを呼び出して、Webサービスが正しくデプロイされていることをテストします。

http://host:port/temp/TemperatureService?WSDL

上記のURLのコンテキスト・パスとサービスURIの部分は元の黄金のWSDLで指定されています。WebLogic Serverインスタンスのホスト名とポートを使用します。デプロイされたWSDLファイルと元のWSDLファイルは、エンドポイント・アドレスのホストとポート以外は同じであることに注目してください。

build.xmlファイルでclean、build-service、undeploy、およびdeployターゲットを使用すると、開発プロセスの一環としてWebサービスを繰返し更新、再ビルド、アンデプロイ、および再デプロイできます。

Webサービスを実行するには、そのWebサービスを呼び出すクライアントを作成する必要があります。Webサービスを呼び出すJavaクライアント・アプリケーションの作成例は、「Java SEアプリケーションからのWebサービスの呼出し」を参照してください。

サンプルWSDLファイル

<?xml version="1.0"?>
<definitions
name="TemperatureService"
targetNamespace="http://www.xmethods.net/sd/TemperatureService.wsdl"
xmlns:tns="http://www.xmethods.net/sd/TemperatureService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/" >
<types>
<xsd:schema
targetNamespace="http://www.xmethods.net/sd/TemperatureService.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:element name="getTempRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="zip" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="getTempResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="return" type="xsd:float"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<message name="getTempRequest">
<part name="parameters" element="tns:getTempRequest"/>
</message>
<message name="getTempResponse">
<part name="parameters" element="tns:getTempResponse"/>
</message>
<portType name="TemperaturePortType">
<operation name="getTemp">
<input message="tns:getTempRequest"/>
<output message="tns:getTempResponse"/>
</operation>
</portType>
<binding name="TemperatureBinding" type="tns:TemperaturePortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getTemp">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="TemperatureService">
<documentation>
Returns current temperature in a given U.S. zipcode
</documentation>
<port name="TemperaturePort" binding="tns:TemperatureBinding">
<soap:address
location="http://localhost:7001/temp/TemperatureService"/>
</port>
</service>
</definitions>

TemperatureService_TemperaturePortImpl Java実装ファイルのサンプル

package examples.webservices.wsdlc;
import javax.jws.WebService;
import javax.xml.ws.BindingType;

/**
* Returns current temperature in a given U.S. zipcode
* This class was generated by the JAX-WS RI.
* JAX-WS RI 2.2.8-b13684
* Generated source version: 2.2
*
*/
@WebService(
portName = "TemperaturePort",
serviceName = "TemperatureService",
targetNamespace="http://www.xmethods.net/sd/TemperatureService.wsdl"
wsdlLocation = "/wsdls/TemperatureService.wsdl",
endpointInterface = "examples.webservices.wsdlc.TemperaturePortType")
@BindingType("http://schemas.xmlsoap.org/wsdl/soap/http")
public class TemperatureService_TemperaturePortImpl implements
TemperaturePortType
{
public TemperatureService_TemperaturePortImpl() { }
/**
*
* @param zip
* @return
*     returns float
*/
public float getTemp(String zip) {
return 1.234f;
}
}

TemperatureServiceのサンプルAntビルド・ファイル

以下のbuild.xmlファイルでは、プロパティを使用してファイルを簡素化しています。

<project default="all">
<!-- set global properties for this build -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="wsdlcEar" />
<property name="example-output" value="output" />
<property name="compiledWsdl-dir" value="${example-output}/compiledWsdl" />
<property name="impl-dir" value="${example-output}/impl" />
<property name="ear-dir" value="${example-output}/wsdlcEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="wsdlc"
classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all"
depends="clean,generate-from-wsdl,build-service,deploy,client" />
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="generate-from-wsdl">
<wsdlc
srcWsdl="wsdl_files/TemperatureService.wsdl"
destJwsDir="${compiledWsdl-dir}"
destImplDir="${impl-dir}"
packageName="examples.webservices.wsdlc"
type="JAXWS"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}">
<jws
file="examples/webservices/wsdlc/TemperatureService_TemperaturePortImpl.java"
compiledWsdl="${compiledWsdl-dir}/TemperatureService_wsdl.jar"
type="JAXWS">
<WLHttpTransport
contextPath="temp" serviceUri="TemperatureService"
portName="TemperaturePort"/>
</jws>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}"
failonerror="false"
user="${wls.username}" password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/temp/TemperatureService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.wsdlc.client"
type="JAXWS">
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/wsdlc/client/**/*.java"/>
</target>
<target name="run">
<java classname="examples.webservices.wsdlc.client.TemperatureClient"
fork="true" failonerror="true" >
<classpath refid="client.class.path"/>
<arg
line="http://${wls.hostname}:${wls.port}/temp/TemperatureService" />
</java>
</target>
</project>

Java SEアプリケーションからのWebサービスの呼出し

注意:

(WebLogic Serverクラスパスへのアクセス権を使用して)WebLogic Serverで実行されているJava SEまたはJava EEアプリケーションからWebサービスを呼び出すことができます。WebLogic Serverライブラリが使用できない環境で実行されているスタンドアロンJavaアプリケーションからのWebサービスの呼出し、JAX-WS Webサービスのこのリリースではサポートされていません。

クライアント・アプリケーションからデプロイ済のWebサービス操作を呼び出す場合、WebサービスはWebLogic Serverにデプロイされている場合と、.NETなどの他のアプリケーション・サーバーにデプロイされている場合があります。知る必要があるのは、パブリック・コントラクト・ファイル、つまりWSDLのURLのみです。

Javaクライアント・アプリケーションを記述する他に、clientgen WebLogic WebサービスAntタスクを実行して、クライアント・アプリケーションがWebサービス操作を呼び出すために必要なアーティファクトも生成する必要があります。次のようなアーティファクトがあります。

- 呼出しの対象となる特定のWebサービスに対するServiceインタフェース実装のJavaクラス。

- JAXBデータ・バインディング・アーティファクト。

- WSDLファイルで指定されたユーザー定義XMLスキーマ・データ型のJavaクラス。

次の例では、「ユーザー定義のデータ型を使用するWebサービスの作成」で説明している、ComplexService WebLogic WebサービスのechoComplexType操作を呼び出すJavaクライアント・アプリケーションを作成する方法を示します。echoComplexType操作は、ユーザー定義のデータ型であるBasicStructをパラメータおよび戻り型として使用します。

注意:

この手順では、ComplexService Webサービスを作成してデプロイ済であると仮定しています。

1. WebLogic Server環境を設定します。
コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)スクリプトを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2. プロジェクト・ディレクトリを作成します。

prompt> mkdir /myExamples/simple_client

3. プロジェクト・ディレクトリの下に、srcディレクトリと、Javaクライアント・アプリケーション(この手順で後述)のパッケージ名に対応するサブディレクトリを作成します。

prompt> cd /myExamples/simple_client
prompt> mkdir src/examples/webservices/simple_client

4. プロジェクト・ディレクトリ内に標準のAnt build.xmlファイルを作成し、taskdef Antタスクを追加して、clientgenタスクの完全修飾Javaクラス名を指定します。

<project name="webservices-simple_client" default="all">
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
</project>

完全なサンプルbuild.xmlファイルについては、「Javaクライアント・アプリケーションをビルドするためのサンプルAntビルド・ファイル」を参照してください。完全なbuild.xmlファイルでは、クライアント・クラスの出力ディレクトリの名前を常にハード・コード化して使用するのではなく、${clientclass-dir}などのプロパティを使用します。

5. 次のようなclientgenおよびjavac Antタスクの呼出しを、build-clientターゲット内にラップして、build.xmlファイルに追加します。

<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="output/clientclass"
packageName="examples.webservices.simple_client"
type="JAXWS"/>
<javac
srcdir="output/clientclass" destdir="output/clientclass"
includes="**/*.java"/>
<javac
srcdir="src" destdir="output/clientclass"
includes="examples/webservices/simple_client/*.java"/>
</target>

clientgen Antタスクでは、デプロイされたComplexService WebサービスのWSDLを使用して必要なアーティファクトを生成し、指定されたパッケージ名を使用してそれらをoutput/clientclassディレクトリに格納します。WebサービスをホストしているWebLogic Serverインスタンスの実際のホスト名とポートで、変数を置き換えてください。

この例では、パッケージ名はクライアント・アプリケーションと同じパッケージ名examples.webservices.simple_clientに設定されます。パッケージ名をクライアント・アプリケーションとは異なる名前に設定した場合は、適切なクラス・ファイルをインポートする必要があります。たとえば、examples.webservices.complexというパッケージ名にした場合、クライアント・アプリケーションの以下のクラス・ファイルをインポートする必要があります。

import examples.webservices.complex.BasicStruct;
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

clientgen Antタスクはexamples.webservices.simple_client.BasicStruct JavaBeanクラスも自動的に生成します。このクラスは、WSDLで指定されたユーザー定義のデータ型のJava表現です。

build-clientターゲットでは、clientgenの他に標準のjavac Antタスクも指定して、次の手順で説明するJavaプログラムを含む、すべてのJavaコードをクラス・ファイルにコンパイルします。

clientgen AntタスクのdestFile属性を使用すると、生成されたJavaファイルを自動的にコンパイルして、すべてのアーティファクトをJARファイルにパッケージ化できます。詳細と例については、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のclientgenに関する項を参照してください。

6. echoComplexType操作を呼び出すJavaクライアント・アプリケーション・ファイルを作成します。
任意のJava IDEまたはテキスト・エディタを開いて、「サンプルJavaクライアント・アプリケーション」で指定されたコードを使用してMain.javaというJavaファイルを作成します。

アプリケーションは標準JAX-WSのガイドラインに従って、clientgenによって生成されたServiceインタフェースのWebサービス固有の実装を使用してWebサービスの操作を呼び出します。詳細は、第6章「Webサービスの呼出し」を参照してください。

7. Main.javaファイルをメイン・プロジェクト・ディレクトリのsrc/examples/webservices/simple_clientサブディレクトリに保存します。

8. コマンド・ラインでbuild-clientターゲットを指定して、clientgenおよびjavac Antタスクを実行します。

prompt> ant build-client

output/clientclassディレクトリを見て、clientgen Antタスクによって生成されたファイルとアーティファクトを確認します。

9. Mainアプリケーションの実行に使用される以下のターゲットをbuild.xmlファイルに追加します。

<path id="client.class.path">
<pathelement path="output/clientclass"/>
<pathelement path="${java.class.path}"/>
</path>
<target name="run" >
<java fork="true"
classname="examples.webservices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
</target>

runターゲットはMainアプリケーションを呼び出し、デプロイされたWebサービスのWSDL URLを1つの引数として渡します。classpath要素では、<path>タスクで作成される参照を使用して、CLASSPATHにclientclassディレクトリが追加されます。

10. runターゲットを実行してechoComplexType操作を呼び出します。

prompt> ant run

呼出しに成功すると、次のような最終出力が表示されます。

run:
[java] echoComplexType called. Result: 999, Hello Struct

build.xmlファイルのbuild-clientおよびrunターゲットを使用して、開発プロセスの一環としてJavaクライアント・アプリケーションを繰返し更新、再ビルド、および実行できます。

サンプルJavaクライアント・アプリケーション

以下に、echoComplexType操作を呼び出す簡単なJavaクライアント・アプリケーションを示します。<clientgen> packageName属性はクライアント・アプリケーションと同じパッケージ名に設定されているため、<clientgen>生成ファイルをインポートする必要はありません。

package examples.webservices.simple_client;
/**
* This is a simple Java application that invokes the
* echoComplexType operation of the ComplexService Web service.
*/
public class Main {
public static void main(String[] args) {
ComplexService test = new ComplexService();
ComplexPortType port = test.getComplexPortTypePort();
BasicStruct in = new BasicStruct();
in.setIntValue(999);
in.setStringValue("Hello Struct");
BasicStruct result = port.echoComplexType(in);
System.out.println("echoComplexType called. Result: " + result.getIntValue() + ", " + result.getStringValue());
}
}

Javaクライアント・アプリケーションをビルドするためのサンプルAntビルド・ファイル

次のbuild.xmlファイルでは、Javaクライアント・アプリケーションをビルドするタスクが定義されています。この例では、プロパティを使用してファイルを簡素化しています。

<project name="webservices-simple_client" default="all">
<!-- set global properties for this build -->
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="example-output" value="output" />
<property name="clientclass-dir" value="${example-output}/clientclass" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<target name="clean" >
<delete dir="${clientclass-dir}"/>
</target>
<target name="all" depends="clean,build-client,run" />
<target name="build-client">
<clientgen
type="JAXWS"
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.simple_client"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/simple_client/*.java"/>
</target>
<target name="run" >
<java fork="true"
classname="examples.webservices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
</java>
</target>
</project>

WebLogic WebサービスからのWebサービスの呼出し

デプロイされたWebLogic Webサービス内からWebサービス(WebLogic、Microsoft .NETなど)を呼び出すことができます。

その手順は、「Java SEアプリケーションからのWebサービスの呼出し」で説明した手順と似ていますが、この場合はclientgen Antタスクを実行してクライアント・スタブを生成するのではなく、jwsc Antタスク内で<jws>の子要素<clientgen>を使用します。jwsc Antタスクでは、生成されたクライアント・スタブが自動的に呼出し側のWebサービスのWARファイルにパッケージ化されるため、即座にWebサービスからアクセスできるようになります。その後で、標準JAX-WSのプログラミング・ガイドラインに従って、他のWebサービスを呼び出すWebサービスを実装するJWSファイルを作成します。

次の例では、「ユーザー定義のデータ型を使用するWebサービスの作成」で説明されているComplexService WebサービスのechoComplexType操作を呼び出すJWSファイルを記述する方法を示します。

注意:

ComplexService Webサービスは正常にデプロイ済であると想定しています。

1. WebLogic Server環境を設定します。
コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)スクリプトを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2. プロジェクト・ディレクトリを作成します。

prompt> mkdir /myExamples/service_to_service

3. プロジェクト・ディレクトリの下に、srcディレクトリと、JWSおよびクライアント・アプリケーション・ファイル(この手順で後述)のパッケージ名に相当するサブディレクトリを作成します。

prompt> cd /myExamples/service_to_service
prompt> mkdir src/examples/webservices/service_to_service

4. ComplexService Webサービスを呼び出すWebサービスを実装するJWSファイルを作成します。
任意のJava IDEまたはテキスト・エディタを開いて、「サンプルClientServiceImpl.java JWSファイル」で指定されたJavaコードを使用してClientServiceImpl.javaというJavaファイルを作成します。

サンプルJWSファイルでは、1つのパブリック・メソッドcallComplexService()を含むClientServiceImplというJavaクラスが示されています。このJavaクラスでは、後でjwsc Antタスクで生成されるJAX-WSスタブと、BasicStruct JavaBean(同じくclientgenで生成される)をインポートしますが、BasicStruct JavaBeanは、ComplexService WebサービスのechoComplexType操作のパラメータと戻り値のデータ型です。

ClientServiceImpl Javaクラスでは1つのメソッドcallComplexService()を定義しています。このメソッドは、1つのパラメータBasicStructを取り、このパラメータがComplexService WebサービスのechoComplexType操作に渡されます。このメソッドは標準のJAX-WS APIを使用し、jwscによって生成されたスタブを使用して、ComplexServiceのServiceとPortTypeを取得します。その後で、echoComplexType操作を呼び出します。

5. ClientServiceImpl.javaファイルをsrc/examples/webservices/service_to_serviceディレクトリに保存します。

6. プロジェクト・ディレクトリ内に標準のAnt build.xmlファイルを作成して、次のタスクを追加します。

<project name="webservices-service_to_service" default="all">
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
</project>

taskdefタスクでは、jwsc Antタスクの完全なクラス名を定義しています。

この手順で説明される追加のターゲット(clean、deploy、undeploy、client、runなど)が含まれている、完全なサンプルbuild.xmlファイルについては、「ClientServiceをビルドするためのサンプルAntビルド・ファイル」を参照してください。完全なbuild.xmlファイルでは、EARディレクトリの名前を常にハード・コード化して使用するのではなく、${ear-dir}などのプロパティも使用しています。

7. 次のようなjwsc Antタスクの呼出しを、build-serviceターゲット内にラップして、build.xmlファイルに追加します。

<target name="build-service">
<jwsc
srcdir="src"
destdir="output/ClientServiceEar" >
<jws
file="examples/webservices/service_to_service/ClientServiceImpl.java"
type="JAXWS">
<WLHttpTransport
contextPath="ClientService" serviceUri="ClientService"
portName="ClientServicePort"/>
<clientgen
type="JAXWS"
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
packageName="examples.webservices.complex" />
</jws>
</jwsc>
</target>

この例では、jwsc Antタスクの<jws>要素の<clientgen>子要素で、jwscがJWSファイルをコンパイルするだけでなく、WSDLファイルに記述されているWebサービスを呼び出すために必要なクライアント・アーティファクトも生成およびコンパイルすることを指定しています。

この例では、パッケージ名はexamples.webservices.complexに設定され、これはクライアント・アプリケーションのパッケージ名examples.webservices.simple_clientとは異なります。そのため、クライアント・アプリケーションの適切なクラス・ファイルをインポートする必要があります。

import examples.webservices.complex.BasicStruct;
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

パッケージ名がクライアント・アプリケーションと同じパッケージ名に設定されている場合、インポートの呼出しは省略できます。

8. コマンド・ラインでbuild-serviceターゲットを指定して、jwsc Antタスクを実行します。

prompt> ant build-service

9. WebサービスをデプロイするWebLogic Serverインスタンスを起動します。

10. 管理コンソールまたはwldeploy Antタスクを使用して、エンタープライズ・アプリケーションにパッケージ化されたWebサービスをWebLogic Serverにデプロイします。いずれの場合でも、outputディレクトリにあるClientServiceEarエンタープライズ・アプリケーションをデプロイします。
wldeploy Antタスクを使用するには、以下のターゲットをbuild.xmlファイルに追加します。

<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="deploy">
<wldeploy action="deploy" name="ClientServiceEar"
source="ClientServiceEar" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>

wls.username、wls.password、wls.hostname、wls.port、およびwls.server.nameの値は、ご使用のWebLogic Serverインスタンスの対応する値で置き換えます。

deployターゲットを実行して、WARファイルをデプロイします。

prompt> ant deploy

11. ブラウザでWSDLを呼び出して、Webサービスが正しくデプロイされていることをテストします。

http://host:port/ClientService/ClientService?WSDL

Webサービスを呼び出すJavaクライアント・アプリケーションの作成例は、「Java SEアプリケーションからのWebサービスの呼出し」を参照してください。

サンプルClientServiceImpl.java JWSファイル

次に、echoComplexType操作を呼び出す簡単なWebサービス・クライアント・アプリケーションを示します。

package examples.webservices.service_to_service;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.WebServiceRef;

// Import the BasicStruct data type, generated by clientgen and used
// by the ComplexService Web Service
import examples.webservices.complex.BasicStruct;

// Import the JAX-WS stubs generated by clientgen for invoking
// the ComplexService Web service.
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

@WebService(name="ClientPortType", serviceName="ClientService",
targetNamespace="http://examples.org")
public class ClientServiceImpl {
// Use the @WebServiceRef annotation to define a reference to the
// ComplexService Web service.
@WebServiceRef()
ComplexService test;

@WebMethod()
public String callComplexService(BasicStruct input, String serviceUrl)
{
// Create a port stub to invoke ComplexService
ComplexPortType port = test.getComplexPortTypePort();

// Invoke the echoComplexType operation of ComplexService
BasicStruct result = port.echoComplexType(input);
System.out.println("Invoked ComplexPortType.echoComplexType." );
return "Invoke went okay!  Here's the result: '" + result.getIntValue() +
",  " + result.getStringValue() + "'";
}
}

ClientServiceをビルドするためのサンプルAntビルド・ファイル

次のbuild.xmlファイルでは、クライアント・アプリケーションをビルドするタスクが定義されています。この例では、プロパティを使用してファイルを簡素化しています。

以下のbuild.xmlファイルでは、プロパティを使用してファイルを簡素化しています。

<project name="webservices-service_to_service" default="all">
<!-- set global properties for this build -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="ClientServiceEar" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/ClientServiceEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all" depends="clean,build-service,deploy,client" />
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}" >
<jws
file="examples/webservices/service_to_service/ClientServiceImpl.java"
type="JAXWS">
<WLHttpTransport
contextPath="ClientService" serviceUri="ClientService"
portName="ClientServicePort"/>
<clientgen
type="JAXWS"
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
packageName="examples.webservices.complex" />
</jws>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}"
failonerror="false"
user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/ClientService/ClientService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.service_to_service.client"
type="JAXWS"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/service_to_service/client/**/*.java"/>
</target>
<target name="run">
<java classname="examples.webservices.service_to_service.client.Main"
fork="true"
failonerror="true" >
<classpath refid="client.class.path"/>
</java>
</target>
</project>

3 WebLogic Webサービスの開発

この章では、Java API for XML-based Web services (JAX-WS)を使用したWebLogic Webサービスの反復的な開発プロセスについて説明します。

この章では、以下のトピックについて説明します。

- WebLogic Webサービス・プログラミング・モデルの概要

- 高度なWebサービス機能のためのドメインの構成

- Javaから開始するWebLogic Webサービスの開発: 主な手順

- WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順

- 基本的なAnt build.xmlファイルの作成

- jwsc WebLogic WebサービスAntタスクの実行

- wsdlc WebLogic WebサービスAntタスクの実行

- wsdlcで生成される途中まで作成済みのJWS実装クラス・ファイルの更新

- WebLogic Webサービスのデプロイとアンデプロイ

- WebサービスのWSDLの参照

- 動的なWSDLで指定されたサーバー・アドレスの構成

- Webサービスのテスト

- WebサービスのWebLogic分割開発ディレクトリ環境への統合

WebLogic Webサービス・プログラミング・モデルの概要

WebLogic Webサービスのプログラミング・モデルはJWSファイル(JWSアノテーションを使用してWebサービスの形式や動作を指定したJavaファイル)と、JWSファイルを実行するAntタスクを中心に展開されます。JWSアノテーションはJDKバージョン5.0で導入されたメタデータ機能に基づいており(JSR-175 http://www.jcp.org/en/jsr/detail?id=175で規定)、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181)およびJAX-WS仕様(JSR-224)(http://jax-ws.java.net)で定義された標準のアノテーションと追加のアノテーションがあります。サポートされるJWSアノテーションの完全なリストについては、『Oracle WebLogic Server WebLogic Webサービスの紹介』のWebサービスのアノテーション・サポートに関する項を参照してください。このプログラミング・モデルの詳細は、『Oracle WebLogic Server WebLogic Webサービスの紹介』のWebLogic Webサービスの構造に関する項を参照してください。

Webサービスは、2つの開発手法(ボトムアップまたはトップダウン)を使用して作成できます。ボトムアップ開発は、SOAPを使用して基礎となるJava実装からWebサービスを開発するプロセスを意味します。トップダウン開発は、WSDLソースからWebサービスを開発することを意味します。

次の項では、Webサービスを繰返し開発する主要な手順を、Javaから開始する場合(ボトムアップ)、または既存のWSDLファイルから開始する場合(トップダウン)について説明します。

- Javaから開始するWebLogic Webサービスの開発: 主な手順

- WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順

反復的な開発とは、希望どおりに動作するまで、Webサービスを繰返しコーディング、コンパイル、パッケージ化、デプロイ、およびテストできるように、開発環境を設定することです。WebLogic Webサービス・プログラミング・モデルでは、Antタスクを使用して、反復的な開発のほとんどの手順を実行します。一般に、すべての手順に対応するターゲットを含んだ1つのbuild.xmlファイルを作成して、そのターゲットを繰返し実行し、JWSファイルを新しいJavaコードで更新したら、その更新が期待どおりに動作することをテストします。

このセクションで説明されているコマンド・ライン・ツールの他に、Webサービスを開発するためにOracle JDeveloperまたはOracle Enterprise Pack for Eclipse (OEPE)のようなIDEを使用できます。詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービスをビルドするためのOracle IDEの使用に関する項を参照してください。

高度なWebサービス機能のためのドメインの構成

ドメインを作成または拡張する際には、JAX-WS拡張用のWebLogicの高度なWebサービス・テンプレート(wls_webservice_jaxws.jar)を適用して、次に示す高度なWebサービス機能のサポートに必要なリソースを自動的に構成できます。

- 非同期メッセージング

- Webサービスの信頼性のあるメッセージング

- メッセージ・バッファリング

- WS-SecureConversationを使用したセキュリティ

この拡張テンプレートの使用は必須ではありませんが、必要なリソースの構成が非常に簡単になります。また、これらの拡張機能に必要なリソースを、Oracle WebLogic管理コンソールやWLSTを使用して手動で構成することも可能です。

注意:

拡張テンプレートを使用してドメインを構成する場合、WS-SecureConversationを使用するJAX-WS WebサービスにはAdvanced JAX-WSテンプレート(wls_webservice_jaxws)が必要です。

次の手順では、高度なWebサービス機能用にドメインを自動的に構成する方法を説明します。構成ウィザードを使用してWebLogic Serverドメインを作成および更新する詳細な手順については、『構成ウィザードによるドメインの作成』を参照してください。

- 高度なWebサービス機能に必要なリソース

- 高度なWebサービス機能用にドメインを拡張するスクリプト

- 高度なWebサービス機能のための構成ウィザードを使用したドメインの構成

- Webサービス拡張テンプレートを使用したドメイン拡張でのWLSTの利用

- ドメインの拡張後に追加されたリソースの更新

- WebLogic Advanced Web Services for JAX-WS拡張テンプレートを適用するときの問題に関するトラブルシューティング

高度なWebサービス機能に必要なリソース

表3-1に、JAX-WS拡張用のWebLogicの高度なWebサービス・テンプレートを使用する際に自動的に定義されるリソースをリストします。

拡張テンプレートを適用しない場合は、Oracle WebLogic管理コンソールまたはWLSTを使用して、リソースを手動で構成する必要があります。JMSターゲット指定は、必ず『Oracle WebLogic Server JMSの構成と管理』のJMS初級ユーザーおよび上級ユーザーのベスト・プラクティスに関する項で定義されているベスト・プラクティスに従って構成してください。具体的には:

- 各WebLogic Serverに、JMSサーバー、ストア・アンド・フォワード(SAF)サービス・エージェントおよび永続ストアを構成します。クラスタで、それぞれをローカルの移行可能なターゲット(サーバー以外)にターゲット指定します。ほとんどの場合、そのホスト・サーバーのデフォルトの移行可能ターゲットを指定すれば十分です。

- JMSモジュールをクラスタ(クラスタ環境を使用していない場合は単一サーバー)のターゲットに指定します。

- モジュールにつき厳密に1つのサブデプロイメントを作成し、そのサブデプロイメントを適用可能なJMSサーバーまたはSAFエージェントにのみ(サーバーはではない)に移入します。

- サブデプロイメントに対してJMS宛先をターゲット指定します(管理コンソールでは高度なターゲット指定とも呼ばれます)。JMS宛先にはデフォルトのターゲット指定オプションは決して使用しないでください。

表では次の変数が使用されます。

- server_designator - 構成フレームワークにより自動的に生成されるIDを指定します。通常、このIDはauto_numberという形式です。

- uniqueID - 構成フレームワークにより自動的に生成される一意の数値IDを指定します。通常、このIDは1234などの数値です。

- server_name - ユーザー指定のサーバー名を指定します。

注意:

実行時にリソース名を変更しないでください。変更すると、実行時エラーやデータ損失が発生する可能性があります。

この表に示すように、一部のリソースは今後使用予定であるため予約されています。

表3-1 高度なWebサービス機能に必要なリソース

リソース名

リソースの種類

説明

WseeJaxwsJmsModule

JMSモジュール

高度なWebサービスに必要なJMSリソースを定義するJMSモジュールを定義します。このJMSモジュールの関連するすべてのターゲット(サーバーをターゲットとするJMSサーバー)がJAX-WS Webサービスのサポートに使用されます。このモジュールがターゲットとするすべてのサーバーには、適切なWebサービス・リソースが構成されている必要があります。

このモジュールは、ドメイン内のすべてのサーバーにターゲット設定することをお薦めします。

注意: 共通分散宛先(UDD)としてJMSモジュールを構成する必要があります。JAX-WSでWebサービスが使用するすべてのキューは共通分散宛先である必要があります。それ以外の場合は、例外がスローされます。

分散宛先を手動で構成する方法および詳細は、『Oracle WebLogic Server JMSのプログラミング』の分散宛先の使用に関する項を参照してください。

WseeJaxwsFileStore_server_designator

ファイル・ストア

WebLogic Serverが使用してI/O操作を処理し、物理ストレージ(ファイル、DBMSなど)にデータを保存したり、取得したりするファイル・ストアまたは物理ストアを指定します。

server_designatorで指定されているように、WseeJaxwsJmsModuleでターゲット設定されている各管理対象サーバーに個別のファイル・ストアが構成されます。単一のサーバー・ドメインのファイル・ストアの名前はWseeJaxwsFileStoreです。

注意: ファイル・ストアは移行可能なターゲットにターゲット設定することをお薦めします。

ファイル・ストアを手動で構成する方法は、『Oracle WebLogic Serverサーバー環境の構成』のWebLogic永続ストアの使い方に関する項を参照してください。

WseeJaxwsJmsServer_server_designator

JMSサーバー

JMSサーバー管理コンテナを指定します。server_designatorで指定されているように、WseeJaxwsJmsModuleのターゲットである各管理対象サーバーに個別のJMSサーバーが構成されます。JMSサーバーは、WseeFileStore_server_designatorをファイル・ストアとして使用します。

JMSサーバーを構成する際には、次のことをお薦めします。

- JMSサーバーを移行可能なターゲットにターゲット指定します。

- 各JMSサーバーで現実的な割当てを設定します。詳細は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』のWebLogic JMSのチューニングに関する項を参照してください。

JMSサーバーを手動で構成する方法は、『Oracle WebLogic Server JMSの構成と管理』のJMS構成に関する項を参照してください。

WseeJaxwsJmsServeruniqueID

JMSサブデプロイメント

クラスタのすべての管理対象サーバーに定義されているJMSサーバーをターゲットとするJMSサブデプロイメントを指定します。

JMSサブデプロイメントを手動で構成する方法は、Oracle WebLogic Server管理コンソール・ヘルプのJMSシステム・モジュールへのサブデプロイメントの構成に関する項を参照してください。

weblogic.wsee.jaxws.mdb.DispatchPolicy

ワーク・マネージャ

アプリケーションがコンテナ内で複数の作業アイテムを同時に実行できるようにします。ドメインにワーク・マネージャが生成されると、WseeJaxwsJmsModuleのターゲットであるすべてのサーバーがターゲットになります。

注意: ワーク・マネージャ・リソースの名前は変更しないでください。

ワーク・マネージャを手動で構成する方法は、『Oracle WebLogic Server Timer and Work Manager API (CommonJ)プログラマーズ・ガイド』のワーク・マネージャAPIの説明に関する項を参照してください。

ReliableWseeJaxwsSAFAgent_server_name

SAFサービス・エージェント

可用性の高いJMSメッセージ生成を可能にします。server_nameで指定するように、各管理対象サーバーに個別のSAFエージェントが構成されます。SAFエージェントは、ファイル・ストアとしてWseeFileStore_server_nameを使用します。

1つのサーバー・ドメインで、SAFエージェントはReliableWseeJaxwsSAFAgentという名前になります。

SAFエージェントを構成する際には、各JMSサーバーで現実的な割当を設定することをお薦めします。詳細は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』のWebLogic JMSのチューニングに関する項を参照してください。

SAFサービス・エージェントを構成するには、『Oracle WebLogic Serverストア・アンド・フォワードの構成と管理』のストア・アンド・フォワード・サービスの理解に関する項を参照してください。

WseeBufferedRequestQueue_server_designator

JMSキュー

バッファされたリクエストに使用するキューを指定します。server_nameで指定するように、各管理対象サーバーに個別のキューが構成されます。

単一のサーバー・ドメインでは、キューはWseeBufferedRequestQueueという名前になります。クラスタ・ドメインでは、各JMSキューの先頭にdist_という接頭辞が付きます。

キューを手動で構成する方法は、Oracle WebLogic Server管理コンソール・ヘルプのキューの構成に関する項を参照してください。

WseeBufferedRequestErrorQueue_server_designator

JMSキュー

最大試行回数内に処理できないバッファされたリクエストのWseeBufferedRequestQueueに使用するエラー・キューを指定します。server_nameで指定するように、各管理対象サーバーに個別のキューが構成されます。

単一のサーバー・ドメインでは、キューはWseeBufferedRequestErrorQueueという名前になります。クラスタ・ドメインでは、各JMSキューの先頭にdist_という接頭辞が付きます。

キューを手動で構成する方法は、Oracle WebLogic Server管理コンソール・ヘルプのキューの構成に関する項を参照してください。

WseeBufferedResponseQueue_server_designator

JMSキュー

バッファされたレスポンスに使用するキューを指定します。server_designatorで指定するように、各管理対象サーバーに個別のキューが構成されます。

単一のサーバー・ドメインでは、キューはWseeBufferedResponseQueueという名前になります。クラスタ・ドメインでは、各JMSキューの先頭にdist_という接頭辞が付きます。

キューを手動で構成する方法は、Oracle WebLogic Server管理コンソール・ヘルプのキューの構成に関する項を参照してください。

WseeBufferedResponseErrorQueue_server_designator

JMSキュー

最大再試行回数内で配信できないバッファされたレスポンス用にWseeBufferedResponseQueueに使用するエラー・キューを指定します。server_designatorで指定するように、各管理対象サーバーに個別のキューが構成されます。

単一のサーバー・ドメインでは、キューはWseeBufferedResponseErrorQueueという名前になります。クラスタ・ドメインでは、各JMSキューの先頭にdist_という接頭辞が付きます。

キューを手動で構成する方法は、Oracle WebLogic Server管理コンソール・ヘルプのキューの構成に関する項を参照してください。

WseeStore

論理ストア

論理ストアを定義します。WseeJaxwsJmsModuleのターゲットである各管理対象サーバーに個別の論理ストアが構成されます。論理ストアは構成およびファイル・ストアにWseeBufferedRequestQueueキューを指定します。

論理ストアを手動で構成するには、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』の論理ストアの手動による構成に関する項を参照してください。

高度なWebサービス機能用にドメインを拡張するスクリプト

WebLogic Advanced Web Services for JAX-WS拡張テンプレート(wls_webservice_jaxws.jar)のJARファイルには、既存のドメインを拡張してWebLogic Advanced Web Services for JAX-WS拡張テンプレートを使用する場合に役立つ次の2つのPythonスクリプトがあります。

注意:

いずれかのスクリプトを実行する前に、JMSモジュールがドメイン内のすべてのサーバーにターゲット設定されていることを確認する必要があります。

表3-2 高度なWebサービス機能用にドメインを拡張するスクリプト

スクリプト

説明

wls_webservice_complete_update_utils.py

WLSTスクリプト内から拡張テンプレートを使用してドメインを拡張できます。詳細および例については、「Web Services拡張テンプレートでドメインを拡張するためのWLSTの使用」を参照してください。

wls_webservice_complete_update.py

Javaのコマンド・ラインから拡張テンプレートを使用してドメインを拡張できます。例:

java weblogic.WLST -i wls_webservice_complete_update.py <domain-dir>

高度なWebサービス機能のための構成ウィザードを使用したドメインの構成

次の項では、高度なWebサービス機能のためにドメインを構成する方法について説明します。

- Webサービス拡張テンプレートを使用したドメインの作成

- Webサービス拡張テンプレートを使用したドメインの拡張

Webサービス拡張テンプレートを使用したドメインの作成

高度なWebサービス機能用に自動的に構成されるドメインを作成するには:

1. 構成ウィザードを起動します。

2. 「ようこそ」ウィンドウで、「新しいWebLogicドメインの作成」を選択します。

3. 「次へ」をクリックします。

4. 「次の製品をサポートするために、自動的に構成されたドメインを生成する」を選択し、JAX-WS拡張用のWebLogicの高度なWebサービスを選択します。

5. 「次へ」をクリックします。

6. ドメインの名前と場所を入力し、「次へ」をクリックします。

7. 管理者ユーザーの名前とパスワードを構成し、「次へ」をクリックします。

8. サーバーの起動モードとJDKを構成し、「次へ」をクリックします。

9. 追加のサーバーおよびクラスタを構成するには:

1. 管理対象サーバーおよびクラスタを定義するには、「オプションの構成を選択」画面で、少なくとも「管理対象サーバー、クラスタ、およびマシン」を選択します。必要に応じて、その他のアイテムを選択し「次へ」をクリックします。

2. 環境の管理対象サーバーを構成し、「次へ」をクリックします。

3. 環境のクラスタを構成し、「次へ」をクリックします。

4. 「クラスタに割当て」画面でクラスタに管理対象サーバーを割り当て、「次へ」をクリックします。

5. 環境のマシンを構成し、「次へ」をクリックします。

6. 「サービスのクラスタまたはサーバーへのターゲット設定」画面で環境に定義されているサービスをクラスタにターゲット設定し、「次へ」をクリックします。
注意: WseeJaxwsJmsModule JMSモジュールおよびweblogic.wsee.jaxws.mdb.DispatchPolicyワーク・マネージャは、クラスタ内のすべてのサーバーにターゲット設定してください。

この画面でターゲット設定されたサーバーは、高度なWebサービスで使用するために完全に構成されます。

7. (ステップ9aで選択した場合は)残りの構成画面でその他の情報を構成し、「次へ」をクリックします。

10. 「構成のサマリー」画面が表示されたら、ドメインの詳細を検証して「作成」をクリックします。

Webサービス拡張テンプレートを使用したドメインの拡張

既存のドメインを拡張してこれらのWebサービス機能用に自動的に構成するには:

1. 構成ウィザードを起動します。

2. 「ようこそ」ウィンドウで、「既存のWebLogicドメインの拡張」を選択します。

3. 「次へ」をクリックします。

4. 拡張テンプレートを適用するドメインを選択します。

5. 「次へ」をクリックします。

6. 「次の追加製品をサポートするために、自動的にドメインを拡張する」を選択し、JAX-WS拡張用のWebLogicの高度なWebサービスを選択します。

7. 「次へ」をクリックします。

8. 追加のサーバーおよびクラスタを構成するには:

1. 管理対象サーバーおよびクラスタを定義するには、「オプションの構成を選択」画面で、少なくとも「管理対象サーバー、クラスタ、およびマシン」を選択します。必要に応じて、その他のアイテムを選択し「次へ」をクリックします。

2. 環境の管理対象サーバーを構成し、「次へ」をクリックします。

3. 環境のクラスタを構成し、「次へ」をクリックします。

4. 「クラスタに割当て」画面でクラスタに管理対象サーバーを割り当て、「次へ」をクリックします。

5. 環境のマシンを構成し、「次へ」をクリックします。

6. 「サービスのクラスタまたはサーバーへのターゲット設定」画面で環境に定義されているサービスをクラスタにターゲット設定し、「次へ」をクリックします。
注意: WseeJaxwsJmsModule JMSモジュールおよびweblogic.wsee.jaxws.mdb.DispatchPolicyワーク・マネージャは、クラスタ内のすべてのサーバーにターゲット設定してください。

この画面でターゲット設定されたサーバーは、高度なWebサービスで使用するために完全に構成されます。

7. (ステップ9aで選択した場合は)残りの構成画面でその他の情報を構成し、「次へ」をクリックします。

9. 拡張するドメインが正しいことを確認して「拡張」をクリックします。

10. 終了するには「完了」をクリックします。

Webサービス拡張テンプレートを使用したドメイン拡張でのWLSTの利用

次に、Webサービス拡張テンプレートを使用してドメインを拡張する際にWLSTを使用する方法の例を示します。特にこの例では、単一のサーバー・ドメインを拡張する方法について説明します。すでに単一のサーバー・ドメインを作成済であることを前提としています。次のサンプル・スクリプトで示されている場所に、サーバーおよびクラスタを追加できます。

スクリプトを更新し、ドメインに対して実行したら、すべてのリソースが高度なWebサービス機能用に構成されます。

詳細は、サンプルに記載されているコメントを確認してください。記述されているWLSTコマンドの詳細は、『Oracle WebLogic Scripting Tool』を参照してください。

注意:

この例の最後で使用されているwls_webservice_complete_update_utils.pyスクリプトは、Webサービス拡張テンプレートを使用してドメインを拡張する際にドメイン・ディレクトリに追加されます。

例3-1 Webサービス拡張テンプレートを使用したドメイン拡張のためのWLSTスクリプト

# Read the domain.
readDomain(single_server_domain_dir)

# Apply the template to the domain to configure the servers for advanced Web service features.
installDir = install_directory/wlserver_10.3
templateLocation = installDir + '/common/templates/applications/wls_webservice_jaxws.jar'
addTemplate(templateLocation)

# Save and close the domain
updateDomain()
closeDomain()

# Read the domain
readDomain(domain_dir)

# Optionally create any servers and clusters required in your domain environment.
# <Include create calls here . . . >
# For example: create('server1','Server') or create('cluster1','Cluster')

# Optionally configure the JMS module as a Uniform Distributed Destination (Recommended)
setDistDestType('WseeJaxwsJmsModule', 'UDD')

# Target WseeJaxwsJmsModule to the desired servers and clusters.
assign('JMSSystemResource', 'WseeJaxwsJmsModule', 'Target', server_or_cluster)
# Repeat assign call for other servers and clusters in the environment.

# Unassign the resource from the Administration Server.
unassign('JMSSystemResource', 'WseeJaxwsJmsModule', 'Target', Administration_Server)

sys.path.append(domain_dir)

# Import the wls_webservice_complete_update_utils.py script. This script is added to the domain directory
# when you extend the domain using the Web services extension template.
import wls_webservice_complete_update_utils as update
update.doWseeFixup(globals())

# Save and close the domain
updateDomain()
closeDomain()

ドメインの拡張後に追加されたリソースの更新

JAX-WS拡張用のWebLogicの高度なWebサービス・テンプレートを使用してドメインを作成または拡張した後に、ドメインでリソースを変更すると、次のWLSTスクリプトを使用してこれらのリソースの構成を迅速かつ簡単に更新できます。

スクリプトを更新し、ドメインに対して実行したら、すべてのリソースが高度なWebサービス機能用に構成されます。

注意:

この例の最後で使用されているwls_webservice_complete_update_utils.pyスクリプトは、Webサービス拡張テンプレートを使用してドメインを拡張する際にドメイン・ディレクトリに追加されます。

詳細は、サンプルに記載されているコメントを確認してください。記述されているWLSTコマンドの詳細は、『Oracle WebLogic Scripting Tool』を参照してください。

例3-2 ドメインの拡張後に追加されたリソースを更新するためのWLSTスクリプト

# Read the domain.
readDomain(domain_dir)

# Optionally configure the JMS module as a Uniform Distributed Destination (Recommended)
setDistDestType('WseeJaxwsJmsModule', 'UDD')

# Target WseeJaxwsJmsModule to the desired servers and clusters.
assign('JMSSystemResource', 'WseeJaxwsJmsModule', 'Target', server_or_cluster_name)
# Repeat assign call for other servers and clusters in the environment.

# Unassign the resource from the Administration Server.
unassign('JMSSystemResource', 'WseeJaxwsJmsModule', 'Target', Administration_Server_name)

sys.path.append(domain_dir)

# Import the wls_webservice_complete_update_utils.py script. This script is added to the domain directory
# when you extend the domain using the Web services extension template.
import wls_webservice_complete_update_utils as update
update.doWseeFixup(globals())

# Save and close the domain.
updateDomain()

WebLogic Advanced Web Services for JAX-WS拡張テンプレートを適用するときの問題に関するトラブルシューティング

WebLogic Advanced Web Services for JAX-WS拡張テンプレート(wls_webservice_jaxws.jar)を使用してドメインを作成または拡張するとき、次に類似したケースとしてfinal.pyスクリプトの実行中に例外が発生する場合があります。

2011-02-24 15:36:26,730 WARN  [Thread-32]
com.oracle.cie.domain.script.ScriptExecutor - warn: set obj126 attribute
Targets to "new_Cluster_1, new_Cluster_2, new_Cluster_3, new_Cluster_4,
new_Cluster_5, new_Cluster_6"
com.oracle.cie.domain.script.ScriptException: Unable to find attribute Targets
...

この問題を回避するには、次の手順に従います。

1. 次のファイルを、WL_HOME/common/templates/applications以外のディレクトリにバックアップします。
WL_HOME/common/templates/applications/wls_webservice_jaxws.jar

たとえば、ファイルをWL_HOME/common/templates/applications/backupにコピーします。

2. script/final.pyファイルをWL_HOME/common/templates/applications/wls_webservice_jaxws.jarファイルから削除します。
Winzipなどのグラフィカル・ツールを使用するか、または次に示すコマンドラインを使用してこれを実行できます。

1. WL_HOME/common/templates/applicationsディレクトリの直下にtempディレクトリを作成します。

2. tempディレクトリにcdします。

3. WL_HOME/common/templates/applications/wls_webservice_jaxws.jarファイル(オリジナル・コピー)をJAR解除します。例:

jar -xvf  ../wls_webservice_jaxws.jar

4. script/final.pyファイルをディレクトリから削除します。

5. オリジナルJARファイルを削除します。例:

rm ../wls_webservice_jaxws.jar

6. wls_webservice_jaxws.jarでJarファイルを作成します。例:

jar cvf  ../wls_webservice_jaxws.jar *

3. 次の手順を実行し、Javaコマンドラインから拡張テンプレートを使用してドメインを拡張します。

1. ドメイン・ディレクトリにcdします。

2. wls_webservice_complete_update.pyスクリプトを実行します。例:

java weblogic.WLST -i wls_webservice_complete_update.py  .

wls_webservice_complete_update.pyスクリプトの詳細は、「高度なWebサービス機能用にドメインを拡張するスクリプト」を参照してください。

Javaから開始するWebLogic Webサービスの開発: 主な手順

このセクションでは、Javaから開始してWebLogic Webサービスを開発する一般的な手順(JWSファイルを最初からコーディングして、サービスについて記述するWSDLファイルを後で生成する手順)について説明します。このプロセスの具体的な例については、第2章「ユース・ケースとサンプル」を参照してください。

次に示すのは推奨の手順にすぎません。独自の開発環境を設定してある場合は、WebLogic Webサービスを開発するために既存の環境を更新する際のガイドとして、この手順を利用できます。

注意:

この手順では、WebLogic Webサービスの分割開発ディレクトリ環境は使用しません。この開発環境を使用していて、Webサービスの開発をそこに統合する場合の詳細は、「WebサービスのWebLogic分割開発ディレクトリ環境への統合」を参照してください。

表3-3 Javaから開始するWebサービスの開発手順

#

手順

説明

1

環境を設定します。

コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)コマンドを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2

プロジェクト・ディレクトリを作成します。

JWSファイル、ユーザー定義のデータ型のJavaソース、Ant build.xmlファイルが格納されるプロジェクト・ディレクトリを作成します。このディレクトリには自由に名前を付けることができます。

3

Webサービスを実装するJWSファイルを作成します。

第4章「JWSファイルのプログラミング」を参照してください。

4

ユーザー定義のデータ型を作成する(オプション)

Webサービスでユーザー定義のデータ型を使用する場合は、その型を記述したJavaBeanを作成します。「ユーザー定義のJavaデータ型のプログラミング」を参照してください。

5

基本のAntビルド・ファイルbuild.xmlを作成します。

「基本的なAnt build.xmlファイルの作成」を参照してください。

6

JWSファイルに対してjwsc Antタスクを実行します。

ソース・コード、データ・バインディング・アーティファクト、デプロイメント記述子などがjwsc Antタスクによって出力ディレクトリ内に生成されます。この出力ディレクトリには、エンタープライズ・アプリケーションのディレクトリ構造も生成されます。この展開されたディレクトリは、後で反復的な開発プロセスの一環としてWebLogic Serverにデプロイします。「jwsc WebLogic WebサービスAntタスクの実行」を参照してください。

7

WebサービスをWebLogic Serverにデプロイします。

「WebLogic Webサービスのデプロイとアンデプロイ」を参照してください。

8

WebサービスのWSDLを参照します。

WebサービスのWSDLを参照して、Webサービスが適切にデプロイされたことを確認します。「WebサービスのWSDLの参照」を参照してください。

9

Webサービスをテストします。

「Webサービスのテスト」を参照してください。

10

Webサービスを編集します。(オプション)

Webサービスに変更を加えるには、JWSファイルを更新し、「WebLogic Webサービスのデプロイとアンデプロイ」の説明のとおりにWebサービスをアンデプロイしてから、jwsc Antタスクの実行(ステップ6)から始まる手順を繰り返します。

Webサービスを呼び出すクライアント・アプリケーションの記述の詳細は、第6章「Webサービスの呼出し」を参照してください。

WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順

このセクションでは、既存のWSDLファイルに基づいてWebLogic Webサービスを開発する一般的な手順について説明します。このプロセスの具体的な例は、第2章「ユース・ケースとサンプル」を参照してください。

次に示すのは推奨の手順にすぎません。独自の開発環境を設定してある場合は、WebLogic Webサービスを開発するために既存の環境を更新する際のガイドとして、この手順を利用できます。

この手順では既存のWSDLファイルがすでにあることを前提としています。

注意:

この手順では、WebLogic Webサービスの分割開発ディレクトリ環境は使用しません。この開発環境を使用していて、Webサービスの開発をそこに統合する場合の詳細は、「WebサービスのWebLogic分割開発ディレクトリ環境への統合」を参照してください。

表3-4 Javaから開始するWebサービスの開発手順

#

手順

説明

1

環境を設定します。

コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)コマンドを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2

プロジェクト・ディレクトリを作成します。

生成されるアーティファクトやAnt build.xmlファイルが格納されるプロジェクト・ディレクトリを作成します。

3

基本のAntビルド・ファイルbuild.xmlを作成します。

「基本的なAnt build.xmlファイルの作成」を参照してください。

4

WSDLファイルを、build.xml Antビルド・ファイルから読取り可能なディレクトリに置きます。

たとえば、WSDLファイルをプロジェクト・ディレクトリのwsdl_files子ディレクトリに置くことができます。

5

WSDLファイルに対してwsdlc Antタスクを実行します。

JWSサービス・エンドポイント・インタフェース(SEI)、途中まで作成済みのJWSクラス・ファイル、XMLスキーマ・データ型を表すJavaBeanなどが、wsdlc Antタスクによって出力ディレクトリ内に生成されます。「wsdlc WebLogic WebサービスAntタスクの実行」を参照してください。

6

wsdlc Antタスクにより生成された途中まで作成済みのJWSファイルを更新します。

wsdlc Antタスクでは途中まで作成済のJWSファイルが生成されます。Webサービスが希望どおりに動作するようにするには、独自のビジネス・コードを追加する必要があります。「wsdlcで生成される途中まで作成済のJWS実装クラス・ファイルの更新」を参照してください。

7

JWSファイルに対してjwsc Antタスクを実行します。

wsdlc Antタスクによって生成されたアーティファクトと更新したJWS実装ファイルを指定して、Webサービスを実装するエンタープライズ・アプリケーションを生成します。「jwsc WebLogic WebサービスAntタスクの実行」を参照してください。

8

WebサービスをWebLogic Serverにデプロイします。

「WebLogic Webサービスのデプロイとアンデプロイ」を参照してください。

9

WebサービスのWSDLを参照します。

WebサービスのWSDLを参照して、Webサービスが適切にデプロイされたことを確認します。「WebサービスのWSDLの参照」を参照してください。

10

Webサービスをテストします。

「Webサービスのテスト」を参照してください。

11

Webサービスを編集します。(オプション)

Webサービスに変更を加えるには、JWSファイルを更新し、「WebLogic Webサービスのデプロイとアンデプロイ」の説明のとおりにWebサービスをアンデプロイしてから、jwsc Antタスクの実行(ステップ6)から始まる手順を繰り返します。

Webサービスを呼び出すクライアント・アプリケーションの記述の詳細は、第6章「Webサービスの呼出し」を参照してください。

基本的なAnt build.xmlファイルの作成

Antでは、<project>ルート要素と、Webサービス開発プロセスの様々な段階を指定した1つまたは複数のターゲットが含まれている、XMLで記述されたビルド・ファイル(デフォルト名はbuild.xml)を使用します。各ターゲットには、1つまたは複数のタスク、または実行可能なコードが含まれています。このセクションでは、基本的なAntビルド・ファイルの作成方法について説明し、その後のセクションでは、Webサービス開発プロセスの様々な段階(jwsc Antタスクを実行してJWSファイルを処理する、WebサービスをWebLogic Serverにデプロイする、など)の実行方法を指定したターゲットをビルド・ファイルに追加する方法について説明します。

以下のスケルトンのbuild.xmlファイルでは、以降の項で追加される他のすべてのターゲットを呼び出す、デフォルトのallターゲットを指定しています。

<project default="all">
<target name="all"
depends="clean,build-service,deploy" />
<target name="clean">
<delete dir="output" />
</target>
<target name="build-service">
<!--add jwsc and related tasks here -->
</target>
<target name="deploy">
<!--add wldeploy task here -->
</dftarget>
</project>

jwsc WebLogic WebサービスAntタスクの実行

jwsc Antタスクは、JWSアノテーションを含むJWSファイルを入力として使用し、WebLogic Webサービスの作成に必要なアーティファクトをすべて生成します。JWSファイルは、最初から自分でコーディングしたものでも、wsdlc Antタスクによって生成されたものでもかまいません。jwscによって生成されるアーティファクトには、次のものがあります。

- JSR-109 Webサービス・クラス・ファイル。

- JAXBデータ・バインディング・アーティファクト・クラス・ファイル。

- 必要な全デプロイメント記述子。以下を含みます。

- サーブレット・ベースのWebサービス・デプロイメント記述子ファイル(web.xml)。

- Earデプロイメント記述子ファイルapplication.xmlおよびweblogic-application.xml。

注意:

WSDLファイルは、サービス・エンドポイントのデプロイ時に生成されます。

これらのアーティファクトは、wsdlc Antタスクによってすでに生成され、JARファイル内にパッケージ化されているため、wsdlc Antタスクによって生成されたJWSファイルに対してjwsc Antタスクを実行しても、jwscタスクによってはアーティファクトは生成されません。この場合、jwsc Antタスクの属性を使用して、このwsdlc生成JARファイルを指定します。

必要なアーティファクトをすべて生成した後、jwsc Antタスクは、Javaファイル(JWSファイルも含む)をコンパイルし、コンパイルされたクラスと生成されたアーティファクトを、デプロイ可能なJARアーカイブ・ファイルにパッケージ化して、最後に、そのJARファイルを格納する、展開されたエンタープライズ・アプリケーション・ディレクトリを作成します。

jwsc Antタスクを実行するには、以下のtaskdefおよびbuild-serviceターゲットをbuild.xmlファイルに追加します。

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-service">
<jwsc
srcdir="src_directory"
destdir="ear_directory"
>
<jws file="JWS_file"
compiledWsdl="WSDLC_Generated_JAR"
type="WebService_type"/>
</jwsc>
</target>

ここで:

- ear_directory - 生成されたすべてのアーティファクトを格納するエンタープライズ・アプリケーション・ディレクトリ。

- src_directory - JWSファイルのパッケージ名に対応するサブディレクトリを含む最上位ディレクトリ。

- JWS_file - src_directory属性の値に対して相対的なJWSファイルのパス名。

- WSDLC_Generated_JAR - JWS SEIと、既存のWSDLファイルに対応するデータ・バインディング・アーティファクトが含まれる、wsdlc Antタスクによって生成されたJARファイル。

注意:

この属性は、「WSDLから開始する」ユース・ケースでのみ指定します。この手順は「WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順」で説明されています。

- WebService_type - Webサービスの種類。この値は、JAXWSまたはJAXRPCに設定できます。

必須のtaskdef要素では、jwsc Antタスクの完全修飾クラス名を指定します。

jwsc Antタスクのsrcdirおよびdestdir属性のみが必須です。つまり、デフォルトでは、JWSファイルが参照するJavaファイル(JavaBean入力パラメータやユーザー定義の例外など)はJWSファイルと同じパッケージ内にあると想定されています。これに当てはまらない場合は、sourcepath属性を使用して、これらの他のJavaファイルの最上位ディレクトリを指定します。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のjwscに関する項を参照してください。

jwscの使用例

以下のbuild.xmlの抜粋では、JWSファイルに対してjwsc Antタスクを実行する基本的な例を示します。

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-service">
<jwsc
srcdir="src"
destdir="output/helloWorldEar">
<jws
file="examples/webservices/hello_world/HelloWorldImpl.java"
type="JAXWS"/>
</jwsc>
</target>

この例では:

- カレント・ディレクトリに対して相対的なoutput/helloWorldEarに、エンタープライズ・アプリケーションが展開形式で生成されます。

- JWSファイルはHelloWorldImpl.javaという名前で、カレント・ディレクトリに対して相対的なsrc/examples/webservices/hello_worldディレクトリにあります。つまり、JWSファイルはパッケージexamples.webservices.helloWorld内にあります。

- JAX-WS Webサービスが生成されます。

以下の例は前の例と似ていますが、compiledWsdl属性を使用して、wsdlcが生成したアーティファクト(「WSDLから開始する」ユース・ケース)を含むJARファイルを指定している点が異なります。

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-service">
<jwsc
srcdir="src"
destdir="output/wsdlcEar">
<jws
file="examples/webservices/wsdlc/TemperaturePortTypeImpl.java"
compiledWsdl="output/compiledWsdl/TemperatureService_wsdl.jar"
type="JAXWS"/>
</jwsc>
</target>

この例では、TemperaturePortTypeImpl.javaファイルが、独自のビジネス・ロジックを含めて更新した、途中まで作成されていたJWSファイルです。compiledWsdl属性が指定されてJARファイルを指し示しているので、jwsc Antタスクでは、JARに含まれているアーティファクトを再生成することはありません。

このタスクを実際に実行するには、コマンド・ラインで次のように入力します。

prompt> ant build-service

jwscの高度な使用方法

この項では、jwsc Antタスクの非常に簡単な使用例を紹介します。ただし、このタスクには、非常に有用なツールにするための追加の属性と子要素を含めます。以下のような使用方法が考えられます。

- 複数のJWSファイルを一度に処理します。生成されたWebサービスをそれぞれ別のWebアプリケーションWARファイルにパッケージ化するか、すべてのWebサービスをグループ化して1つのWARファイルにパッケージ化するかを選択できます。

- Webサービスの呼出し時にクライアント・アプリケーションが使用できるトランスポート手段(HTTP/HTTPS)を指定します。

- 新しいエンタープライズ・アプリケーションまたはWebアプリケーションを生成するのではなく、既存のアプリケーションを更新します。

jwsc Antタスクの詳細および例については、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のjwscに関する項を参照してください。

wsdlc WebLogic WebサービスAntタスクの実行

wsdlc AntタスクはWSDLファイルを入力として処理し、WebLogic Webサービスの実装を構成するアーティファクトを生成します。次のようなアーティファクトがあります。

- WSDLファイルで記述されたWebサービスを実装するJWSサービス・エンドポイント・インタフェース(SEI)。

- 生成されるJWS SEIの不完全な(途中まで作成済みの)実装が含まれるJWS実装ファイル。このファイルは開発者がカスタマイズする必要があります。

- JAXBデータ・バインディング・アーティファクト。

- (オプション)生成されるJWS SEIのJavadoc。

wsdlc AntタスクはJWS SEIとデータ・バインディング・アーティファクトを一緒にJARファイルにパッケージ化します。このJARファイルを後でjwsc Antタスクに指定します。このJARファイルを更新する必要はありません。更新するファイルはJWS実装クラスのみです。

wsdlc Antタスクを実行するには、以下のtaskdefおよびgenerate-from-wsdlターゲットをbuild.xmlファイルに追加します。

<taskdef name="wsdlc"
classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>
<target name="generate-from-wsdl">
<wsdlc
srcWsdl="WSDLFile"
destJwsDir="JWS_interface_directory"
destImplDir="JWS_implementation_directory"
packageName="Package_name"
type="WebService_type"/>
</target>

ここで:

- WSDLFile - 部分的な実装を生成する元となるWSDLファイルの名前(絶対パスまたは相対パスを含める)。

- JWS_interface_directory - JWS SEIおよびデータ・バインディング・アーティファクトを含むJARファイルの生成先となるディレクトリ。
生成されるJARファイルの名前はWSDLFile_wsdl.jarです(WSDLFileはWSDLファイルのルート名)。たとえば、file属性に対して指定したWSDLファイルの名前がMyService.wsdlの場合、生成されるJARファイルはMyService_wsdl.jarとなります。

- JWS_implementation_directory - 途中まで作成済みのJWS実装ファイルの生成先となる最上位ディレクトリ。ファイルはパッケージ名に対応するサブディレクトリ階層に生成されます。
生成されるJWSファイルの名前はService_PortTypeImpl.javaです。ServiceとPortTypeはそれぞれ、Webサービスを生成しているWSDLファイル内の<service>要素およびその内部の<port>要素のname属性を指します。たとえば、サービス名がMyServiceで、ポート名がMyServicePortTypeの場合、JWS実装ファイルの名前はMyService_MyServicePortTypeImpl.javaとなります。

- Package_name - 生成されるJWS SEIおよび実装ファイルの生成先となるパッケージ。この属性を指定しない場合、wsdlc Antタスクは、WSDLのtargetNamespaceに基づいてパッケージ名を生成します。

- WebService_type - Webサービスの種類。この値は、JAXWSまたはJAXRPCに設定できます。

必須のtaskdef要素では、wsdlc Antタスクの完全修飾クラス名を指定します。

wsdlc Antタスクでは、srcWsdlおよびdestJwsDir属性のみが必須です。ただし、通常は、プログラミングを容易にするために、途中まで作成済みのJWSファイルを生成します。WSDLファイルのtargetNamespaceが、読取り可能なパッケージ名への変換に適していない場合に備えて、パッケージ名を明示的に指定することをお薦めします。

以下のbuild.xmlの抜粋では、WSDLファイルに対してwsdlc Antタスクを実行する例を示します。

<taskdef name="wsdlc"
classname="weblogic.wsee.tools.anttasks.WsdlcTask"/>
<target name="generate-from-wsdl">
<wsdlc
srcWsdl="wsdl_files/TemperatureService.wsdl"
destJwsDir="output/compiledWsdl"
destImplDir="impl_output"
packageName="examples.webservices.wsdlc"
type="JAXWS" />
</target>

この例では:

- 既存のWSDLファイルはTemperatureService.wsdlという名前で、build.xmlファイルを格納するディレクトリのwsdl_filesサブディレクトリにあります。

- JWS SEIとデータ・バインディング・アーティファクトを含むJARファイルはoutput/compiledWsdlディレクトリに生成され、JARファイルの名前はTemperatureService_wsdl.jarです。

- 生成されるJWSファイルのパッケージ名はexamples.webservices.wsdldです。

- 途中まで作成済みのJWSファイルは、カレント・ディレクトリに対して相対的なimpl_output/examples/webservices/wsdlcディレクトリに生成されます。

- WSDLファイルのサービス名およびポート・タイプ名がそれぞれTemperatureServiceおよびTemperaturePortTypeであり、JWS実装ファイルの名前がTemperatureService_TemperaturePortTypeImpl.javaであるものとします。

- JAX-WS Webサービスが生成されます。

このタスクを実際に実行するには、コマンド・ラインで次のように入力します。

prompt> ant generate-from-wsdl

詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のwsdlcに関する項を参照してください。

wsdlcで生成される途中まで作成済みのJWS実装クラス・ファイルの更新

wsdlc Antタスクは、destImplDir属性で指定されたディレクトリに、途中まで作成済のJWS実装ファイルを生成します。ファイルの名前はService_PortTypeImpl.javaで、Serviceは元のWSDLファイル内のサービスの名前、PortTypeはポート・タイプ名です。このクラス・ファイルには、独自のビジネス・ロジックを除いて、Webサービスへコンパイルするために必要なすべてのものが含まれています。

JWSクラスは、WSDLファイルに対応するJWS Webサービス・エンドポイント・インタフェースを実装しています。このJWS SEIもwsdlcによって生成され、他のアーティファクト(WSDL内のXMLスキーマ・データ型のJava表現など)が含まれているJARファイル内に置かれています。JWSクラスのパブリック・メソッドはWSDLファイル内の操作に対応しています。

wsdlc Antタスクは、JWS実装クラスに@WebServiceアノテーションを自動的に含めます。属性の値は、WSDL内の関連する値に対応しています。たとえば、@WebServiceのserviceName属性は、WSDLファイル内の<service>要素のname属性と同じです。

JWSファイルを更新するときは、該当のWebサービス操作が希望どおりに動作するように、メソッドにJavaコードを追加します。通常、生成されるJWSファイルには、コードを追加すべき場所に次のようなコメントがあります。

//replace with your impl here

また、他のJWSアノテーションをファイルに追加することもできますが、以下のような制限があります。

- JWS実装ファイルに含めることができる標準(JSR-181)のjavax.jwsパッケージのアノテーションは、@WebService、@HandlerChain、@SOAPMessageHandler、および@SOAPMessageHandlersのみです。javax.jwsパッケージの他のJWSアノテーションを指定し、JWSファイルをWebサービスにコンパイルしようとすると、jwsc Antタスクはエラーを返します。たとえば、JWS実装ファイルに@Policyアノテーションを指定すると、jwsc Antタスクはコンパイル・エラーを返します。

- @WebServiceアノテーションでは、serviceName、endpointInterface、およびtargetNamespace属性のみを指定できます。まれに、WSDLファイルに複数の<service>要素が指定されていることがあります。その場合は、serviceName属性を使用して、wsdlc Antタスクで使用していたものとは別の<service> WSDL要素を指定します。wsdlc Antタスクで生成されたJWS SEIを指定するには、endpointInterface属性を使用します。WSDLサービスのネームスペースを指定するには、targetNamespace属性を使用します。JWS SEIネームスペースと異なるネームスペースを指定できます。

- 必要に応じて、JAX-WS-JSR 224、JAXB (JSR 222)または共通アノテーション(JSR 250)を指定できます。サポートされる各アノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスに関する項を参照してください。

JWSファイルを更新したら、wsdlcの出力ディレクトリにそのまま置いておかないで、正式なソースの場所に移動することをお薦めします。

次の例は、「サンプルWSDLファイル」のWSDLからwsdlcが生成したJWS実装ファイルです。太字のテキストは、Webサービスの1つの操作(getTemp)を実装するJavaコードを追加する場所を示しています。

package examples.webservices.wsdlc;
import javax.jws.WebService;
/**
* TemperaturePortTypeImpl class implements web service endpoint interface
* TemperaturePortType */
@WebService(
serviceName="TemperatureService",
endpointInterface="examples.webservices.wsdlc.TemperaturePortType")
public class TemperaturePortTypeImpl implements TemperaturePortType {
public TemperaturePortTypeImpl() {
}
public float getTemp(java.lang.String zipcode)
{
//replace with your impl here
return 0;
}
}

WebLogic Webサービスのデプロイとアンデプロイ

Webサービスはエンタープライズ・アプリケーションとしてパッケージ化されるので、Webサービスのデプロイとは、該当するEARファイルまたは展開されたディレクトリをデプロイすることになります。

管理コンソールの使用からweblogic.Deployer Javaユーティリティの使用まで、WebLogicアプリケーションのデプロイには多様な方法があります。開発環境とは異なり、本番環境にアプリケーションをデプロイする際には、他にも様々な問題を考慮する必要があります。デプロイメントの詳細は、『Oracle WebLogic Serverへのアプリケーションのデプロイ』を参照してください。

このガイドでは、開発の性質上、Webサービスの2つのデプロイ方法についてのみ説明します。

- wldeploy Antタスクを使用したWebサービスのデプロイ

- 管理コンソールを使用したWebサービスのデプロイ

wldeploy Antタスクを使用したWebサービスのデプロイ

反復的な開発プロセスの一環としてWebサービスをデプロイする最も簡単な方法は、wldeploy WebLogic Antタスクを実行するターゲットを、jwsc Antタスクが含まれる同じbuild.xmlファイルに追加することです。Javaコードを追加してサービスを再生成するたびに、サービスの再デプロイとテストを繰返し行えるように、Webサービスをデプロイするタスクとアンデプロイするタスクの両方を追加することができます。

wldeploy Antタスクを使用するには、以下のターゲットをbuild.xmlファイルに追加します。

<target name="deploy">
<wldeploy action="deploy"
name="DeploymentName"
source="Source" user="AdminUser"
password="AdminPassword"
adminurl="AdminServerURL"
targets="ServerName"/>
</target>

ここで:

- DeploymentName - エンタープライズ・アプリケーションのデプロイメント名、または、管理コンソールでデプロイメントのリストに表示される名前。

- Source - デプロイするエンタープライズ・アプリケーションのEARファイルまたは展開されたディレクトリの名前。デフォルトでは、jwsc Antタスクが展開されたエンタープライズ・アプリケーション・ディレクトリを生成します。

- AdminUser - 管理ユーザー名。

- AdminPassword - 管理パスワード。

- AdminServerURL - 管理サーバーのURL。通常はt3://localhost:7001です。

- ServerName - WebサービスをデプロイするWebLogic Serverインスタンスの名前。

たとえば、以下のwldeployタスクでは、エンタープライズ・アプリケーションの展開されたディレクトリ(カレント・ディレクトリに対して相対的なoutput/ComplexServiceEarにある)がmyServer WebLogic Serverインスタンスにデプロイされることを指定します。デプロイメント名はComplexServiceEarです。

<target name="deploy">
<wldeploy action="deploy"
name="ComplexServiceEar"
source="output/ComplexServiceEar" user="weblogic"
password="weblogic" verbose="true"
adminurl="t3://localhost:7001"
targets="myserver"/>
</target>

Webサービスを実際にデプロイするには、コマンド・ラインでdeployターゲットを実行します。

prompt> ant deploy

ソース・コードに変更を加えてからWebサービスを再デプロイできるように、Webサービスを簡単にアンデプロイするターゲットを追加することもできます。

<target name="undeploy">
<wldeploy action="undeploy"
name="ComplexServiceEar"
user="weblogic"
password="weblogic" verbose="true"
adminurl="t3://localhost:7001"
targets="myserver"/>
</target>

Webサービスをアンデプロイするときは、source属性を指定する必要はなく、名前によってアンデプロイします。

管理コンソールを使用したWebサービスのデプロイ

管理コンソールを使用してWebサービスをデプロイするには、最初に、ブラウザで次のURLを使用してWebサービスを呼び出します。

http://[host]:[port]/console

ここで:

- host WebLogic Serverが動作しているコンピュータの名前。

- port - WebLogic Serverがリスニングしているポート番号(デフォルト値は7001です)。

次にデプロイメント・アシスタントを使用して、エンタープライズ・アプリケーションをデプロイします。管理コンソールの詳細は、Oracle WebLogic Server管理コンソール・ヘルプを参照してください。

WebサービスのWSDLの参照

WebサービスのWSDLをブラウザで表示して、Webサービスが適切にデプロイされていることを確認できます。

次のURLは、WebサービスのWSDLをブラウザで表示する方法を示しています。

http://[host]:[port]/[contextPath]/[serviceUri]?WSDL

ここで:

- host - WebLogic Serverが動作しているコンピュータの名前(localhostなど)。

- port - WebLogic Serverがリスニングしているポート番号(デフォルト値は7001です)。

- contextPath - Webサービスのコンテキスト・ルート。コンテキスト・ルートを設定する場所としては、jwscの<WLHttpTransport、<module、または<jws要素があり、オーバーライドの順位が決まっています。包括的な説明については、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebLogic Webサービスのコンテキスト・パスの定義に関する項を参照してください。

- serviceUri - jwsc Antタスクの<WLHttpTransport>子要素のserviceUri 属性の値。jwsc AntタスクでserviceUri属性のいずれかを指定しない場合、WebサービスのserviceUriはデフォルト値(@WebServiceアノテーションのserviceName要素)になります。逆の場合、拡張子を除いたJWSファイルの名前の後にServiceを付けたものになります。

たとえば、次のようにWebサービスの構築に使用するjwscタスクで<WLHttpTransport>子要素を指定したものとします。

<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}"
keepGenerated="true">
<jws file="examples/webservices/complex/ComplexImpl.java"
type="JAXWS">
<WLHttpTransport
contextPath="complex" serviceUri="ComplexService"
portName="ComplexServicePort"/>
</jws>
</jwsc>
</target>

そして、Webサービスがarielというホストのデフォルトのポート番号(7001)で実行されているとすると、そのWebサービスのWSDLを表示するURLは次のようになります。

http://ariel:7001/complex/ComplexService?WSDL

動的なWSDLで指定されたサーバー・アドレスの構成

デプロイ済のWebサービスのWSDL(動的なWSDLともいいます)には、特定のWebサービス・ポートにアドレス(URI)を割り当てる<address>要素が含まれています。たとえば、次に示すWSDLの抜粋には、ComplexServiceというデプロイ済のWebLogic Webサービスの一部が記述されています。

<definitions name="ComplexServiceDefinitions"
targetNamespace="http://example.org">
...
<service name="ComplexService">
<port binding="s0:ComplexServiceSoapBinding" name="ComplexServicePort">
<s1:address location="http://myhost:7101/complex/ComplexService"/>
</port>
</service>
</definitions>

この例では、ComplexService WebサービスにComplexServicePortというポートが含まれており、そのアドレスはhttp://myhost:7101/complex/ComplexServiceとなっています。

WebLogic Serverは、このアドレスのcomplex/ComplexServiceの部分を、jwsc要素のcontextPathおよびserviceURI属性を調べることによって決定します(「WebサービスのWSDLの参照」に説明があります)。しかし、WebLogic Serverがアドレスのプロトコルおよびホスト部分(この例ではhttp://myhost:7101)を決定するために使用する方法は、次で説明するとおり、より複雑です。この項では、わかりやすいように、アドレスのプロトコルとホストの部分をまとめてサーバー・アドレスと呼ぶことにします。

WebLogic Serverがデプロイ済のWebサービスの動的なWSDL内にパブリッシュするサーバー・アドレスは、そのWebサービスをHTTP/SやJMSで呼び出せるかどうか、プロキシ・サーバーを構成しているかどうか、Webサービスがクラスタにデプロイされているかどうか、Webサービスが実際にはコールバック・サービスであるかどうかによって異なります。

以下では、これらの構成の違いに応じたサーバー・アドレスの決定方法について説明します。また、ニーズに合わせて構成を変更するための手順説明へのリンクも示します。

- Webサービスがコールバック・サービスでなく、HTTP/Sを使用して呼び出せる場合

- Webサービスがコールバック・サービスである場合

- Webサービスがプロキシ・サーバーを使用して呼び出せる場合

なお、ここでは、クラスタとスタンドアロン・サーバーを、WebLogic Server管理コンソールを使用して構成することを前提としています。

Webサービスがコールバック・サービスでなく、HTTP/Sを使用して呼び出せる場合

1. Webサービスがクラスタにデプロイされており、クラスタのFrontend Host、Frontend HTTP Port、およびFrontend HTTPS Portが設定されている場合は、動的なWSDLのサーバー・アドレスにこれらの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのクラスタのHTTP設定の構成に関する項を参照してください。

2. 前述のクラスタ値は設定されていないが、Webサービスがデプロイされている個々のサーバーでFrontend Host、Frontend HTTP Port、およびFrontend HTTPS Portの値が設定されている場合は、サーバー・アドレスにこれらの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのHTTPプロトコルの構成に関する項を参照してください。

3. これらの値がクラスタにも個々のサーバーにも設定されていない場合は、動的なWSDL内のWSDLリクエストのサーバー・アドレスが使用されます。

Webサービスがコールバック・サービスである場合

1. コールバック・サービスがクラスタにデプロイされており、クラスタのFrontend Host、Frontend HTTP Port、およびFrontend HTTPS Portが設定されている場合は、動的なWSDLのサーバー・アドレスにこれらの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのクラスタのHTTP設定の構成に関する項を参照してください。

2. コールバック・サービスがクラスタまたはスタンドアロン・サーバーにデプロイされており、上記のクラスタ値は設定されていないが、コールバック・サービスがデプロイされている個々のサーバーでFrontend Host、Frontend HTTP Port、およびFrontend HTTPS Portの値が設定されている場合は、サーバー・アドレスにこれらの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのHTTPプロトコルの構成に関する項を参照してください。

3. コールバック・サービスがクラスタにデプロイされており、上記のどの値も設定されていないがCluster Addressが設定されている場合は、サーバー・アドレスにこの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのクラスタの構成に関する項を参照してください。

4. 上記のどの値も設定されていないが、コールバック・サービスがデプロイされているサーバーのListen Addressが設定されている場合は、サーバー・アドレスにこの値が使用されます。
Oracle WebLogic Server管理コンソール・ヘルプのリスニング・アドレスの構成に関する項を参照してください。

Webサービスがプロキシ・サーバーを使用して呼び出せる場合

必須ではありませんが、Webサービスがデプロイされているクラスタまたは個々のサーバーのFrontend Host、FrontEnd HTTP Port、およびFrontend HTTPS Portがプロキシ・サーバーを指すように明示的に設定することをお薦めします。

Oracle WebLogic Server管理コンソール・ヘルプのクラスタのHTTP設定の構成に関する項またはHTTPプロトコルの構成に関する項を参照してください。

Webサービスのテスト

WebLogic Webサービスのデプロイメントが完了したら、WebLogic管理コンソールに含まれているWebサービス・テスト・クライアントを使用して、コードを記述することなくサービスをテストできます。複合型を持つWebサービスや、WebLogic Serverの高度な機能(会話など)を使用するWebサービスも含めて、Webサービスを素早く簡単にテストできます。テスト・クライアントはリクエストの完全なログを自動的に保持しているので、ユーザーは以前の呼出しに戻って結果を表示することができます。

デプロイしたWebサービスを管理コンソールを使用してテストするには、次の手順に従います。

1. 次のURLを使用して、ブラウザで管理コンソールを呼び出します。

http://[host]:[port]/console

ここで:

- host - WebLogic Serverが動作しているコンピュータの名前。

- port - WebLogic Serverがリスニングしているポート番号(デフォルト値は7001です)。

2. Oracle WebLogic Server管理コンソール・ヘルプのWebサービスのテストに関する項を参照してください。

WebサービスのWebLogic分割開発ディレクトリ環境への統合

このセクションでは、Webサービスの開発をWebLogic分割開発ディレクトリ環境に統合する方法について説明します。このWebLogic機能について理解していること、標準のJava Platform, Enterprise Edition (Java EE)バージョン5アプリケーションおよびモジュール(EJBやWebアプリケーションなど)の開発用にこのタイプの環境を設定済であること、Webサービスの開発が含まれるようにbuild.xmlファイルの更新を計画していることを前提としています。

WebLogic分割開発ディレクトリ環境の詳細は、『Oracle WebLogic Serverアプリケーションの開発』の分割開発ディレクトリ環境の作成に関する項およびWebLogic Serverと一緒にインストールされるsplitdir/helloWorldEarサンプルを参照してください(サンプルは、WL_HOME/samples/server/examples/src/examplesディレクトリにあり、WL_HOMEはWebLogic Serverがインストールされている最上位ディレクトリです)。

1. メイン・プロジェクト・ディレクトリ内に、Webサービスを実装するJWSファイルを格納するためのディレクトリを作成します。
たとえば、メイン・プロジェクト・ディレクトリが/src/helloWorldEarである場合、/src/helloWorldEar/helloWebServiceというディレクトリを作成します。

prompt> mkdir /src/helloWorldEar/helloWebService

2. helloWebServiceディレクトリの下に、JWSファイルのパッケージ名に対応するディレクトリ階層を作成します。
たとえば、JWSファイルがexamples.splitdir.helloパッケージにパッケージ化されている場合は、examples/splitdir/helloというディレクトリ階層を作成します。

prompt> cd /src/helloWorldEar/helloWebService
prompt> mkdir examples/splitdir/hello

3. メイン・プロジェクト・ディレクトリに作成したWebサービスのサブディレクトリ(この例では/src/helloWorldEar/helloWebService/examples/splitdir/hello)にJWSファイルを置きます。

4. エンタープライズ・アプリケーションをビルドするbuild.xmlファイル内に、「jwsc WebLogic WebサービスAntタスクの実行」の説明に従ってjwsc WebLogic WebサービスAntタスクの呼出しを追加して、Webサービスをビルドする新しいターゲットを作成します。
jwscのsrcdir属性は、JWSファイルを格納する最上位ディレクトリ(この例ではhelloWebService)を指すようにします。jwscのdestdir属性は、wlcompileに指定するのと同じ宛先ディレクトリを指すようにします。次の例を参照してください。

<target name="build.helloWebService">
<jwsc
srcdir="helloWebService"
destdir="destination_dir"
keepGenerated="yes" >
<jws file="examples/splitdir/hello/HelloWorldImpl.java"
type="JAXWS" />
</jwsc>
</target>

この例のdestination_dirは、他の分割開発ディレクトリ環境のAntタスク(wlappcやwlcompileなど)も使用する宛先ディレクトリを表します。

5. Webサービス関連のターゲットを呼び出すように、build.xmlファイルのメインのbuildターゲットを更新します。

<!-- Builds the entire helloWorldEar application -->
<target name="build"
description="Compiles helloWorldEar application and runs appc"
depends="build-helloWebService,compile,appc" />

注意:

エンタープライズ・アプリケーションを実際にビルドするときは、wlappc Antタスクを実行する前に、jwsc Antタスクを実行するようにしてください。wlappcを正常に実行するには、jwscによって生成されるアーティファクトの一部が必要になるためです。この例の場合は、appcターゲットよりも前にbuild-helloWebServiceターゲットを指定する必要があります。

6. wlcompileおよびwlappc Antタスクを使用してエンタープライズ・アプリケーション全体をコンパイルおよび検証する場合は、両方のAntタスクでWebサービスのソース・ディレクトリを除外するようにしてください。これは、jwsc AntタスクでWebサービスのコンパイルとパッケージ化をすでに扱っているためです。例:

<target name="compile">
<wlcompile srcdir="${src.dir}" destdir="${dest.dir}"
excludes="appStartup,helloWebService">
...
</wlcomplile>
...
</target>
<target name="appc">
<wlappc source="${dest.dir}" deprecation="yes" debug="false"
excludes="helloWebService"/>
</target>

7. META-INFプロジェクト・ソース・ディレクトリにあるapplication.xmlファイルを更新して、<web>モジュールを追加し、jwsc Antタスクによって生成されるWARファイルの名前を指定します。
たとえば、helloWorld Webサービスのapplication.xmlファイルに次のように追加します。

<application>
...
<module>
<web>
<web-uri>examples/splitdir/hello/HelloWorldImpl.war</web-uri>
<context-root>/hello</context-root>
</web>
</module>
...
</application>

注意:

jwsc Antタスクでは通常、Webサービスを実装するJWSファイルからWebアプリケーションWARファイルが生成されまが、JWSファイルに@Statelessアノテーションを使用してEJBが定義されている場合は例外です。その場合は、application.xmlファイルに<ejb>モジュール要素を追加する必要があります。

これで、分割開発ディレクトリ環境は、Webサービスの開発を含むように更新されました。エンタープライズ・アプリケーション全体を再ビルドしてデプロイするときに、WebサービスもEARの一部としてデプロイされます。Webサービスは、「WebサービスのWSDLの参照」で説明されている標準的な方法で呼び出します。

4 JWSファイルのプログラミング

この章では、Java API for XML-based Web services (JAX-WS)を使用したWebLogic Webサービスを実装するJWSファイルのプログラミング方法について説明します。

この章では、以下のトピックについて説明します。

- JWSファイルとJWSアノテーションの概要

- JWSファイルのJava要件

- JWSファイルのプログラミング: 一般的な手順

- Webサービスの実行時情報へのアクセス

- ステートレス・セッションEJBを実装すべき場合

- ユーザー定義のJavaデータ型のプログラミング

- JWSファイルからの別のWebサービスの呼出し

- SOAP 1.2の使用

- XMLスキーマの検証

- JWSプログラミングのベスト・プラクティス

JWSファイルとJWSアノテーションの概要

WebLogic Webサービスをゼロからプログラムする方法は2つあります。

1. JSR-181、JAX-WS仕様、およびWebLogic Webサービス・プログラミング・モデルで規定されているように、標準のEJBまたはJavaクラスにWebサービスJavaアノテーションを付けます。

2. デプロイメント記述子、WSDLファイル、データ・マッピング記述子、データ・バインディング・アーティファクト(ユーザー定義のデータ型用)など、JSR-109で指定されている様々なXML記述子ファイルやアーティファクトと、標準のEJBまたはJavaクラスを結合します。

上のオプション1を実行することを強くお薦めします。ユーザー自身がXMLメタデータ記述子を作成しなくても、必要な記述子やアーティファクトはJWSにユーザーが含めたアノテーションに基づいてWebLogic Antタスクおよびランタイムによって生成されます。このプロセスの方がはるかに簡単なだけでなく、Webサービスの情報が多数のJavaファイルやXMLファイル内に分散されず、JWSファイルで集中管理されます。

アノテーション付きのJava Webサービス(JWS)ファイルは、Webサービスの中核部分です。このファイルにはWebサービスの動作を決定するJavaコードが含まれています。JWSファイルは、Javaメタデータ・アノテーションを使用してWebサービスの形式や特性を指定した、通常のJavaクラス・ファイルです。JWSファイルでは、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181を参照)で定義される標準的なJWSアノテーションに加え、作成中のWebサービスの種類(JAX-WSまたはJAX-RPC)に基づいたその他のアノテーション・セットの使用が可能です。JAX-WS WebサービスおよびJAX-RPC Webサービスに対してサポートされているJWSアノテーションの完全なリストについては、『『Oracle WebLogic Server WebLogic Webサービス・リファレンス』』のWebサービスのアノテーション・サポートに関する項を参照してください。

JWSファイルをプログラミングする際は、基本的なWebサービス機能をプログラムするためにアノテーションを含めます。アノテーションは、JWSファイル内の様々なレベル、様々なターゲットで使用されます。一部はクラス・レベルで使用され、そのアノテーションがJWSファイル全体に適用されることを示します。また、メソッド・レベルで使用するものや、パラメータ・レベルで使用するものもあります。

JWSファイルのJava要件

JWSファイルをプログラミングする場合は、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181)で指定された一連の要件に従う必要があります。特に、Webサービスを実装するJavaクラスは、次の要件に従う必要があります。

- パブリック・クラスでなければなりません。finalクラスやabstractクラスとして宣言することはできません。

- デフォルトのパブリック・コンストラクタを持つ必要があります。

- finalize()メソッドは定義できません。

- 少なくとも、クラス・レベルで@WebService JWSアノテーションを指定して、そのJWSファイルがWebサービスを実装することを指定する必要があります。

- @WebService.endpointInterfaceアノテーションを使用して、サービス・エンドポイント・インタフェースを参照できます。この場合は、サービス・エンドポイント・インタフェースが存在することを前提としています。JWSファイルでは@WebService.endpointInterface、@WebService.serviceNameおよび@WebService.targetNamespace以外のJWSアノテーションを指定することはできません。

- JWSファイルにサービス・エンドポイント・インタフェースが実装されていない場合は、java.lang.Objectから継承されたもの以外のすべてのパブリック・メソッドが、Webサービス操作として公開されます。この動作は、@WebMethodアノテーションを使用して、公開するパブリック・メソッドを明示的に指定することによって、オーバーライドできます。@WebMethodアノテーションが存在する場合は、それが適用されるメソッドのみが公開されます。

JWSファイルのプログラミング: 一般的な手順

次の手順では、Webサービスを実装するJWSファイルをプログラミングするための一般的な手順を説明します。

注意:

JWSファイルを作成してあり、そこにJWSアノテーションを追加する予定であることを前提としています。

各JWSアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスに関する項を参照してください。

表4-1 JWSファイルのプログラミング手順

#

手順

説明

1

JWSファイルで使用する標準のJWSアノテーションをインポートします。

標準のJWSアノテーションはjavax.jws、javax.jws.soap、またはjavax.xml.wsパッケージにあります。例:

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.xml.ws.BindingType;

2

必要に応じて、追加のアノテーションをインポートします。

サポートされているJWSアノテーションの完全なリストについては、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスのアノテーション・サポートに関する項を参照してください。

3

必須の標準@WebService JWSアノテーションをクラス・レベルで追加して、JavaクラスがWebサービスを公開することを指定します。

「JWSファイルがWebサービスを実装することの指定(@WebServiceアノテーション)」を参照してください。

4

標準の@SOAPBinding JWSアノテーションをクラス・レベルで追加して、WebサービスとSOAPメッセージ・プロトコルの間のマッピングを指定する(オプション)

特に、このアノテーションを使用して、Webサービスがドキュメント・リテラルか、ドキュメント・エンコードかなどを指定します。「WebサービスとSOAPメッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)」を参照してください。

このJWSアノテーションは必須ではありませんが、JWSファイルで明示的に指定し、クライアント・アプリケーションがWebサービスの呼出しに使用するSOAPバインディングのタイプを明確にすることをお薦めします。

5

クラス・レベルでJAX-WS @BindingType JWSアノテーションを追加し、Webサービス・エンドポイント実装クラスに使用するバインディング・タイプを指定します。(オプション)

「エンドポイントに使用するバインディングの指定(@BindingTypeアノテーション)」を参照してください。

6

パブリック操作として公開するJWSファイルの各メソッドで標準の@WebMethodアノテーションを追加する(オプション)

必要に応じて、標準の@Onewayアノテーションを使用し、その操作が入力パラメータだけを取り、値を返さないことを指定します。「JWSメソッドをパブリック操作として公開することの指定(@WebMethodおよび@OneWayアノテーション)」を参照してください。

7

@WebParamアノテーションを追加し、公開される操作の入力パラメータの名前をカスタマイズする(オプション)

「操作のパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)」を参照してください。

8

@WebResultアノテーションを追加し、公開される操作の戻り値の名前と動作をカスタマイズする(オプション)

「操作の戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)」を参照してください。

9

独自のビジネス・コードを追加します。

Webサービスが希望どおりに動作するように、独自のビジネス・コードをメソッドに追加します。

JWSファイルの例

次のサンプルJWSファイルでは、簡単なWebサービスの実装方法を示します。

package examples.webservices.simple;
// Import the standard JWS annotation interfaces
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// Standard JWS annotation that specifies that the porType name of the Web
// Service is "SimplePortType", the service name is "SimpleService", and the
// targetNamespace used in the generated WSDL is "http://example.org"
@WebService(name="SimplePortType", serviceName="SimpleService",
targetNamespace="http://example.org")
// Standard JWS annotation that specifies the mapping of the service onto the
// SOAP message protocol.  In particular, it specifies that the SOAP messages
// are document-literal-wrapped.
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
/**
* This JWS file forms the basis of simple Java-class implemented WebLogic
* Web Service with a single operation: sayHello
*
*/
public class SimpleImpl {
// Standard JWS annotation that specifies that the method should be exposed
// as a public operation.  Because the annotation does not include the
// member-value "operationName", the public name of the operation is the
// same as the method name: sayHello.
@WebMethod()
public String sayHello(String message) {
System.out.println("sayHello:" + message);
return "Here is the message: '" + message + "'";
}
}

JWSファイルがWebサービスを実装することの指定(@WebServiceアノテーション)

次のコードの抜粋のように、標準の@WebServiceアノテーションを使用して、JWSファイルがWebサービスを実装することをクラス・レベルで指定します。

@WebService(name="SimplePortType", serviceName="SimpleService",
targetNamespace="http://example.org")

この例では、Webサービスの名前はSimplePortTypeであり、jwsc Antタスクによって生成されるWSDLファイルのwsdl:portType要素に後でマップされます。サービス名はSimpleServiceであり、生成されるWSDLファイルのwsdl:service要素にマップされます。生成されるWSDLで使用されるターゲット・ネームスペースはhttp://example.orgです。

@WebServiceアノテーションの以下の追加の属性を指定することもできます。

- endpointInterface - 既存のサービス・エンドポイント・インタフェース・ファイルの完全修飾名。このアノテーションによって、実装からインタフェース定義を切り離すことができます。この属性を指定した場合、jwsc Antタスクはそのインタフェースを生成しません。そのインタフェースは作成されていて、CLASSPATHに入っていると想定します。

- portname - wsdl:port内で使用される名前。

@WebServiceアノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

WebサービスとSOAPメッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)

ここでは、WebサービスをSOAPメッセージ・プロトコルで使用できるようにします。そのためには、JWSファイル内にクラス・レベルで標準の@SOAPBindingアノテーションを含めて、WebサービスのSOAPバインディング(document-encodedまたはdocument-literal-wrappedなど)を指定します(次のコードの抜粋を参照)。

@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,
use=SOAPBinding.Use.LITERAL,
parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

この例で、Webサービスはdocument-wrapped-styleエンコーディングとリテラル・メッセージ書式を使用しており、@SOAPBindingアノテーションを使用しない場合でも、これらはデフォルトの書式となります。一般に、最も相互運用性の高いタイプのWebサービスは、document-literal-wrappedのWebサービスです。

(style=SOAPBinding.Style.DOCUMENT属性と一緒に) parameterStyle属性を使用して、Webサービス操作のパラメータが、SOAPメッセージ本文全体を表すかどうか、操作と同じ名前の最上位要素内にラップされる要素かどうかを指定します。

次の表では、標準およびWebLogic固有の@SOAPBindingアノテーションの3つの属性の指定できる値とデフォルト値を示します。

表4-2 @SOAPBindingアノテーションの属性

属性

指定できる値

デフォルト値

style

SOAPBinding.Style.RPC

SOAPBinding.Style.DOCUMENT

SOAPBinding.Style.DOCUMENT

use

SOAPBinding.Use.LITERAL

SOAPBinding.Use.LITERAL

parameterStyle

SOAPBinding.ParameterStyle.BARE

SOAPBinding.ParameterStyle.WRAPPED

SOAPBinding.ParameterStyle.WRAPPED

JWSメソッドをパブリック操作として公開することの指定(@WebMethodおよび@OneWayアノテーション)

次のコードの抜粋で示すように、標準の@WebMethodアノテーションを使用して、JWSファイルのメソッドをWebサービスのパブリック操作として公開することを指定します。

public class SimpleImpl {
@WebMethod(operationName="sayHelloOperation")
public String sayHello(String message) {
System.out.println("sayHello:" + message);
return "Here is the message: '" + message + "'";
}
...

この例では、SimpleImpl JWSファイルのsayHello()メソッドが、Webサービスのパブリック操作として公開されます。ただし、operationName属性では、WSDLファイル内の操作のパブリック名はsayHelloOperationになることを指定しています。operationName属性を指定しない場合は、メソッドの名前が操作のパブリック名になります。

action属性を使用して操作のアクションを指定することもできます。SOAPをバインディングとして使用する場合、action属性の値によって、SOAPメッセージ内のSOAPActionヘッダーの値が決まります。

Webサービス操作としてメソッドを除外するには、@WebMethod(exclude="true")を指定します。

注意:

サービス・エンドポイント・インタフェース(SEI)は、JAX-WSのためにパブリック・メソッドを定義します。SEIが存在しない場合、@WebMethod(exclude="true")で明示的にタグ付けされていなければ、すべてのパブリック・メソッドがWebサービス操作として公開されます。

標準の@Onewayアノテーションを使用して、操作が呼出し側アプリケーションに値を返さないことを指定できます。次の例を参照してください。

public class OneWayImpl {
@WebMethod()
@Oneway()
public void ping() {
System.out.println("ping operation");
}
...

操作が一方向であることを指定する場合、実装するメソッドはvoidを返す必要があります。パラメータとしてホルダー・クラスを使用したり、チェック済み例外をスローしたりすることはできません。

@WebMethodアノテーションの属性はいずれも必須ではありません。@WebMethodおよび@Onewayアノテーションに関する追加情報や、各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

操作のパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)

次のコードの抜粋で示すように、標準の@WebParamアノテーションを使用して、Webサービス操作の入力パラメータと生成されるWSDLファイルの要素間のマッピングのカスタマイズや、パラメータ動作の指定を行います。

public class SimpleImpl {
@WebMethod()
@WebResult(name="IntegerOutput",
targetNamespace="http://example.org/docLiteralBare")
public int echoInt(
@WebParam(name="IntegerInput",
targetNamespace="http://example.org/docLiteralBare")
int input)
{
System.out.println("echoInt '" + input + "' to you too!");
return input;
}
...

この例では、生成されるWSDLファイル内のechoInt操作のパラメータ名はIntegerInputになります。JWSファイルに@WebParamアノテーションがない場合、生成されるWSDLファイル内のパラメータ名は、メソッドのパラメータ名inputと同じになります。targetNamespace属性は、パラメータのXMLネームスペースがhttp://example.org/docLiteralBareであることを指定します。この属性は、パラメータとXML要素がマップされる、ドキュメント・スタイルのSOAPバインディングを使用する場合にのみ有効です。

@WebParamアノテーションの以下の追加の属性を指定することもできます。

- mode - パラメータの入出力の方向(WebParam.Mode.IN、WebParam.Mode.OUT、またはWebParam.Mode.INOUT)。OUTおよびINOUTモードは、RPC形式の操作、またはヘッダーにマップされるパラメータでのみサポートされます。

- header - trueに設定した場合、パラメータの値はデフォルトの本文からではなくSOAPヘッダーから取得されることを指定する、ブール型の属性。

@WebParamアノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

操作の戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)

次のコードの抜粋で示すように、標準の@WebResultアノテーションを使用して、Webサービス操作の戻り値と生成されるWSDLファイル内の対応する要素との間のマッピングをカスタマイズします。

public class Simple {
@WebMethod()
@WebResult(name="IntegerOutput",
targetNamespace="http://example.org/docLiteralBare")
public int echoInt(
@WebParam(name="IntegerInput",
targetNamespace="http://example.org/docLiteralBare")
int input)
{
System.out.println("echoInt '" + input + "' to you too!");
return input;
}
...

この例では、生成されるWSDLファイル内のechoInt操作の戻り値の名前はIntegerOutputになります。JWSファイルに@WebResultアノテーションがない場合、生成されるWSDLファイル内の戻り値の名前は、ハード・コード化された名前returnになります。targetNamespace属性は、戻り値のXMLネームスペースがhttp://example.org/docLiteralBareであることを指定します。この属性は、戻り値とXML要素がマップされる、ドキュメント・スタイルのSOAPバインディングを使用する場合にのみ有効です。

@WebResultアノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181)を参照してください。

エンドポイントに使用するバインディングの指定(@BindingTypeアノテーション)

JAX-WS @BindingTypeアノテーションを使用すると、Webサービス・エンドポイント実装クラスに使用するバインディングをカスタマイズすることができます。次のコードの抜粋を参照してください。

import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;
public class Simple {
@WebService()
@BindingType(value=SOAPBinding.SOAP12HTTP_BINDING)
public int echoInt(
@WebParam(name="IntegerInput",
targetNamespace="http://example.org/docLiteralBare")
int input)
{
System.out.println("echoInt '" + input + "' to you too!");
return input;
}
...

この例のデプロイメントされたエンドポイントでは、SOAP1.2 over HTTPバインディングが使用されます。何も指定しない場合、バインディングのデフォルトはSOAP 1.1 over HTTPになります。

@BindingTypeアノテーションの以下の追加属性を指定することもできます。

- features - 指定したバインディングにおいて有効化/無効化する機能の配列。指定しない場合、機能は独自規則に基づいて有効化されます。

@BindingTypeアノテーションの詳細は、JAX-WS 2.1アノテーション(http://docs.oracle.com/javaee/5/api/javax/xml/ws/BindingType.html)を参照してください。

Webサービスの実行時情報へのアクセス

クライアント・アプリケーションが、JWSファイルで実装されたWebLogic Webサービスを呼び出すと、WebLogic Serverは、Webサービスやクライアントが、サービスに関する実行時情報のアクセス、および場合によっては変更に使用できるコンテキストを自動的に作成します。

実行時情報には、以下のいずれかの方法でアクセスできます。

- javax.xml.ws.BindingProvider(http://download.oracle.com/javaee/5/api/javax/xml/ws/BindingProvider.html)- クライアント・アプリケーションから、プロトコル・バインディングのリクエストおよびレスポンス・コンテキストへアクセスします。「プロトコル・バインディング・コンテキストへのアクセス」を参照してください。

- javax.xml.ws.WebServiceContext(http://download.oracle.com/javaee/5/api/javax/xml/ws/WebServiceContext.html)- Webサービスから、処理されているリクエストに関連する実行時メッセージ・コンテキストやセキュリティ情報にアクセスします。WebServiceContextは通常、@Resourceアノテーションを使用してエンドポイントにインジェクトされます。「Webサービス・コンテキストへのアクセス」を参照してください。

- javax.xml.ws.handler.MessageContext(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html)- WebサービスのWebServiceContextから直接、あるいはクライアント・アプリケーションやWebサービスのメッセージ・ハンドラから実行時プロパティ・セットへアクセスします。「MessageContextプロパティ値の使用」を参照してください。

以降の項では、BindingProvider、WebServiceContext、およびMessageContextを使用して実行時情報へアクセスする方法の詳細を説明します。

プロトコル・バインディング・コンテキストへのアクセス

注意:

com.sun.xml.ws.developer.JAXWSPropertiesおよびcom.sun.xml.ws.client.BindingProviderProperties APIは、JDK 6.0の拡張としてサポートされています。これらのAPIはJDK 6.0キットの一部としては提供されないため、変更される可能性があります。

javax.xml.ws.BindingProviderインタフェースを使用すると、クライアント・アプリケーションから、プロトコル・バインディングのリクエストおよびレスポンス・コンテキストへアクセスすることができます。詳細については、http://download.oracle.com/javaee/5/api/javax/xml/ws/BindingProvider.htmlを参照してください。Webサービス・クライアント・ファイルの開発の詳細は、「Webサービスの呼出し」を参照してください。

次に、コンテキストを使用してHTTPリクエスト・ヘッダー情報へアクセスする簡単なWebサービス・クライアント・アプリケーションの例を示します。太字のコードについては、例の後のプログラミングのガイドラインで説明しています。

package examples.webservices.hello_world.client;

import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import com.sun.xml.ws.developer.JAXWSProperties;
import com.sun.xml.ws.client.BindingProviderProperties;

/**
* This is a simple standalone client application that invokes the
* the <code>sayHelloWorld</code> operation of the Simple Web service.
*/

public class Main {
public static void main(String[] args) {
HelloWorldService service;
try {
service = new HelloWorldService(new URL(args[0] + "?WSDL"),
new QName("http://hello_world.webservices.examples/",
"HelloWorldService") );
} catch (MalformedURLException murl) { throw new RuntimeException(murl); }
HelloWorldPortType port = service.getHelloWorldPortTypePort();
String result = null;
result = port.sayHelloWorld("Hi there!");
System.out.println( "Got result: " + result );
Map requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://examples.com/HelloWorldImpl/HelloWorldService");
requestContext.put(JAXWSProperties.CONNECT_TIMEOUT, 300);
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 300);
Map responseContext = ((BindingProvider)port).getResponseContext();
Integer responseCode =
(Integer)responseContext.get(MessageContext.HTTP_RESPONSE_CODE);
...
}
}

この例の太字のコードで示すように、Webサービスの実行時コンテキストにアクセスするには、JWSファイルで次のガイドラインに従います。

- javax.xml.ws.BindingProvider APIに加え、使用する可能性のあるその他の関連APIをインポートします。

import java.util.Map;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.MessageContext;
import com.sun.xml.ws.developer.JAXWSProperties;
import com.sun.xml.ws.client.BindingProviderProperties;
import com.sun.xml.ws.client.BindingProviderProperties;

- BindingProviderクラスのメソッドを使用して、バインディング・プロトコル・コンテキスト情報へアクセスします。次の例は、プロトコル・バインディングのリクエストおよびレスポンス・コンテキストを取得してからリクエスト・コンテキスト用にクライアントで使用されるターゲットのサービス・エンドポイント・アドレスを設定し、リクエスト・コンテキストの接続や読取りのタイムアウト時間(ミリ秒単位)とHTTPレスポンス・ステータス・コードを設定する方法を示しています。

Map requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://examples.com/HelloWorldImpl/HelloWorldService");
requestContext.put(JAXWSProperties.CONNECT_TIMEOUT, 300);
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 300);
Map responseContext = ((BindingProvider)port).getResponseContext();
Integer responseCode =
(Integer)responseContext.get(MessageContext.HTTP_RESPONSE_CODE);

次の表は、Webサービスに関する実行時情報にアクセスするためにJWSファイルで使用できるjavax.xml.ws.BindingProviderのメソッドの要約を示します。

表4-3 BindingProviderのメソッド

メソッド

戻り値

説明

getBinding()

バインディング

バインディング・プロバイダのバインディングを返します。

getRequestContext()

java.Util.Map

リクエスト・メッセージのコンテキストおよびメッセージの初期化に使用されるコンテキストを返します。

getResponseContext()

java.Util.Map

レスポンス・コンテキストを返します。

リクエストおよびレスポンス・コンテキストを取得したら、次の表で定義しているBindingProviderプロパティ値と、「MessageContextプロパティ値の使用」で定義しているMessageContextプロパティ値にアクセスできます。

表4-4 BindingProviderのプロパティ

プロパティ

タイプ

説明

ENDPOINT_ADDRESS_PROPERTY

java.lang.String

ターゲットのサービス・エンドポイント・アドレス。

PASSWORD_PROPERTY

java.lang.String

認証用パスワード。

SESSION_MAINTAIN_PROPERTY

java.lang.Boolean

サービス・クライアントがサービス・エンドポイントとのセッションに参加するかどうかを示すフラグ。デフォルト値のfalseは、サービス・クライアントが参加しないことを示します。

SOAPACTION_URI_PROPERTY

java.lang.String

SOAPAction URI.を指定するSOAPActionのプロパティ。このプロパティは、SOAPACTION_USE_PROPERTYがtrueに設定されている場合にのみ有効です。

SOAPACTION_USE_PROPERTY

java.lang.Boolean

SOAPActionを使用するかどうかを指定するSOAPActionのプロパティ。

USERNAME_PROPERTY

java.lang.String

認証用ユーザー名。

また、前の例の以下の点に注目してください。

- JAXWSProperties.CONNECT_TIMEOUTプロパティを使用して接続タイムアウトを定義しています。設定可能なJAXWSPropertiesの完全なリストは、com.sun.xml.ws.developer.JAXWSPropertiesのJavadoc (http://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/developer/JAXWSProperties.html#CONNECT_TIMEOUT)を参照してください。

- BindingProviderProperties.REQUEST_TIMEOUTプロパティを使用してリクエスト・タイムアウトを定義しています。設定可能なBindingProviderPropertiesの完全なリストは、com.sun.xml.ws.client.BindingProviderPropertiesのJavadoc (http://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/client/BindingProviderProperties.html#REQUEST_TIMEOUT)を参照してください。

Webサービス・コンテキストへのアクセス

javax.xml.ws.WebServiceContextインタフェースを使用すると、Webサービスから、処理されているリクエストに関連する実行時メッセージ・コンテキストやセキュリティ情報にアクセスできます。WebServiceContextは通常、@Resourceアノテーションを使用してエンドポイントにインジェクトされます。詳細は、http://download.oracle.com/javaee/5/api/javax/xml/ws/WebServiceContext.htmlを参照してください。

次に、コンテキストを使用してHTTPリクエスト・ヘッダー情報へアクセスする簡単なJWSファイルの例を示します。太字のコードについては、例の後のプログラミングのガイドラインで説明しています。

package examples.webservices.jws_context;
import javax.jws.WebMethod;
import javax.jws.WebService;
import java.util.Map;
import javax.xml.ws.WebServiceContext;
import javax.annotation.Resource;
import javax.xml.ws.handler.MessageContext;
@WebService(name="JwsContextPortType", serviceName="JwsContextService",
targetNamespace="http://example.org")
/**
* Simple web service to show how to use the @Context annotation.
*/
public class JwsContextImpl {
@Resource
private WebServiceContext ctx;
@WebMethod()
public String msgContext(String msg) {
MessageContext context=ctx.getMessageContext();
Map requestHeaders = (Map)context.get(MessageContext.HTTP_REQUEST_HEADERS);
}
}

この例の太字のコードで示すように、Webサービスの実行時コンテキストにアクセスするには、JWSファイルで次のガイドラインに従います。

- @javax.annotation.Resource JWSアノテーションをインポートします。

import javax.annotation.Resource;

- javax.xml.ws.WebServiceContext APIに加え、使用する可能性のあるその他の関連APIをインポートします。

import java.util.Map;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

- データ型javax.xml.ws.WebServiceContextのプライベート変数に、フィールド・レベルの@Resource JWSアノテーションを指定します。

@Resource
private WebServiceContext ctx;

- WebServiceContextクラスのメソッドを使用して、Webサービスの実行時情報にアクセスします。次の例は、現在のサービス・リクエストのメッセージ・コンテキストを取得してから、HTTPリクエスト・ヘッダーにアクセスする方法を示しています。

MessageContext context=ctx.getMessageContext();
Map requestHeaders = (Map)context.get(MessageContext.HTTP_REQUEST_HEADERS)

MessageContextプロパティ値の詳細は、「MessageContextプロパティ値の使用」を参照してください。

次の表は、Webサービスに関する実行時情報にアクセスするためにJWSファイルで使用できるjavax.xml.ws.WebServiceContextのメソッドの要約を示します。詳細は、http://download.oracle.com/javaee/5/api/javax/xml/ws/WebServiceContext.htmlを参照してください。

表4-5 WebServiceContextのメソッド

メソッド

戻り値

説明

getMessageContext()

MessageContext

現在のサービス・リクエストのMessageContextを返します。MessageContextプロパティ値の使用で定義しているように、HTTP_REQUEST_HEADERSやMESSAGE_ATTACHMENTSなど、アプリケーション・スコープのプロパティのみアクセス可能です。

getUserPrincipal()

java.security.Principal

現在のサービス・リクエストの送信者を識別するプリンシパルを返します。送信者が認証されていない場合、nullを返します。

isUserInRole(java.lang.String role)

boolean

指定された論理的なロールに認証ユーザーが含まれているかどうかを示すブール値を返します。ユーザーが認証されていない場合、falseを返します。

MessageContextプロパティ値の使用

次の表では、WebサービスのWebServiceContextから直接、あるいはクライアント・アプリケーションやWebサービスのメッセージ・ハンドラからアクセス可能なjavax.xml.ws.handler.MessageContextプロパティ値を示しています。詳細は、javax.xml.ws.handler.MessageContext Javadoc(http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.html)を参照してください。

表4-6 MessageContextのプロパティ

プロパティ

タイプ

説明

HTTP_REQUEST_HEADERS

java.util.Map

リクエスト・メッセージのHTTPリクエスト・ヘッダーのマップ。

HTTP_REQUEST_METHOD

java.lang.String

GET、POST、PUTなどのHTTPリクエスト・メソッド。

HTTP_RESPONSE_CODE

java.lang.Integer

最終呼出しのHTTPレスポンス・ステータス・コード。

HTTP_RESPONSE_HEADERS

java.util.Map

HTTPレスポンス・ヘッダー。

INBOUND_MESSAGE_ATTACHMENTS

java.util.Map

着信メッセージの添付のマップ。

MESSAGE_OUTBOUND_PROPERTY

java.lang.Boolean

メッセージの方向。このプロパティは、発信メッセージの場合はtrue、着信メッセージの場合はfalseです。

OUTBOUND_MESSAGE_ATTACHMENTS

java.util.Map

発信メッセージの添付のマップ。

PATH_INFO

java.lang.String

リクエスト・パス情報。

QUERY_STRING

java.lang.String

リクエストの問合せ文字列。

REFERENCE_PARAMETERS

java.awt.List

WS-Addressing参照パラメータ。リストには、wsa:IsReferenceParameter="true"属性がマークされているすべてのSOAPヘッダーを含める必要があります。

SERVLET_CONTEXT

javax.servlet.ServletContext

リクエストに関連するサーブレット・コンテキスト・オブジェクト。

SERVLET_REQUEST

javax.servlet.http.HttpServletRequest

リクエストに関連するサーブレット・リクエスト・オブジェクト。

SERVLET_RESPONSE

javax.servlet.http.HttpServletResponse

リクエストに関連するサーブレット・レスポンス・オブジェクト。

WSDL_DESCRIPTION

org.xml.sax.InputSource

WSDLドキュメントの入力ソース(解決可能なURI)。

WSDL_INTERFACE

javax.xml.namespace.QName

ポート・タイプまたはWSDLインタフェースの名前。

WSDL_OPERATION

javax.xml.namespace.QName

現在のメッセージが所属するWSDL操作の名前。

WSDL_PORT

javax.xml.namespace.QName

メッセージを受け取ったWSDLポートの名前。

WSDL_SERVICE

javax.xml.namespace.QName

呼出し対象サービスの名前。

ステートレス・セッションEJBを実装すべき場合

jwsc Antタスクでは、JWSファイルを処理するときは常に、Webサービスの基底の実装としてプレーンJavaオブジェクトが選択されます。

しかし、Webサービスの基底の実装をステートレス・セッションEJBにして、EJBが提供するすべての機能(インスタンス・プール、トランザクション、セキュリティ、コンテナ管理による永続性、コンテナ管理による関連、データ・キャッシュなど)を使用することが必要な場合もあります。Webサービスの実装をEJBにする場合は、次のセクションのプログラミング・ガイドラインに従ってください。

EJB 3.0では、EJBを実装する場合に必要なEJBリモートおよびホーム・インタフェース・クラスおよびデプロイメント記述子ファイルを、手動で作成するのではなく、自動的に生成することができるメタデータ・アノテーションが導入されました。EJB 3.0の詳細は、『Oracle WebLogic Server WebLogic Enterprise JavaBeansバージョン3.0のプログラミング』を参照してください。

JWSファイルにEJBを実装するには、次の手順に従います。

- EJB 3.0アノテーションをインポートします。これらのアノテーションはすべてjavax.ejbパッケージにあります。少なくとも、@Statelessアノテーションはインポートする必要があります。JWSファイルにはEJBの形式および動作を指定する追加のEJBアノテーションを指定することもできます。詳細は、javax.ejb Javadoc (http://download.oracle.com/javaee/5/api/javax/ejb/package-summary.html)を参照してください。
例:

import javax.ejb.Stateless;

- 少なくとも、クラス・レベルで@Statelessアノテーションを使用し、EJBを識別します。

@Stateless
public class SimpleEjbImpl {

以下の例では、ステートレス・セッションEJBを実装する簡単なJWSファイルを示します。関連するコードは太字で示されています。

package examples.webservices.jaxws;

import weblogic.transaction.TransactionHelper;
import javax.ejb.Stateless;
import javax.ejb.SessionContext;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.transaction.SystemException;
import javax.transaction.Status;
import javax.transaction.Transaction;
import javax.xml.ws.WebServiceContext;

/**
* A transaction-awared stateless EJB-implemented JWS
*/

// Standard JWS annotation that specifies that the portName,serviceName and
// target Namespace of the Web Service.
@WebService(
name = "Simple",
portName = "SimpleEJBPort",
serviceName = "SimpleEjbService",
targetNamespace = "http://wls/samples")

//Standard EJB annotation
@Stateless
public class SimpleEjbImpl {

@Resource
private WebServiceContext context;
private String constructed = null;

// The WebMethod annotation exposes the subsequent method as a public
// operation on the Web Service.
@WebMethod()
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public String sayHello(String s) throws SystemException {
Transaction transaction =
TransactionHelper.getTransactionHelper().getTransaction();
int status = transaction.getStatus();
if (Status.STATUS_ACTIVE != status)
throw new IllegalStateException("transaction did not start,
status is: " + status + ", check ejb annotation processing");

return constructed + ":" + s;
}

ユーザー定義のJavaデータ型のプログラミング

Webサービス操作として公開されるJWSファイルのメソッドでは、パラメータや戻り値として必ずしも組込みのデータ型(Stringやintegerなど)を使用する必要はなく、独自に作成するJavaデータ型を使用することができます。ユーザー定義のデータ型の例としては、Stringの銘柄記号とintegerの売買株式数という2つのフィールドを持つTradeResultがあります。

JWSファイルで、1つまたは複数のメソッドのパラメータまたは戻り値としてユーザー定義のデータ型を使用する場合は、データ型のJavaコードを独自に作成して、JWSファイルにそのクラスをインポートし、適切に使用する必要があります。必要なデータ・バインディング・アーティファクトはすべて、jwsc Antタスクが後で作成します。

ユーザー定義のデータ型のJavaコードを記述するときは、以下の基本的な要件に従います。

- デフォルト・コンストラクタを定義します。これは、パラメータを取らないコンストラクタです。

- 公開するメンバー変数ごとにgetXXX()メソッドとsetXXX()メソッドの両方を定義します。

- 公開される各メンバー変数のデータ型は、組込みデータ型のいずれか、または組込みデータ型で構成されるユーザー定義のデータ型にします。

注意:

カスタム・マッピングを提供するにはJAXBを使用することができます。詳細は、「JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ」を参照してください。

jwsc Antタスクでは、最も一般的なXMLおよびJavaデータ型のデータ・バインディング・アーティファクトを生成できます。サポートされるユーザー定義のデータ型のリストは、「サポートされるユーザー定義のデータ型」を参照してください。サポートされる組込みデータ型の完全なリストは、「サポートされる組込みデータ型」参照してください。

次の例では、BasicStructという簡単なユーザー定義のJavaデータ型を示します。

package examples.webservices.complex;
/**
* Defines a simple JavaBean called BasicStruct that has integer, String,
* and String[] properties
*/
public class BasicStruct {
// Properties
private int intValue;
private String stringValue;
private String[] stringArray;
// Getter and setter methods
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getStringValue() {
return stringValue;
}
public void setStringValue(String stringValue) {
this.stringValue = stringValue;
}
public String[] getStringArray() {
return stringArray;
}
public void setStringArray(String[] stringArray) {
this.stringArray = stringArray;
}
}

以下のJWSファイルの抜粋では、BasicStructクラスをインポートして、1つのメソッドのパラメータおよび戻り値として使用する方法を示しています。完全なJWSファイルについては、「サンプルComplexImpl.java JWSファイル」を参照してください。

package examples.webservices.complex;
// Import the standard JWS annotation interfaces
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
// Import the WebLogic-specific JWS annotation interface
// Import the BasicStruct JavaBean
import examples.webservices.complex.BasicStruct;
@WebService(serviceName="ComplexService", name="ComplexPortType",
targetNamespace="http://example.org")
...
public class ComplexImpl {
@WebMethod(operationName="echoComplexType")
public BasicStruct echoStruct(BasicStruct struct)
{
return struct;
}
}

JWSファイルからの別のWebサービスの呼出し

JWSファイル内から別のWebサービス(WebLogic ServerにデプロイされているWebサービス、または.NETなどの他のアプリケーション・サーバーにデプロイされているWebサービス)を呼び出すことができます。その手順は、「Java SEアプリケーションからのWebサービスの呼出し」で説明した手順と似ています(ただしこの場合は、clientgen Antタスクを実行してクライアント・スタブを生成するのではなく、呼出し側のWebサービスを構築するjwsc Antタスクに<clientgen>子要素を含めてクライアント・スタブを生成します)。その後は、Java SEクライアント・アプリケーションの場合と同じように、JWSファイル内で標準のJAX-WS APIを使用します。

詳細な手順については、「WebLogic WebサービスからのWebサービスの呼出し」を参照してください。

SOAP 1.2の使用

WebLogic Webサービスでは、Webサービスとそのクライアントの間でデータや呼出しを転送する際に、メッセージ・フォーマットとしてデフォルトでバージョン1.1のSOAP (Simple Object Access Protocol)が使用されます。WebLogic Webサービスでは、SOAP 1.1と新しいSOAP 1.2の両バージョンがサポートされており、どちらのバージョンでも使用できます。

Webサービスでバージョン1.2のSOAPを使用することを指定するには、JWSファイルでクラス・レベルの@javax.xml.ws.BindingTypアノテーションを使用し、次の例に示すようにその唯一の属性の値をSOAPBinding.SOAP12HTTP_BINDINGに設定します(該当部分は太字で示してあります)。

package examples.webservices.soap12;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.SOAPBinding;
@WebService(name="SOAP12PortType",
serviceName="SOAP12Service",
targetNamespace="http://example.org")
@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING)
/**
* This JWS file forms the basis of simple Java-class implemented WebLogic
* Web Service with a single operation: sayHello.  The class uses SOAP 1.2
* as its binding.
*
*/
public class SOAP12Impl {
@WebMethod()
public String sayHello(String message) {
System.out.println("sayHello:" + message);
return "Here is the message: '" + message + "'";
}
}

WebサービスでSOAP 1.2を使用する上で、Webサービスを呼び出すクライアント・アプリケーションを変更する場合も含め、このアノテーションを設定する以外の設定は必要ありません。WebLogic Webサービス・ランタイムによってすべて自動的に処理されます。

XMLスキーマの検証

デフォルトでは、SOAPメッセージはXMLスキーマに対して検証されません。後続のセクションで説明するように、サーバーまたはクライアントでドキュメント・リテラルWebサービスに対してXMLスキーマ検証を有効化することができます。SOAPメッセージが無効の場合は、SOAPフォルトが返されます。

注意:

この機能により、Webサービス・リクエストに対してわずかな処理が追加されます。

デフォルトでは、SOAPフォルトの詳細にはスタック・トレースが含まれます。スタック・トレースの無効化については、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のスタック・トレースの無効化に関する項を参照してください。

サーバーでのスキーマ検証の有効化

注意:

com.sun.xml.ws.developer.SchemaValidation APIは、JDK 6.0の拡張としてサポートされています。このAPIはJDK 6.0キットの一部としては提供されないため、変更される可能性があります。

サーバーでスキーマ検証を有効化するには、エンドポイント実装で@SchemaValidationアノテーションを追加します。例:

import com.sun.xml.ws.developer.SchemaValidation;
import javax.jws.WebService;
@SchemaValidation
@WebService(name="HelloWorldPortType", serviceName="HelloWorldService")
public class HelloWorldImpl {
public String sayHelloWorld(String message) {
System.out.println("sayHelloWorld:" + message);
return "Here is the message: '" + message + "'";
}
}

アプリケーション内のエラーを管理する場合、独自の検証エラー・ハンドラ・クラスを引数としてアノテーションに渡すことができます。例:

@SchemaValidation(handler=ErrorHandler.class)

クライアントでのスキーマ検証の有効化

注意:

com.sun.xml.ws.developer.SchemaValidation APIは、JDK 6.0の拡張としてサポートされています。このAPIはJDK 6.0キットの一部としては提供されないため、変更される可能性があります。

クライアントでスキーマ検証を有効化するには、SchemaValidationFeatureオブジェクトを作成し、PortTypeスタブ実装の作成時に引数として渡します。

package examples.webservices.hello_world.client;
import com.sun.xml.ws.developer.SchemaValidationFeature;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;
public class Main {
public static void main(String[] args) {
HelloWorldService service;
try {
service = new HelloWorldService(new URL(args[0] + "?WSDL"),
new QName("http://example.org", "HelloWorldService") );
} catch (MalformedURLException murl) { throw new RuntimeException(murl); }
SchemaValidationFeature feature =
new SchemaValidationFeature();
HelloWorldPortType port = service.getHelloWorldPortTypePort(feature);
String result = null;
result = port.sayHelloWorld("Hi there!");
System.out.println( "Got result: " + result );
}
}

アプリケーション内のエラーを管理する場合、独自の検証エラー・ハンドラを引数としてSchemaValidationFeatureオブジェクトに渡すことができます。例:

SchemaValidationFeature feature =
new SchemaValidationFeature(MyErrorHandler.class);
HelloWorldPortType port = service.getHelloWorldPortTypePort(feature);

JWSプログラミングのベスト・プラクティス

以下のリストでは、JWSファイルをプログラミングする場合のベスト・プラクティスを示します。

- document-literal-bareのWebサービスを作成する場合は、@WebParam JWSアノテーションを使用して、特定のWebサービスのすべての操作のすべての入力パラメータに一意の名前を付けるようにします。document-literal-bareのWebサービスの性質上、@WebParamアノテーションを使用して入力パラメータの名前を明示的に指定しない場合、WebLogic Serverが入力パラメータの名前を作成するため、Webサービス内でパラメータの名前が重複するおそれがあります。

- 一般に、最も相互運用性の高いタイプのWebサービスは、document-literal-wrappedのWebサービスです。

- ハード・コード化された名前returnに常に依存するのではなく、@WebResult JWSアノテーションを使用して、操作の戻り値の名前を明示的に設定します。JWSファイルで@WebResultアノテーションを使用しない場合、returnが戻り値のデフォルト名になります。

5 JAXBデータ・バインディングの使用

この章では、Java Architecture for XML Binding (JAXB)データ・バインディングの使用方法について説明します。

この章では、以下のトピックについて説明します。

- JAXBを使用したデータ・バインディングの概要

- JAXBデータ・バインディング・アーティファクトの開発

- 標準データ型のマッピング

- JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ

- バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ

JAXBを使用したデータ・バインディングの概要

様々なシステム間でのデータ交換にはXMLが標準的に使用されているため、Webサービス・アプリケーションには、Javaアプリケーションから直接XML形式データへアクセスする手段が必要となります。具体的には、XMLコンテンツをJavaアプリケーションで読み取れる形式に変換する必要があります。データ・バインディングでは、XML表現とJava表現間のデータ変換を記述します。

JAX-WSでは、JAXB (http://jcp.org/en/jsr/detail?id=222を参照)を使用してあらゆるデータ・バインディング・タスクを管理します。具体的には、JAXBによりJavaメソッド・シグネチャとWSDLのメッセージおよび操作がバインドされるため、実行時の変換が自動的に処理される一方で、そのマッピングをカスタマイズすることができます。これにより、XMLに関する知識がそれほどなくても、XMLデータと処理関数を、Javaテクノロジに基づくアプリケーションに簡単に組み込むことができます。

次の図に、JAXBのデータ・バインディング・プロセスを示します。

図5-1 JAXBでのデータ・バインディング

「図5-1 JAXBでのデータ・バインディング」の説明

この図に示すように、JAXBのデータ・バインディング・プロセスは、以下のタスクから構成されます。

- バインド: XMLスキーマをスキーマ派生のJAXB Javaクラス、または値クラスにバインドします。各クラスは、一連のJavaBeanスタイルのアクセス・メソッド(getおよびsetメソッド)を介してコンテンツへのアクセスを提供します。バインディングは、JAXBのスキーマ・コンパイラによって管理されます。

- アンマーシャリング - XMLドキュメントを変換し、Javaプログラムの要素やオブジェクトのツリーを作成します。このツリーは、そのドキュメントのコンテンツおよび構成を表し、独自のJavaコードでアクセスできます。コンテンツ・ツリーでは、複合型は値クラスへマップされます。属性の宣言や要素(単純型)は、値クラス内のプロパティまたはフィールドへマップされ、それらの値にアクセスするにはgetおよびsetメソッドを使用します。アンマーシャリングは、JAXBの「バインディング・フレームワーク」によって管理されます。

- マーシャリング - JavaオブジェクトをXMLコンテンツへ変換します。この場合、WSDL操作としてデプロイされているJavaメソッドによって、wsdl:typesセクション内のスキーマ・コンポーネントが特定されます。マーシャリングは、JAXBのバインディング・フレームワークによって管理されます。

JAXBバインディング言語を使用すると、カスタム・バインディング宣言を定義したり、JAXBアノテーションを指定してXMLとJava間のデータ変換を制御することができます。

以降の項で説明する内容は、次のとおりです。

- JAXBデータ・バインディング・アーティファクトの開発 - WebLogic ServerでJAXBデータ・バインディング・アーティファクトを開発する方法を説明します。

- 標準データ型のマッピング - サポートされる標準の組込みデータ型およびユーザー定義データ型について説明します。

- JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ - JWSファイルでJAXBアノテーションを使用してJava-to-XMLスキーマ・マッピングを制御およびカスタマイズする方法について説明します。

- バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ - 別のファイルや埋込みインラインで定義されているバインディング宣言を使用して、XMLスキーマ-to-Javaマッピングを制御およびカスタマイズする方法について説明します。

JAXBデータ・バインディング・アーティファクトの開発

WebLogic ServerでJAXBデータ・バインディング・アーティファクトを開発する手順は、Javaクラス・ファイルとWSDLのどちらから開始するかによって異なります。

- Javaからの開始: このプログラミング・モデルを使用する場合、Javaクラスを作成します。JAXBは実行時にJavaオブジェクトをマーシャリングしてXMLコンテンツを生成し、このXMLコンテンツがSOAPメッセージ内にパッケージ化され、Webサービスのリクエストまたはレスポンスとして送信されます。
Java-to-XMLマッピングを制御するため、「JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ」で説明しているように、JWSファイルにJAXBアノテーションを含めます。カスタマイズが不要な場合、「組込みデータ型のJava-to-XMLマッピング」および「サポートされるユーザー定義のJavaデータ型」で説明しているように、JAXBは標準の組込みデータ型およびユーザー定義データ型のマッピングを使用します。

このプログラミング・モデルの詳細は、「Javaから開始するWebLogic Webサービスの開発: 主な手順」を参照してください。

- WSDLからの開始: このプログラミング・モデルを使用する場合、XMLスキーマが存在し、JAXBはXMLドキュメントをアンマーシャリングしてJavaオブジェクトを生成します。
XML-to-Javaマッピングを制御するため、「バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ」で説明しているように、カスタム・バインディング宣言をWSDLまたはXMLスキーマ内で、あるいは外部ファイルで定義できます。カスタマイズが不要な場合、「組込みデータ型のXML-to-Javaマッピング」および「サポートされるユーザー定義のXMLデータ型」で説明しているように、標準の組込みデータ型およびユーザー定義データ型のマッピングが使用されます。

このプログラミング・モデルの詳細は、「WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順」を参照してください。

こららの手順で説明しているjwsc、wsdlc、またはclientgen Antタスクを呼び出す場合、以下の点に注意する必要があります。

- JAX-WS WebサービスおよびJAXBバインディング・アーティファクトを生成するには、type="JAXWS"属性を指定する必要があります。jwscでは、<jws>子要素の一部としてtype属性を指定します。

- 必要に応じて、<binding>子要素を指定し、JAX-WSおよびJAXBのデータ・バインディングのカスタマイズ情報を格納するカスタマイズ・ファイルを指定することができます。カスタマイズ・ファイルの作成に関する情報は「バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ」を参照してください。カスタマイズが不要な場合、「標準データ型のマッピング」で説明しているように、JAXBは標準の組込みデータ型およびユーザー定義データ型のマッピングを使用します。

jwsc、wsdlc、またはclientgen Antタスクの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のAntタスク・リファレンスに関する項を参照してください。

標準データ型のマッピング

WebLogic Webサービスでは、JAXB 2.0 (JSR 222)仕様(http://jcp.org/en/jsr/detail?id=222)の規定に従って組込みのXMLスキーマ、Java、およびSOAPのデータ型がサポートされており、追加のプログラミング手順を踏まずに、そうしたデータ型をWebサービス操作で使用できます。組込みデータ型には、integer、string、timeなどがあります。

また、Webサービスの入力パラメータや戻り値として、様々なユーザー定義のXMLおよびJavaデータ型を使用できます。ユーザー定義のデータ型には、XMLスキーマやJavaの構成要素から作成する<xsd:complexType>やJavaBeanなどがあります。jwscやclientgenなどのWebLogic WebサービスAntタスクでは、ユーザー定義のデータ型をXML表現とJava表現の間で変換するのに必要なデータ・バインディング・アーティファクトが自動的に生成されます。XML表現はSOAPリクエストやレスポンス・メッセージで使用し、Java表現はWebサービスを実装するJWSで使用します。

以下の項では、JAXBでサポートされている組込みデータ型およびユーザー定義データ型について説明します。

- サポートされる組込みデータ型

- サポートされるユーザー定義のデータ型

サポートされる組込みデータ型

次のセクションでは、WebLogic Webサービスがサポートする組込みデータ型およびそのXML表現とJava表現間のマッピングについて説明します。Webサービスを実装するバックエンド・コンポーネントのパラメータと戻り値のデータ型が、組込みデータ型のセットの中にあるかぎり、データはWebLogic Serverによって、XMLとJava間で自動的に変換されます。

ユーザー定義のデータ型を使用する場合は、XMLとJava間でデータを変換するデータ・バインディング・アーティファクトを作成する必要があります。WebLogic Serverには、ほとんどのユーザー定義データ型のデータ・バインディング・アーティファクトを自動的に生成可能なjwscおよびwsdlc Antタスクが用意されています。サポートされるXMLとJavaのデータ型については、「サポートされるユーザー定義のデータ型」を参照してください。

組込みデータ型のXML-to-Javaマッピング

次の表に、サポートされるXMLスキーマ・データ型(ターゲット・ネームスペースhttp://www.w3.org/2001/XMLSchema)と、それぞれに対応するJavaデータ型をアルファベット順に示します。サポートされるユーザー定義のXMLデータ型については、「組込みデータ型のJava-to-XMLマッピング」を参照してください。

表5-1 XMLスキーマの組込みデータ型とJavaデータ型のマッピング

XMLスキーマ・データ型

Javaデータ型(小文字はプリミティブ・データ型を示します)

anySimpleType (この型のxsd:element用)

java.lang.Object

anySimpleType (この型のxsd:attribute用)

java.lang.String

base64Binary

byte[]

boolean

boolean

byte

byte

date

java.xml.datatype.XMLGregorianCalendar

dateTime

javax.xml.datatype.XMLGregorianCalendar

decimal

java.math.BigDecimal

double

double

duration

javax.xml.datatype.Duration

float

float

g

java.xml.datatype.XMLGregorianCalendar

hexBinary

byte[]

int

int

integer

java.math.BigInteger

long

long

NOTATION

javax.xml.namespace.QName

QName

javax.xml.namespace.QName

short

short

string

java.lang.String

time

java.xml.datatype.XMLGregorianCalendar

unsignedByte

short

unsignedInt

long

unsignedShort

int

次の例はJAXB仕様からの抜粋ですが、デフォルトのXML-to-Javaバインディングの例を示しています。

XMLスキーマ

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
<xsd:element name="comment" type="xsd:string"/>
<xsd:complexType name="PurchaseOrderType">
<xsd:sequence>
<xsd:element name="shipTo" type="USAddress"/>
<xsd:element name="billTo" type="USAddress"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="items" type="Items"/>
</xsd:sequence>
<xsd:attribute name="orderDate" type="xsd:date"/>
</xsd:complexType>
<xsd:complexType name="USAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
<xsd:element name="state" type="xsd:string"/>
<xsd:element name="zip" type="xsd:decimal"/>
</xsd:sequence>
<xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
</xsd:complexType>
<xsd:complexType name="Items">
<xsd:sequence>
<xsd:element name="item" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="productName" type="xsd:string"/>
<xsd:element name="quantity">
<xsd:simpleType>
<xsd:restriction base="xsd:positiveInteger">
<xsd:maxExclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="USPrice" type="xsd:decimal"/>
<xsd:element ref="comment" minOccurs="0"/>
<xsd:element name="shipDate" type="xsd:date"
minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="partNum" type="SKU" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<!-- Stock Keeping Unit, a code for identifying products -->
<xsd:simpleType name="SKU">
<xsd:restriction base="xsd:string">
<xsd:pattern value="\d{3}-[A-Z]{2}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>

デフォルトJavaバインディング

import javax.xml.datatype.XMLGregorianCalendar; import java.util.List;
public class PurchaseOrderType {
USAddress getShipTo(){...}
void setShipTo(USAddress){...}
USAddress getBillTo(){...}
void setBillTo(USAddress){...}
/** Optional to set Comment property. */
String getComment(){...}
void setComment(String){...}
Items getItems(){...}
void setItems(Items){...}
XMLGregorianCalendar getOrderDate()
void setOrderDate(XMLGregorianCalendar)
};
public class USAddress {
String getName(){...}
void setName(String){...}
String getStreet(){...}
void setStreet(String){...}
String getCity(){...}
void setCity(String){...}
String getState(){...}
void setState(String){...}
int getZip(){...}
void setZip(int){...}
static final String COUNTRY="USA";
};
public class Items {
public class ItemType {
String getProductName(){...}
void setProductName(String){...}
/** Type constraint on Quantity setter value 0..99.*/
int getQuantity(){...}
void setQuantity(int){...}
float getUSPrice(){...}
void setUSPrice(float){...}
/** Optional to set Comment property. */
String getComment(){...}
void setComment(String){...}
XMLGregorianCalendar getShipDate();
void setShipDate(XMLGregorianCalendar);
/** Type constraint on PartNum setter value "\d{3}-[A-Z]{2}".*/
String getPartNum(){...} void setPartNum(String){...}
};
/** Local structural constraint 1 or more instances of Items.ItemType.*/
List<Items.ItemType> getItem(){...}
}
public class ObjectFactory {
// type factories
Object newInstance(Class javaInterface){...}
PurchaseOrderType createPurchaseOrderType(){...}
USAddress createUSAddress(){...}
Items createItems(){...}
Items.ItemType createItemsItemType(){...}
// element factories
JAXBElement<PurchaseOrderType>createPurchaseOrder(PurchaseOrderType){...}
JAXBElement<String> createComment(String value){...}
}

組込みデータ型のJava-to-XMLマッピング

次の表に、サポートされているJavaデータ型と、それぞれに対応するXMLスキーマ・データ型をアルファベット順に示します。サポートされるユーザー定義のJavaデータ型については、「サポートされるユーザー定義のJavaデータ型」を参照してください。

表5-2 Javaデータ型とXMLスキーマ・データ型のマッピング

Javaデータ型(小文字はプリミティブ・データ型を示します)

XMLスキーマ・データ型

boolean

boolean

byte

byte

double

double

float

float

long

long

int

int

javax.activation.DataHandler

base64Binary

java.awt.Image

base64Binary

java.lang.Object

anyType

java.lang.String

string

java.math.BigInteger

integer

java.math.BigDecimal

decimal

java.net.URI

string

java.util.Calendar

dateTime

java.util.Date

dateTime

java.util.UUID

string

javax.xml.datatype.XMLGregorianCalendar

anySimpleType

javax.xml.datatype.Duration

duration

javax.xml.namespace.QName

Qname

javax.xml.transform.Source

base64Binary

short

short

サポートされるユーザー定義のデータ型

以降の項の表には、jwscおよびwsdlc Antタスクでデータ・バインディング・アーティファクトを自動的に生成できるユーザー定義のXMLデータ型およびJavaデータ型(対応するJava表現またはXML表現など)をまとめます。

これらの表にないXMLデータ型またはJavaデータ型で、「サポートされる組込みデータ型」の表に示した組込みデータ型でもない型の場合は、ユーザー定義データ型のアーティファクトを手動で作成する必要があります。

サポートされるユーザー定義のXMLデータ型

次の表に、jwscおよびwsdlc AntタスクでサポートされるXMLスキーマ・データ型と、それぞれに対応するJavaデータ型またはマッピング・メカニズムをまとめます。

表5-3 サポートされているユーザー定義のXMLスキーマ・データ型

XMLスキーマ・データ型

同等のJavaデータ型またはマッピング・メカニズム

単純型および複合型の両方の要素を持つ<xsd:complexType>

JavaBean

単純なコンテンツを含む<xsd:complexType>

JavaBean

<xsd:complexType>の<xsd:attribute>

JavaBeanのプロパティ。

既存の単純型の制限による新しい単純型の派生

同等の単純型のJavaデータ型。

制限要素で使用されるファセット

シリアライゼーションおよびデシリアライゼーションで強制されないファセット。

<xsd:list>

リスト・データ型の配列。

wsdl:arrayType属性を使用した制限によってsoapenc:Arrayから派生する配列

arrayTypeデータ型と同等のJavaデータ型の配列。

制限によってsoapenc:Arrayから派生する配列

同等のJavaデータ型の配列。

単純型からの複合型の派生

_valueというプロパティのあるJavaBean。_valueの型は、この項の規則に従って単純型からマップされます。

<xsd:anyType>

java.lang.Object

<xsd:any>

java.lang.Object

<xsd:any[]>

java.lang.Object

<xsd:union>

ユニオン・メンバーの共通の親タイプ。

<xsi:nil>および<xsd:nillable>属性

Javaのnull値。

XMLデータ型が組込みデータ型で通常はJavaプリミティブ・データ型(intやshortなど)にマップされる場合、そのXMLデータ型は実際には同等のオブジェクト・ラッパー型(java.lang.Integerやjava.lang.Shortなど)にマップされます。

複合型の派生

Javaの継承を使用してマップされます。

抽象型

抽象Javaデータ型。

サポートされるユーザー定義のJavaデータ型

次の表は、jwscおよびwsdlc Antタスクでサポートされるユーザー定義のJavaデータ型と、それぞれに対応するXMLスキーマ・データ型の一覧です。

表5-4 サポートされるユーザー定義のJavaデータ型

Javaデータ型

同等のXMLスキーマ・データ型

サポートされている任意のデータ型をプロパティとするJavaBean

JavaBeanプロパティに対応する要素の<xsd:sequence>をコンテンツ・モデルとする<xsd:complexType>。

サポートされるすべてのデータ型の配列および多次元配列(JavaBeanプロパティとして使用する場合)

maxOccurs属性がunboundedに設定されている<xsd:complexType>内の要素。

java.lang.Object

注意: 実行時オブジェクトのデータ型は既知の型でなければなりません。

<xsd:anyType>

java.util.Collection

リテラル配列。

java.util.List

リテラル配列。

java.util.ArrayList

リテラル配列。

java.util.LinkedList

リテラル配列。

java.util.Vector

リテラル配列。

java.util.Stack

リテラル配列。

java.util.Set

リテラル配列。

java.util.TreeSet

リテラル配列。

java.utils.SortedSet

リテラル配列。

java.utils.HashSet

リテラル配列。

JAXBアノテーションを使用したJava-to-XMLスキーマ・マッピングのカスタマイズ

必要に応じて、JAXBアノテーションを使用してJava-to-XMLスキーマ・マッピングのデフォルト・バインディング規則をオーバーライドすることができます。表5-5に、JavaオブジェクトをXMLにマッピングする方法を制御するためにJWSファイルに含めることができるJAXBマッピング・アノテーションを示します。これらの各アノテーションは、javax.xml.bind.annotationパッケージ(http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/package-summary.htmlを参照)で利用できます。

表5-5 JAXBマッピング・アノテーション

アノテーション

説明

@XmlAccessorType

デフォルトでフィールドやプロパティをマップするかどうかを指定します。フィールドおよびプロパティのデフォルト・シリアライゼーションの指定(@XmlAccessorTypeアノテーション)を参照してください。

@XmlElement

クラスに格納されているプロパティを、格納しているクラスがマップされているXMLスキーマの複合型のローカル要素へマップします。プロパティとローカル要素のマッピング(@XmlElement)を参照してください。

@XMLMimeType

image/jpegなど、プロパティのXML表現を制御するMIMEタイプとテキスト表現を関連付けます。MIMEタイプの指定(@XmlMimeTypeアノテーション)を参照してください。

@XmlRootElement

WebサービスのWSDLによって使用されるXMLスキーマのグローバル要素に最上位クラスをマップします。「最上位クラスとグローバル要素のマッピング(@XmlRootElement)」を参照してください。

@XmlSeeAlso

現在のクラスをバインディングする際に他のクラスをバインドします。複数のクラスのバインディング(@XmlSeeAlso)を参照してください。

@XmlType

XMLスキーマ型にクラスまたは列挙型をマップします。値クラスとスキーマ型のマッピング(@XmlType)を参照してください。

以下の項に、サポートされている組込みデータ型およびユーザー定義データ型のXMLスキーマに対するJavaオブジェクトのデフォルト・マッピングを示します。

- 組込みデータ型のJava-to-XMLマッピング

- サポートされるユーザー定義のJavaデータ型

JAXBアノテーションの例

次に、JAXBアノテーションの例を示します。

@XmlRootElement(name = "ComplexService", namespace ="http://examples.org")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "basicStruct", propOrder = {
"intValue",
"stringArray",
"stringValue"
)
public class BasicStruct {
protected int intValue;
@XmlElement(nillable = true)
protected List<String> stringArray;
protected String stringValue;
public int getIntValue() {
return intValue;
}
public void setIntValue(int value) {
this.intValue = value;
}
public List<String> getStringArray() {
if (stringArray == null) {
stringArray = new ArrayList<String>();
}
return this.stringArray;
}

public String getStringValue() {
return stringValue;
}
public void setStringValue(String value) {
this.stringValue = value;
}
}

フィールドおよびプロパティのデフォルト・シリアライゼーションの指定(@XmlAccessorTypeアノテーション)

@XmlAccessorTypeアノテーションは、フィールドやプロパティをデフォルトでマッピングするかどうかを指定します。このアノテーションは、次のJavaプログラム要素に対して指定できます。

- パッケージ

- 最上位クラス

@XmlAccessorTypeは、@XmlType (値クラスとスキーマ型のマッピング(@XmlType))および@XmlRootElement (最上位クラスとグローバル要素のマッピング(@XmlRootElement))アノテーションで指定されます。

次の表に、@XmlAccessorTypeアノテーションに渡すことができる省略可能な要素を示します。

表5-6 @XMLAccessorTypeアノテーションの省略可能な要素

要素

説明

value

XMLAccessType.valuevalueを指定します。valueは以下のいずれかの値です。

- FIELD - フィールドがXMLにバインドされます。

- PROPERTY - JavaBeanプロパティ(ゲッター/セッターのペア)がXMLにバインドされます。

- PUBLIC_MEMBER - パブリック・フィールドおよびJavaBeanプロパティがXMLにバインドされます。これがデフォルトです。

- NONE - フィールドもJavaBeanプロパティもXMLにバインドされません。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlAccessorType.htmlにあるJavadocの「javax.xml.bind.annotation.XmlAccessorType」を参照してください。例については、JAXBアノテーションの例の項を参照してください。

プロパティとローカル要素のマッピング(@XmlElement)

@XmlElementアノテーションは、クラスに格納されているプロパティを、格納しているクラスがマップされているXMLスキーマの複合型のローカル要素へマップします。このアノテーションは、次のJavaプログラム要素に対して指定できます。

- JavaBeanプロパティ

- 非静的な永続フィールド

次の表に、@XmlElementアノテーションに渡すことができるアノテーション要素を示します。

表5-7 @XMLElementアノテーションの省略可能な要素

要素

説明

name

JavaBeanのプロパティを表すXML要素のローカル名。この要素のデフォルトは、JavaBeanプロパティ名。

namespace

JavaBeanのプロパティを表すXML要素のネームスペース。デフォルトのネームスペースは、格納しているクラスのネームスペースから派生します。

nillable

nullを許容するように要素宣言をカスタマイズします。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlElement.htmlにあるJavadocの「javax.xml.bind.annotation.XmlElement」を参照してください。

MIMEタイプの指定(@XmlMimeTypeアノテーション)

@XmlMimeTypeアノテーションは、プロパティのXML表現を制御するMIMEタイプを指定します。このアノテーションは、XMLのxsd:base64BinaryバイナリにバインドされるImageやSourceなどのデータ型に対して指定できます。

次の表に、@XmlMimeTypeアノテーションに渡すことができる必須の要素を示します。

表5-8 @XMLMimeTypeアノテーションの必須要素

要素

説明

value

image/jpegやtext/xmlなど、MIMEタイプのテキスト表現を指定します。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlMimeType.htmlにあるJavadocの「javax.xml.bind.annotation.XmlMimeType」を参照してください。

最上位クラスとグローバル要素のマッピング(@XmlRootElement)

@XmlRootElementアノテーションは、WebサービスのWSDLによって使用されるXMLスキーマのグローバル要素に最上位クラスをマップします。このアノテーションは、次のJavaプログラム要素に対して指定できます。

- 最上位クラス

- 列挙型

@XmlRootElementは、@XmlType (値クラスとスキーマ型のマッピング(@XmlType))および@XmlAccessorType(フィールドおよびプロパティのデフォルト・シリアライゼーションの指定(@XmlAccessorType Annotation))アノテーションで指定されます。

次の表に、@XmlRootElementアノテーションに渡すことができる省略可能な要素を示します。

表5-9 @XmlRootElementアノテーションの省略可能な要素

要素

説明

name

XML要素のローカル名。この要素のデフォルトはクラス名です。

namespace

XML要素のネームスペース。デフォルトのネームスペースは、クラスのパッケージから派生します。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlRootElement.htmlにあるJavadocの「javax.xml.bind.annotation.XmlRootElement」を参照してください。例については、JAXBアノテーションの例の項を参照してください。

複数のクラスのバインディング(@XmlSeeAlso)

@XmlSeeAlsoアノテーションは、現在のクラスをバインドする際にクラスのリストをバインドします。次の表に、@XMLRootElementアノテーションに渡すことができる省略可能な要素を示します。

表5-10 @XmlSeeAlsoアノテーションの省略可能な要素

要素

説明

value

現在のクラスをバインドする際にJAXBで使用されるクラスのリスト。

値クラスとスキーマ型のマッピング(@XmlType)

@XmlTypeアノテーションは、クラスまたは列挙型をXMLスキーマ型にマップします。型は単純型または複合型の場合があります。このアノテーションは、次のJavaプログラム要素に対して指定できます。

- 最上位クラス

- 列挙型

@XmlTypeは、@XmlRootElement (最上位クラスとグローバル要素のマッピング(@XmlRootElement))および@XmlAccessorType (フィールドおよびプロパティのデフォルト・シリアライゼーションの指定(@XmlAccessorType Annotation))アノテーションで指定されます。

次の表に、@XmlTypeアノテーションに渡すことができる省略可能な要素を示します。

表5-11 @XmlTypeアノテーションの省略可能な要素

要素

説明

name

クラスのマップ先のXMLスキーマ型の名前。

namespace

XMLスキーマ型のターゲット・ネームスペースの名前。デフォルトは、クラスを格納しているパッケージがマップされるターゲット・ネームスペース。

propOrder

クラスで定義されているJavaBeanプロパティ名のリスト。このリストは、クラスがXMLスキーマの複合型へマップされる際のXMLスキーマ要素の順番を定義します。リスト内の各名前は、JavaBeanプロパティのJava識別子の名前です。すべてのJavaBeanプロパティをリストする必要があります。

詳細は、http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlType.htmlにあるJavadocの「javax.xml.bind.annotation.XmlType」を参照してください。例については、JAXBアノテーションの例の項を参照してください。

バインディング宣言を使用したXMLスキーマ-to-Javaマッピングのカスタマイズ

WSDLファイルの分散的特性から、現在のアプリケーションの要件を満たすためにその中身を常に制御または変更できるとは限りません。たとえば、WSDLファイルを所有していなかったり、パートナがすでに使用している場合は、変更を加えるのは非現実的または不可能です。

WSDLファイルを直接編集できない場合、カスタム・バインディング宣言を指定することによって、WSDLコンポーネントがJavaオブジェクトへマップされる方法をカスタマイズすることができます。バインディング宣言を使用すると、非同期性、ラッパー形式など、特定の機能を制御したり、XMLスキーマのカスタマイズにより生成されるJAXBデータ・バインディング・アーティファクトを制御することもできます。

バインディング宣言は以下のいずれかの方法で定義することができます。

- 特定のWSDLまたはXMLスキーマ・ドキュメントのすべてのバインディング宣言を格納する外部のバインディング宣言ファイルを作成します。「外部バインディング宣言ファイルの作成」を参照してください。

注意:

カスタマイズが必要な場合、WSDLまたはXMLスキーマ・ドキュメントからカスタマイズを分離し、この方法で柔軟性を保つことをお薦めします。

- WSDLまたはXMLスキーマ・ドキュメント内にバインディング宣言を埋め込みます。「バインディング宣言の埋め込み」を参照してください。

選択する方法に関係なく、どのバインディング宣言も意味的には同じです。

カスタム・バインディング宣言は、次の図に示すようにスコープに関連付けられます。

図5-2 カスタム・バインディング宣言のスコープ

「図5-2 カスタム・バインディング宣言のスコープ」の説明

次の表で、各スコープの意味を説明します。

図5-12 カスタム・バインディング宣言のスコープ

スコープ

定義

グローバル・スコープ

グローバル・スコープのカスタマイズ値を表します。具体的には:

- JAX-WSバインディング宣言の場合、ルート要素の一部として定義されるカスタマイズ値を表します。「ルート要素の指定」を参照してください。

- JAXBアノテーションの場合、<globalBindings>バインディング宣言内に格納されるカスタマイズ値を表します。グローバル・スコープの値は、ソース・スキーマのすべてのスキーマ要素の他に、含まれる、またはインポートされるあらゆるスキーマに適用されます。

スキーマ・スコープ

<schemaBindings>バインディング宣言内に格納されるJAXBカスタマイズ値を表します。スキーマ・スコープの値は、スキーマのターゲット・ネームスペース内の要素に適用されます。

注意: このスコープが適用されるのはJAXBバインディング宣言のみです。

定義スコープ

グローバル宣言または型定義のバインディング宣言で定義されるJAXBカスタマイズ値を表します。定義スコープの値は、グローバル宣言または型定義を参照する要素に適用されます。

注意: このスコープが適用されるのはJAXBバインディング宣言のみです。

コンポーネント・スコープ

アノテーションが付けられたスキーマ要素またはWSDLに適用されるカスタマイズ値を表します。

カスタム・バインディング宣言のスコープは、以下の継承およびオーバーライド規則に準拠します。

- 継承 - カスタマイズ値は上から下へ継承されます。たとえば、コンポーネント・スコープのWSDL要素(JAX-WS)は、グローバル・スコープで定義されているカスタマイズ値を継承します。コンポーネント・スコープのスキーマ要素(JAXB)は、グローバル・スコープ、スキーマ・スコープ、および定義スコープで定義されているカスタマイズ値を継承します。

- オーバーライド - カスタマイズ値は下から上へオーバーライドされます。たとえば、コンポーネント・スコープのWSDL要素(JAX-WS)は、グローバル・スコープで定義されているカスタマイズ値をオーバーライドします。コンポーネント・スコープのスキーマ要素(JAXB)は、定義スコープ、スキーマ・スコープ、およびグローバル・スコープで定義されているカスタマイズ値をオーバーライドします。

以下の項では、カスタム・バインディング宣言の作成方法と、標準のカスタム・バインディング宣言について説明します。

- 外部バインディング宣言ファイルの作成

- バインディング宣言の埋め込み

- JAX-WSカスタム・バインディング宣言

- JAXBカスタム・バインディング宣言

カスタム・バインディング宣言の使用に関する詳細は、以下を参照してください。

- JAX-WS WSDLのカスタマイズ(http://jax-ws.java.net/nonav/2.1.2/docs/customizations.html)

- JAXB仕様(http://jcp.org/en/jsr/detail?id=222)の「Customizing XML Schema to Java Representation Binding」

外部バインディング宣言ファイルの作成

特定のWSDLまたはXMLスキーマ・ドキュメントのすべてのバインディング宣言を格納する外部のバインディング宣言ファイルを作成します。次に、バインディング宣言ファイルをwsdlc、jwsc、またはclientgen Antタスクの<binding>子要素に渡します。

以降の項で説明する内容は、次のとおりです。

- JAX-WSバインディング宣言を使用した外部バインディング宣言ファイルの作成

- JAXBバインディング宣言を使用した外部バインディング宣言ファイルの作成

JAX-WSバインディング宣言を使用した外部バインディング宣言ファイルの作成

以下の項では、JAX-WSバインディング宣言ファイルのルート要素および子要素の指定方法について説明します。定義可能なカスタム・バインディング宣言については、「JAX-WSカスタム・バインディング宣言」を参照してください。

ルート要素の指定

jaxws:bindings宣言は、その他すべてのバインディング宣言のルートであり、WSDLファイルの場所およびXMLスキーマが従うネームスペースhttp://java.sun.com/xml/ns/jaxwsを定義します。

ルート宣言は次の形式で指定します。

<jaxws:bindings
wsdlLocation="uri_of_wsdl"
jaxws:xmlns="http://java.sun.com/xml/ns/jaxws">

uri_of_wsdlにWSDLファイルのURIを指定します。

表5-5で定義しているパッケージ、ラッパー形式、および非同期性マッピングのカスタマイズは、外部カスタマイズ・ファイルにおけるルート・バインディング宣言の一部として「グローバル」に定義できます。グローバル・バインディングは、wsdlLocation属性によって参照されるWSDL内のwsdl:definitionのスコープ全体に適用されます。

次に、パッケージ名、ラッパー形式、非同期マッピングのカスタマイズを定義するルート・バインディング要素の例を示します。

<jaxws:bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:7001/simple/SimpleService?WSDL"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
<package name="example.webservices.simple.simpleservice">
<enableWrapperStyle>true</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>
</jaxws:bindings>

子要素の指定

ルートのjaxws:bindings要素には、子要素を含めることができます。カスタマイズしているWSDLノードは、node属性でXPath式を渡すことによって指定します。

コンパイルされたWSDLファイル内に埋め込まれたXMLスキーマは、標準のJAXBバインディングを使用してカスタマイズすることができます。詳細は、JAX-WS WSDL Customizations (http://jax-ws.java.net/nonav/2.1.2/docs/customizations.html)の「XML Schema Customization」を参照してください。定義可能なカスタムJAXBバインディング宣言については、「JAXBカスタム・バインディング宣言」を参照してください。

たとえば、次の例では、WSDLドキュメントのwsdl:definitionsノードのパッケージ名をexamples.webservices.complex.complexserviceとして定義しています。

<jaxws:bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:7001/simple/SimpleService?WSDL
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
<jaxws:bindings node="wsdl:definitions"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<jaxws:package name="examples.webservices.simple.simpleservice"/>
</bindings>

JAXBバインディング宣言を使用した外部バインディング宣言ファイルの作成

JAXBバインディング宣言ファイルは、ネームスペースhttp://java.sun.com/xml/ns/jaxbのXMLスキーマに従うXMLドキュメントです。以下の項では、JAXBバインディング宣言ファイルのルート要素および子要素の指定方法について説明します。定義可能なカスタム・バインディング宣言については、「JAXBカスタム・バインディング宣言」を参照してください。

ルート要素の指定

jaxb:bindings宣言は、その他すべてのバインディング宣言のルートであり、ルート宣言は次の形式で指定します。

<jaxb:bindings
schemaLocation="uri_of_schema">

uri_of_schemaにXMLスキーマ・ファイルのURIを指定します。

子要素の指定

ルートのjaxb:bindings要素には、子要素を含めることができます。カスタマイズしているスキーマ・ノードは、node属性でXPath式を渡すことによって指定します。

たとえば、次の例では、パッケージ名をexamples.webservices.simple.simpleserviceとして定義しています。

<jaxb:bindings
schemaLocation="simpleservice.xsd">
<jaxb:bindings node="//xs:simpleType[@name='value1']">
<jaxb:package name="examples.webservices.simple.simpleservice"/>
</jaxb:bindings>
</jaxb:bindings>

バインディング宣言の埋め込み

バインディング宣言は、以下のいずれかの方法でWSDLファイルに埋め込むことができます。

- WSDL拡張としてjaxws:bindings要素を使用し、JAX-WSまたはJAXBバインディング宣言をWSDLファイルに埋め込みます。「WSDLファイルへのJAX-WSまたはJAXBバインディング宣言の埋め込み」を参照してください。

- <appinfo>要素の一部として、JAXBバインディング宣言をXMLスキーマに埋め込みます。「XMLスキーマへのJAXBバインディング宣言の埋め込み」を参照してください。

WSDLファイルへのJAX-WSまたはJAXBバインディング宣言の埋め込み

バインディング宣言は、WSDL拡張としてjaxws:bindings要素を使用してWSDLファイルに埋め込むことができます。定義可能なカスタム・バインディング宣言については、「JAX-WSカスタム・バインディング宣言」を参照してください。

たとえば、次の例では、SimpleServiceImplサービス・エンドポイント・インタフェース(またはポート)のクラス名をSimpleServiceとして定義しています。

<wsdl:portType name="SimpleServiceImpl">
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
<jaxws:class name="SimpleService"/>
</jaxws:bindings>
</wsdl:portType>

このバインディング宣言を指定しなかった場合、サービス・エンドポイント・インタフェースのデフォルト・クラス名は、wsdl:portType名、すなわちSimpleServiceImplに設定されます。

コンパイルされたWSDLファイル内に埋め込まれたXMLスキーマは、標準のJAXBバインディングを使用してカスタマイズすることができます。詳細は、JAX-WS WSDL Customizations (http://jax-ws.java.net/nonav/2.1.2/docs/customizations.html)の「XML Schema Customizations」を参照してください。定義可能なカスタムJAXBバインディング宣言については、「JAXBカスタム・バインディング宣言」を参照してください。

XMLスキーマへのJAXBバインディング宣言の埋め込み

JAXBカスタム宣言は、次に示すようにXMLスキーマの<appinfo>要素内に埋め込むことができます。

<xs:annotation>
<xs:appinfo>
<binding declaration>
</xs:appinfo>
</xs:annotation>

たとえば、次の例では、スキーマのパッケージ名を定義しています。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<annotation>
<appinfo>
<jaxb:schemaBindings>
<jaxb:package name="example.webservices.simple.simpleservice"/>
</jaxb:schemaBindings>
</appinfo>
</annotation>
</schema>

JAX-WSカスタム・バインディング宣言

次の表に、一般的なJAX-WSのカスタマイズをまとめます。JAX-WSカスタム・バインディング宣言の完全なリストについては、http://jax-ws.java.net/nonav/2.1.2/docs/customizations.htmlにあるJAX-WS WSDL Customizationを参照してください。

表5-13 JAX-WSカスタム・バインディング宣言

カスタマイズ

説明

パッケージ名

パッケージ名の定義には、jaxws:packageバインディング宣言を使用します。

このカスタマイズを指定しない場合、wsdlc Antタスクが、WSDLのtargetNamespaceに基づいてパッケージ名を生成します。このデータ・バインディングのカスタマイズは、wsdlc、jwsc、またはclientgen AntタスクのpackageName属性によってオーバーライドされます。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のwsdlcに関する項を参照してください。

このバインディング宣言は、「外部バインディング宣言ファイルの作成」で説明するようにルート・バインディング要素の一部として指定したり、次の例で示すようにwsdl:definitionsノード上で指定することができます。

<bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation=
"http://localhost:7001/simple/SimpleService?WSDL"
xmlns="http://java.sun.com/xml/ns/jaxws">
<bindings node="wsdl:definitions"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<package name="example.webservices.simple.simpleService"/>
</bindings>

ラッパー形式規則

WSDL操作のパラメータや戻り値の型の生成方法を制御するラッパー形式規則を有効化または無効化するには、jaxws:enablesWrapperStyleバインディング宣言を使用します。

このバインディング宣言は、「外部バインディング宣言ファイルの作成」で説明するようにルート・バインディング要素の一部として指定したり、以下のいずれかのノード上で指定することができます。

- wsdl:definitions - すべてのwsdl:portType属性のすべてのwsdl:operationsに適用されます。

- wsdl:portType - wsdl:portType内のすべてのwsdl:operationsに適用されます。

- wsdl:operation - wsdl:operationにのみ適用されます。

次の例では、wsdl:definitionsノードのラッパー形式規則を無効化しています。

<bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:7001/simple/SimpleService?WSDL"
xmlns="http://java.sun.com/xml/ns/jaxws">
<bindings node="wsdl:definitions"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<enableWrapperStyle>
false
</enableWrapperStyle>
</bindings>

非同期性

WSDLファイルのコンパイル時にclientgen Antタスクに、通常の同期メソッドとともに非同期のポーリング操作およびコールバック操作を生成させるには、jaxws:enableAsycMappingバインディング宣言を使用します。

このバインディング宣言は、「外部バインディング宣言ファイルの作成」で説明するようにルート・バインディング要素の一部として指定したり、以下のいずれかのノード上で指定することができます。

- wsdl:definitions - すべてのwsdl:portType属性のすべてのwsdl:operationsに適用されます。

- wsdl:portType - wsdl:portType内のすべてのwsdl:operationsに適用されます。

- wsdl:operation - wsdl:operationにのみ適用されます。

次の例では、非同期のポーリング操作およびコールバック操作を無効化しています。

<bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
wsdlLocation="http://localhost:7001/simple/SimpleService?WSDL"
xmlns="http://java.sun.com/xml/ns/jaxws">
<bindings node="wsdl:definitions"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<enableAsyncMapping>
false
</enableAsyncMapping>
</bindings>

プロバイダ

プロバイダ・インタフェースとして一部をマークするには、jaxws:providerバインディング宣言を使用します。このバインディング宣言は、wsdl:portTypeの一部として指定できます。このバインディング宣言は、WSDLファイルから開始するサービスの開発時に適用されます。

クラス名

クラス名の定義には、jaxws:classバインディング宣言を使用します。このバインディング宣言は、以下のいずれかのノードに対して指定できます。

- wsdl:portType - インタフェース・クラス名を定義します。

- wsdl:fault - フォールト・クラス名を定義します。

- soap:headerfault - 例外クラス名を定義します。

- wsdl:service - 実装クラス名を定義します。

次の例では、実装クラスのクラス名を定義しています。

<bindings node="wsdl:definitions/wsdl:service[@name='SimpleService']">
<class name="myService"></class>
</bindings>

メソッド名

生成されたServiceクラスのポート・アクセサ・メソッドまたはサービス・エンドポイント・インタフェースの生成されたJavaメソッドの名前をカスタマイズするには、jaxws:methodバインディング宣言を使用します。

次の例では、wsdl:operation EchoHelloのJavaメソッド名を定義しています。

<bindings node="wsdl:definitions/wsdl:portType[@name='SimpleServiceImpl']/wsdl:operation[@name='EchoHello']">
<method name="Greeting"></method>
</bindings>

Javaパラメータ名

生成されたJavaメソッドのパラメータ名をカスタマイズするには、jaxws:parameterバインディング宣言を使用します。この宣言を使用すると、wsdl:portTypeのwsdl:operationのメソッド・パラメータを変更できます。

次の例では、wsdl:operation echoHelloのJavaメソッド名を定義しています。

<bindings node="wsdl:definitions/wsdl:portType[@name='SimpleServiceImpl']/wsdl:operation[@name='EchoHello']">
<parameter part="definitions/message[@name='EchoHello']/
part[@name='parameters']" element="hello"
name="greeting"/>
</bindings>

Javadoc

パッケージ、クラス、またはメソッドのJavadocテキストを指定するには、jaxws:javadocバインディング宣言を使用します。

たとえば、次の例では、メソッド・レベルでJavadocを定義しています。

<bindings node="wsdl:definitions/wsdl:portType[@name='SimpleServiceImpl']/wsdl:operation[@name='EchoHello']">
<method name="Hello">
<javadoc>Prints hello.</javadoc>
</method>
</bindings>

ハンドラ・チェーン

ハンドラをカスタマイズまたは追加するには、javaee:handlerchainバインディング宣言を使用します。インライン・ハンドラは、Web Services Metadata for the Java Platform仕様(JSR) (http://www.jcp.org/en/jsr/detail?id=181)で定義されているハンドラ・チェーン構成に従う必要があります。

JAXBカスタム・バインディング宣言

次の表に、一般的なJAXBのカスタマイズをまとめます。

注意:

次の表には、開始時に役立つJAXBカスタム・バインディング宣言のみをまとめています。すべてのJAXBカスタム・バインディング宣言の完全なリストと説明については、JAXB仕様(http://jcp.org/en/jsr/detail?id=222)またはJava EE 5 Tutorialの「Customizing JAXB Bindings」を参照してください。

表5-14 JAXBカスタム・バインディング宣言

カスタマイズ

説明

グローバル・バインディング

グローバル・スコープでバインディング宣言を定義するには、<globalBindings>バインディング宣言を使用します(図5-2を参照)。

<globalBindings>バインディング宣言には属性および要素を指定することができます。たとえば、以下のバインディング宣言では次の属性および要素を定義しています。

- collectionType属性 - java.util.Listインタフェースを実装し、生成される実装内のすべてのリストを表すために使用される型クラスmyArrayを指定します。

- generateIsSetMethod属性 - ゲッターおよびセッター・プロパティ・メソッドに対応するisSet()メソッドを生成します。

- javaType要素: XMLスキーマのアトミック・データ型とJavaデータ型(組込みデータ型またはアプリケーション固有のデータ型)のバインディングをカスタマイズします。

<jaxb:globalBindings
collectionType ="java.util.myArray"
generateIsSetMethod="false">
<jaxb:javaType name="java.util.Date"
xmlType="xsd:date"
</jaxb:javaType>
</jaxb:globalBindings>

スキーマ・バインディング

スキーマ・スコープでバインディング宣言を定義するには、<schemaBindings>バインディング宣言を使用します(図5-2を参照)。

例として、次の表の「パッケージ名」に関する説明を参照してください。

パッケージ名

スキーマのパッケージ名を定義するには、<schemaBindings>バインディング宣言の<package>要素を使用します(表5-12を参照)。

このカスタマイズを指定しない場合、wsdlc Antタスクが、WSDLのtargetNamespaceに基づいてパッケージ名を生成します。このデータ・バインディングのカスタマイズは、wsdlc、jwsc、またはclientgen AntタスクのpackageName属性によってオーバーライドされます。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のwsdlcに関する項を参照してください。

たとえば、次の例では、simpleservice.xsdファイルから生成されるすべてのJAXBクラスのパッケージ名を定義しています。

<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
schemaLocation="simpleservice.xsd"
node="/xs:schema">
<jaxb:schemaBindings>
<jaxb:package name="examples.jaxb"/>
</jaxb:schemaBindings>
</jaxb:bindings>

次に、インポートされたXMLスキーマのパッケージ名を定義する方法を示します。

<jaxb:bindindgs
xmlns:xs="http://www.w3.org/2001/XMLSchema"
node="//xs:schema/xs:import[@namespace='http://examples.webservices.org/complexservice']">
<jaxb:schemaBindings>
<jaxb:package name="examples.jaxb"/>
</jaxb:schemaBindings>
</jaxb:bindings>

クラス名

スキーマ要素のクラス名を定義するには、<class>バインディング宣言を使用します。

次の例では、xsd:complexTypeのクラス名を定義しています。

<xs:complexType name="ComplexType">
<xs:annotation><xs:appinfo>
<jaxb:javadoc>This is my class.</jaxb:javadoc>
</jaxb:class>
</xs:appinfo></xs:annotation>
</xs:complexType>

Javaプロパティ名

スキーマ要素のプロパティ名を定義するには、<property>バインディング宣言を使用します。

次の例では、Javaプロパティ名を定義する方法について説明します。

<jaxb:bindindgs
xmlns:xs="http://www.w3.org/2001/XMLSchema"
node="//xs:schema/">
<jaxb:schemaBindings>
<jaxb:property generateIsSetMethod="true"/>
</jaxb:schemaBindings>
</jaxb:bindings>

Javaデータ型

XMLスキーマのアトミック・データ型とJavaデータ型(組込みデータ型またはアプリケーション固有のデータ型)のバインディングをカスタマイズするには、<javaType>バインディング宣言を使用します。

たとえば、グローバル・バインディング(上記の)を参照してください。

Javadoc

要素のJavadocを指定するには、<class>または<property>バインディング宣言の<javadoc>子要素を使用します。

例:

<xs:complexType name="ComplexType">
<xs:annotation><xs:appinfo>
<jaxb:class name="MyClass">
<jaxb:javadoc>This is my class.</jaxb:javadoc>
</jaxb:class>
</xs:appinfo></xs:annotation>
</xs:complexType>

6 Webサービスの呼出し

この章では、Java API for XML-based Web service (JAX-WS) を使用してWebLogic Webサービスを呼び出す方法について説明します。

この章では、以下のトピックについて説明します。

- Webサービスの呼出しの概要

- Java SEクライアントからのWebサービスの呼出し

- WebLogic WebサービスからのWebサービスの呼出し

- Webサービス・クライアントの構成

- @WebServiceRefアノテーションを使用したWebサービス参照の定義

- クライアントIDの管理

- Webサービス呼出し時のプロキシ・サーバーの使用

- Webサービスを再デプロイする際にクライアント側で考慮すべき事項

- Webサービスおよびクライアントを同一の管理対象サーバーにデプロイする場合のクライアントに関する考慮事項

詳細については、以下を参照してください。

- メッセージ保護されたWebサービスの呼出しの詳細は、『Oracle WebLogic Server WebLogic Webサービスの保護』のクライアント・アプリケーションの更新によるメッセージ保護されたWebサービスの呼出しに関する項を参照してください。

- Webサービス・クライアント開発におけるベスト・プラクティスは、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービスの非同期起動に関する項を参照してください。

- Webサービスの非同期起動については、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービスの非同期起動に関する項を参照してください。

- javax.xml.ws.Service APIを使用して、Webサービス・クライアントがサービス・エンドポイント・インタフェース(SEI)に基づいて実行時に動的にWebサービスを呼び出す(clientgenは使用しない)ことができるdynamic proxy clientの作成については、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』の動的プロキシ・クライアントの作成に関する項を参照してください。

注意:

この章では、clientgenまたはwsdlc Antタスクで生成されるクライアント側のアーチファクトを使用してWebサービスを呼び出す場合、CLASSPATHのWebLogic Serverクラスの全体のセットを持っていることが想定されます。

Webサービスの呼出しの概要

Webサービスの起動とは、Webサービスを使用するためにクライアント・アプリケーションが実行する操作のことです。

クライアント・アプリケーションには以下の2種類があります。

- Java SE クライアント - 最も単純な形式では、javaコマンドで呼び出すMainパブリック・クラスがあるJavaプログラムです。

- WebLogic ServerにデプロイされたJava EEコンポーネント - この種のクライアント・アプリケーションでは、EJB、サーブレット、または別のWebサービスなど、WebLogic ServerにデプロイされているJava Platform, Enterprise Edition (Java EE)バージョン5コンポーネント内でWebサービスが実行されます。したがって、WebLogic Serverコンテナの内部で実行されます。

(WebLogic Serverクラスパスへのアクセス権を使用して)WebLogic Serverで実行されているJava SEまたはJava EEアプリケーションからWebサービスを呼び出すことができます。WebLogic Serverライブラリが使用できない環境で実行されているスタンドアロンJavaアプリケーションのサポートは、JAX-WSのこのリリースでは使用できません。

後続のセクションでは、JAX-WS仕様のOracleの実装を使用して、Javaクライアント・アプリケーションからWebサービスを呼び出す方法について説明します。この実装を使用することで、WebLogicおよび非WebLogicにかかわらず任意のアプリケーション・サーバーで実行されているWebサービスを呼び出すことができます。

この章では、呼び出す必要のある特定のWebサービス用にServiceインタフェース実装の静的Javaクラスを生成する方法について説明します。動的プロキシ・クライアントの生成の詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』の動的プロキシ・クライアントの作成を参照してください。

WebLogic ServerのWL_HOME/samples/server/examples/src/examples/webservicesディレクトリには、WebLogic Webサービスの作成と呼出しのサンプルがあります(WL_HOMEは、WebLogicサーバー・のメイン・ディレクトリです)。サンプルのビルドおよび実行方法の詳細については、ブラウザでWebページWL_HOME/samples/server/docs/index.htmlを開いて、「WebLogic Serverサンプル」->「サンプル」->「API」->「Webサービス」ノードを展開してください。

このセクションで説明されているコマンド・ライン・ツールの他に、Webサービス・プロキシを生成およびテストするためにOracle JDeveloperまたはOracle Enterprise Pack for Eclipse (OEPE)のようなIDEを使用できます。詳細は、『Oracle WebLogic Server WebLogic Webサービスの紹介』のWebサービスをビルドするためのOracle IDEの使用に関する項を参照してください。

Java SEクライアントからのWebサービスの呼出し

注意:

(WebLogic Serverクラスパスへのアクセス権を使用して)WebLogic Serverで実行されているJava SEまたはJava EEアプリケーションからWebサービスを呼び出すことができます。WebLogic Serverライブラリが使用できない環境で実行されているスタンドアロンJavaアプリケーションからのWebサービスの呼出し、JAX-WS Webサービスのこのリリースではサポートされていません。

次の表では、Webサービスを呼び出すJava SEアプリケーションを作成する主要な手順をまとめています。

注意:

開発環境でのクライアント・アプリケーションのビルドやJavaファイルのコンパイルなどにAntを使用すること、およびWebサービスのクライアント・タスクで更新する必要のあるbuild.xmlファイルがすでに存在することを想定しています。開発環境でのAntの使用に関する一般情報は、「基本的なAnt build.xmlファイルの作成」を参照してください。この項で使用しているbuild.xmlファイルの完全な例は、「JavaクライアントのサンプルAntビルド・ファイル」を参照してください。

表6-1 Java SEクライアントからWebサービスを呼び出す手順

#

手順

説明

1

環境を設定します。

コマンド・ウィンドウを開いて、ドメイン・ディレクトリのbinサブディレクトリにあるsetDomainEnv.cmd (Windows)またはsetDomainEnv.sh (UNIX)コマンドを実行します。WebLogic Serverドメインのデフォルトの場所は、MW_HOME/user_projects/domains/domainNameです。MW_HOMEはOracle製品の最上位のインストール・ディレクトリ、domainNameはドメインの名前です。

2

build.xmlファイルを更新して、Webサービスの呼出しに必要なクライアント側アーティファクトを生成するclientgen Antタスクが実行されるようします。

「クライアントのアーティファクトを生成するためのclientgen Antタスクの使用」を参照してください。

3

Webサービスに関する情報(その操作のシグネチャ、ポートの名前など)を取得します。

「Webサービスに関する情報の取得」を参照してください。

4

Webサービス操作を呼び出すためのコードを含むクライアント・アプリケーションのJavaコードを記述します。

「Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述」を参照してください。

5

基本のAntビルド・ファイルbuild.xmlを作成します。

「基本的なAnt build.xmlファイルの作成」を参照してください。

6

Javaクライアント・アプリケーションをコンパイルし、実行します。

「クライアント・アプリケーションのコンパイルと実行」を参照してください。

クライアントのアーティファクトを生成するためのclientgen Antタスクの使用

clientgen WebLogic WebサービスAntタスクは、クライアント・アプリケーションがWebLogic Webサービスと非WebLogic Webサービスの両方の呼出しに使用できるクライアント・アーティファクトを既存のWSDLファイルから生成します。次のようなアーティファクトがあります。

- 呼出しの対象となる特定のWebサービスに対するServiceインタフェース実装のJavaクラス。

- JAXBデータ・バインディング・アーティファクト。

- WSDLファイルで指定されたユーザー定義XMLスキーマ・データ型のJavaクラス。

clientgen Antタスクの詳細(使用可能なすべての属性など)は、『『Oracle WebLogic Server WebLogic Webサービス・リファレンス』』のAntタスク・リファレンスに関する項を参照してください。

次のサンプルのように、build.xmlファイルを更新してclientgen Antタスクに呼出しを追加します。

<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="clientclasses"
packageName="examples.webservices.simple_client"
type="JAXWS"/>
</target>

clientgen WebLogic WebサービスAntタスクを実行するには、その前にこのタスクの完全なJavaクラス名を標準のtaskdef Antタスクを使用して指定する必要があります。

クライアント側アーティファクトの作成に使用するWSDLファイルと、そうしたアーティファクトの生成先ディレクトリを指定するには、clientgen Antタスクのwsdl属性とdestDir属性を含める必要があります。packageName属性は省略できます。省略した場合、clientgenタスクではWSDLのtargetNamespaceに基づくパッケージ名が使用されます。この例ではtypeを指定する必要があります。指定しない場合、JAXRPCがデフォルト値になります。

この例では、パッケージ名はクライアント・アプリケーションと同じパッケージ名examples.webservices.simple_clientに設定されます。パッケージ名をクライアント・アプリケーションとは異なる名前に設定した場合は、適切なクラス・ファイルをインポートする必要があります。たとえば、examples.webservices.complexというパッケージ名にした場合、クライアント・アプリケーションの以下のクラス・ファイルをインポートする必要があります。

import examples.webservices.complex.BasicStruct;
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

注意:

clientgen AntタスクのdestFile属性を使用すると、生成されたJavaファイルを自動的にコンパイルして、すべてのアーティファクトをJARファイルにパッケージ化できます。詳細と例については、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のclientgenに関する項を参照してください。

WSDLファイルで、Webサービス操作の入力パラメータまたは戻り値としてユーザー定義のデータ型が指定されている場合、clientgenはWSDLに定義されたXMLスキーマ・データ型のJava表現であるJavaBeanクラスを自動的に生成します。JavaBeanクラスは、destDirディレクトリに生成されます。

この手順で説明されている追加のターゲット(cleanなど)を含む、完全なサンプルbuild.xmlファイルについては、「JavaクライアントのサンプルAntビルド・ファイル」を参照してください。

clientgen Antタスクを他のサポートAntタスクと一緒に実行するには、コマンド・ラインでbuild-clientターゲットを指定します。

prompt> ant build-client

clientclassesディレクトリで、clientgen Antタスクによって生成されたファイルやアーティファクトを確認します。

Webサービスに関する情報の取得

操作を呼び出すJavaクライアント・アプリケーション・コードの記述に先立って、Webサービスの名前と操作のシグネチャを知る必要があります。この情報を調べるには様々な方法があります。

一番よいのは、clientgen Antタスクを使用してWebサービス固有のServiceファイルを生成し、生成された*.javaファイルを調べる方法です。destDir属性で指定したディレクトリ内のpackageName属性の値に対応したサブディレクトリに生成されます。packageName属性が指定されていない場合、WSDLのtargetNamespaceに基づくパッケージに対応したサブディレクトリに生成されます。

- ServiceName.javaソース・ファイルには、Webサービスのポートを取得するためのgetPortName()メソッドが含まれており、ServiceNameはWebサービス名、PortNameはポート名を意味します。WebサービスがJWSファイルで実装されている場合、Webサービス名は@WebService JWSアノテーションのserviceName属性の値となり、ポート名はjwsc Antタスクの<jws>要素の子要素<WLHttpTransport>のportName属性の値となります。

- PortType.javaファイルには、Webサービスのパブリック操作に対応するメソッド・シグネチャが含まれており、PortTypeはWebサービスのポートの種類を表します。WebサービスがJWSファイルで実装されている場合、ポートの種類は@WebService JWSアノテーションのname属性の値となります。

Webサービスの実際のWSDLを調べることもできます。デプロイされているWebLogic WebサービスのWSDLの詳細は、「WebサービスのWSDLの参照」を参照してください。Webサービス名は、次のTraderService WSDLの引用に示すように、<service>要素内にあります。

<service name="TraderService">
<port name="TraderServicePort"
binding="tns:TraderServiceSoapBinding">
...
</port>
</service>

このWebサービス用に定義されている操作は、対応する<binding>要素の下に記述されています。たとえば次のWSDLの抜粋は、TraderService Webサービスにbuyとsellの2つの操作があることを示しています(わかりやすくするため、WSDLの関連部分のみを記載しています)。

<binding name="TraderServiceSoapBinding" ...>
...
<operation name="sell">
...
</operation>
<operation name="buy">
</operation>
</binding>

Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述

次のサンプル・コードでは、JavaアプリケーションがWebサービス操作を呼び出しています。アプリケーションは、標準JAX-WS APIコードと、clientgenによって生成されたServiceインタフェースのWebサービス固有の実装を使用して、Webサービスの操作を呼び出します。

このサンプルでは、ユーザー定義のデータ型(examples.webservices.simple_client.BasicStruct)を入力パラメータおよび戻り値として使用する操作を呼び出す方法も示します。clientgen Antタスクによって、このユーザー定義のデータ型のJavaコードが自動的に生成されます。

<clientgen> packageName属性はクライアント・アプリケーションと同じパッケージ名に設定されているため、<clientgen>生成ファイルをインポートする必要はありません。

package examples.webservices.simple_client;
/**
* This is a simple Java application that invokes the
* the echoComplexType operation of the ComplexService Web service.
*/
public class Main {
public static void main(String[] args) {
ComplexService test = new ComplexService();
ComplexPortType port = test.getComplexPortTypePort();
BasicStruct in = new BasicStruct();
in.setIntValue(999);
in.setStringValue("Hello Struct");
BasicStruct result = port.echoComplexType(in);
System.out.println("echoComplexType called. Result: " + result.getIntValue() + ", " + result.getStringValue());
}
}

上記の例で注目すべき点は以下のとおりです。

- 次のコードは、ComplexPortTypeスタブを作成する方法を示します。

ComplexService test = new ComplexService(),
ComplexPortType port = test.getComplexPortTypePort();

ComplexServiceクラスはJAX-WS Serviceインタフェースを実装します。getComplexServicePortTypePort()メソッドは、ComplexPortTypeスタブ実装のインスタンスを返すために使用します。

- 次のコードは、ComplexService WebサービスのechoComplexType操作を呼び出す方法を示します。

BasicStruct result = port.echoComplexType(in);

echoComplexType操作は、BasicStructというユーザー定義データ型を返します。

クライアント・アプリケーションのコンパイルと実行

すべてのJavaファイル(クライアント・アプリケーションおよびclientgenによって生成されたファイルの両方)をクラス・ファイルにコンパイルするには、build.xmlファイルのbuild-clientターゲットにjavacタスクを追加します。該当箇所を次のサンプルに太字で示します。

<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="clientclasses"
packageName="examples.webservices.simple_client"
type="JAXWS"/>
<javac
srcdir="clientclasses"
destdir="clientclasses"
includes="**/*.java"/>
<javac
srcdir="src"
destdir="clientclasses"
includes="examples/webservices/simple_client/*.java"/>
</target>

この例では、1番目のjavacタスクでclientgenによって生成されたclientclassesディレクトリ内のJavaファイルをコンパイルし、2番目のjavacタスクでカレント・ディレクトリのexamples/webservices/simple_clientサブディレクトリ(Javaクライアント・アプリケーションのソースの場所と想定されるディレクトリ)内にあるJavaファイルをコンパイルしています。

この例では、clientgenによって生成されたJavaソース・ファイルとコンパイル後のクラスが同じディレクトリ(clientclasses)に格納されます。プロトタイピングの段階ではこれで十分ですが、多くの場合はソース・コード(生成されたコードも含む)とコンパイルされたクラスを別々のディレクトリに格納するのがベスト・プラクティスです。これを行うには、両方のjavacタスクのdestdirに、srcdirディレクトリとは異なるディレクトリを設定します。クライアント・アプリケーションを実行するには、javaタスクの呼出しを含むbuild.xmlにrunターゲットを追加します。次に例を示します。

<path id="client.class.path">
<pathelement path="clientclasses"/>
<pathelement path="${java.class.path}"/>
</path>
<target name="run" >
<java
fork="true"
classname="examples.webServices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
</target>

pathタスクは、CLASSPATHにclientclassesディレクトリを追加します。runターゲットはMainアプリケーションを呼び出し、デプロイされたWebサービスのURLを1つの引数として渡します。

この手順で説明されている追加のターゲット(cleanなど)を含む、完全なサンプルbuild.xmlファイルについては、「JavaクライアントのサンプルAntビルド・ファイル」を参照してください。

アーティファクトを再生成してクラスに再コンパイルするためにbuild-clientターゲットを再実行してから、runターゲットを実行してechoStruct操作を呼び出します。

prompt> ant build-client run

build.xmlファイルのbuild-clientおよびrunターゲットを使用して、開発プロセスの一環としてJavaクライアント・アプリケーションを繰返し更新、再ビルド、および実行できます。

JavaクライアントのサンプルAntビルド・ファイル

次の例では、Javaクライアントを生成およびコンパイルするための完全なbuild.xmlファイルを示します。太字のセクションについては、「クライアントのアーティファクトを生成するためのclientgen Antタスクの使用」および「クライアント・アプリケーションのコンパイルと実行」を参照してください。

<project name="webservices-simple_client" default="all">
<!-- set global properties for this build -->
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="example-output" value="output" />
<property name="clientclass-dir" value="${example-output}/clientclass" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<target name="clean" >
<delete dir="${clientclass-dir}"/>
</target>
<target name="all" depends="clean,build-client,run" />
<target name="build-client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.simple_client"
type="JAXWS"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/simple_client/*.java"/>
</target>
<target name="run" >
<java fork="true"
classname="examples.webservices.simple_client.Main"
failonerror="true" >
<classpath refid="client.class.path"/>
</java>
</target>
</project>

WebLogic WebサービスからのWebサービスの呼出し

WebLogic Webサービス内からのWebサービスの呼出しは、「Java SEクライアントからのWebサービスの呼出し」で説明している、Java SEアプリケーションからのWebサービスの呼出しに似ていますが、次の点が異なります:

- 呼び出されるWebサービスのJAX-WS Serviceインタフェースを生成するclientgen Antタスクを使用するかわりに、呼び出す側のWebサービスをコンパイルするjwsc Antタスクの内部で、<jws>要素の<clientgen>子要素を使用します。一方、他のWebサービスを呼び出すJWSファイルでは、ServiceおよびPortTypeインスタンスの取得に同じ標準JAX-WS APIを使用して、Webサービス操作を呼び出します。

- Webサービスに対する参照の定義に@WebServiceRefアノテーションを使用できます。「Webサービスを呼び出すサンプルJWSファイル」を参照してください。

この項では、Webサービス(特に別のWebサービス)をJava EEコンポーネント内のクライアントから呼び出す場合とJava SEクライアントから呼び出す場合の違いについて説明します。「Java SEクライアントからのWebサービスの呼出し」をすでに読み、理解していることが前提となります。また、クライアント・アプリケーションのビルドやJavaファイルのコンパイルなどに開発環境でAntを使用していること、そして別のWebサービスを呼び出すために更新したいWebサービスをビルドするbuild.xmlファイルをすでに持っていることも前提となります。

クライアントWebサービスをビルドするbuild.xmlファイルに加える必要のある変更は次のとおりです(このクライアントWebサービスが別のWebサービスを呼び出すことになります)。build.xmlファイルの完全なサンプルについては、「Webサービス・クライアントのサンプルbuild.xmlファイル」を参照してください。

- JWSファイル(別のWebサービスを呼び出すWebサービスを実装しているもの)を指定する<jws>要素に、<clientgen>子要素が追加されます。呼び出されるWebサービスのWSDLに、必要なwsdl属性を設定します。JAX-WSクライアント・スタブの生成先とするパッケージに、必要なpackageName属性を設定します。

クライアントWebサービスを実装するJWSファイルに加える必要のある変更は次のとおりです。JWSファイルの完全なサンプルについては、「Webサービスを呼び出すサンプルJWSファイル」を参照してください。

- jwsc Antタスクの<clientgen>子要素で生成される一連のファイルがインポートされます。これらのファイルには、呼び出されるWebサービスの操作でパラメータまたは戻り値として使用するユーザー定義データ型のJava表現のみでなく、呼び出されるWebサービスのJAX-WS Serviceインタフェースも含まれます。

注意:

<clientgen>のpackageName属性で設定されているパッケージ名が、クライアント・アプリケーションと同じパッケージ名である場合、<clientgen>生成ファイルをインポートする必要はありません。

- ServiceおよびPortTypeインタフェース実装を取得して、通常どおりポート上で操作を呼び出します。詳細は、「Webサービスを呼び出すJavaクライアント・アプリケーション・コードの記述」を参照してください。

Webサービス・クライアントのサンプルbuild.xmlファイル

次のサンプルbuild.xmlファイルでは、別のWebサービスを呼び出すWebサービスを作成する方法を示します。別のWebサービスを呼び出さない単純なWebサービスをビルドするためのbuild.xmlと異なっている部分は、太字で示されています。

この場合のbuild-serviceターゲットは、単純なWebサービスをビルドするターゲットとよく似ています。唯一の違いは、呼び出すWebサービスをビルドするjwsc Antタスクに<jws>要素の<clientgen>子要素も含まれるという点で、これによってjwscでは必要なJAX-WSクライアント・スタブも生成されるようになります。

<project name="webservices-service_to_service" default="all">
<!-- set global properties for this build -->
<property name="wls.username" value="weblogic" />
<property name="wls.password" value="weblogic" />
<property name="wls.hostname" value="localhost" />
<property name="wls.port" value="7001" />
<property name="wls.server.name" value="myserver" />
<property name="ear.deployed.name" value="ClientServiceEar" />
<property name="example-output" value="output" />
<property name="ear-dir" value="${example-output}/ClientServiceEar" />
<property name="clientclass-dir" value="${example-output}/clientclasses" />
<path id="client.class.path">
<pathelement path="${clientclass-dir}"/>
<pathelement path="${java.class.path}"/>
</path>
<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<taskdef name="clientgen"
classname="weblogic.wsee.tools.anttasks.ClientGenTask" />
<taskdef name="wldeploy"
classname="weblogic.ant.taskdefs.management.WLDeploy"/>
<target name="all" depends="clean,build-service,deploy,client" />
<target name="clean" depends="undeploy">
<delete dir="${example-output}"/>
</target>
<target name="build-service">
<jwsc
srcdir="src"
destdir="${ear-dir}" >
<jws
file="examples/webservices/service_to_service/ClientServiceImpl.java"
type="JAXWS">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/complex/ComplexService?WSDL"
packageName="examples.webservices.complex" />
</jws>
</jwsc>
</target>
<target name="deploy">
<wldeploy action="deploy" name="${ear.deployed.name}"
source="${ear-dir}" user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="undeploy">
<wldeploy action="undeploy" name="${ear.deployed.name}"
failonerror="false"
user="${wls.username}"
password="${wls.password}" verbose="true"
adminurl="t3://${wls.hostname}:${wls.port}"
targets="${wls.server.name}" />
</target>
<target name="client">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/ClientService/ClientService?WSDL"
destDir="${clientclass-dir}"
packageName="examples.webservices.service_to_service.client"
type="JAXWS"/>
<javac
srcdir="${clientclass-dir}" destdir="${clientclass-dir}"
includes="**/*.java"/>
<javac
srcdir="src" destdir="${clientclass-dir}"
includes="examples/webservices/service_to_service/client/**/*.java"/>
</target>
<target name="run">
<java classname="examples.webservices.service_to_service.client.Main"
fork="true"
failonerror="true" >
<classpath refid="client.class.path"/>
</java>
</target>
</project>

Webサービスを呼び出すサンプルJWSファイル

次に示すサンプルJWSファイル(ClientServiceImpl.java)は、ClientServiceというWebサービスを実装しており、このWebサービスに含まれている操作がComplexServiceというWebサービスのechoComplexType操作を呼び出します。この操作では、パラメータとしても戻り値としてもユーザー定義データ型(BasicStruct)を使用します。該当するコードを太字で示し、例の後で説明を加えます。

package examples.webservices.service_to_service;

import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.WebServiceRef;

// Import the BasicStruct data type, generated by clientgen and used
// by the ComplexService Web Service
import examples.webservices.complex.BasicStruct;

// Import the JAX-WS stubs generated by clientgen for invoking
// the ComplexService Web service.
import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

@WebService(name="ClientPortType", serviceName="ClientService",
targetNamespace="http://examples.org")
public class ClientServiceImpl {
// Use the @WebServiceRef annotation to define a reference to a Web service.
@WebServiceRef()
ComplexService test;

@WebMethod()
public String callComplexService(BasicStruct input, String serviceUrl)
{
// Create a port stub to invoke ComplexService
ComplexPortType port = test.getComplexPortTypePort();

// Invoke the echoComplexType operation of ComplexService
BasicStruct result = port.echoComplexType(input);
System.out.println("Invoked ComplexPortType.echoComplexType." );
return "Invoke went okay!  Here's the result: '" + result.getIntValue() +
",  " + result.getStringValue() + "'";
}
}

別のWebサービスを呼び出すJWSファイルをプログラミングする際は、次のガイドラインに従います。ガイドラインのサンプル・コードは、上述のサンプル内では太字で示されています。

- 呼び出されるWebサービスで使用されるユーザー定義データ型をインポートします。このサンプルでは、ComplexServiceでBasicStruct JavaBeanを使用しています。

import examples.webservices.complex.BasicStruct;

- ComplexService WebサービスのJAX-WSインタフェースをインポートします。このスタブは、<jws>の<cliengen>子要素によって生成されます。

import examples.webservices.complex.ComplexPortType;
import examples.webservices.complex.ComplexService;

- @WebServiceRefアノテーションを使用して、Webサービスへの参照およびそのインジェクション・ターゲットを定義します。

@WebServiceRef()
ComplexService service;

または、次に示すように、ComplexService Webサービスへのプロキシ・スタブを作成できます。

ComplexService test = new ComplexService();

- Webサービス参照でgetComplexPortTypePort()操作を呼び出すことによって、ComplexPortTypeスタブ実装のインスタンスを戻します。

ComplexPortType port = service.getComplexPortTypePort();

- ComplexServiceのechoComplexType操作を、直前にインスタンス化したポートを使用して呼び出します。

BasicStruct result = port.echoComplexType(input);

Webサービス・クライアントの構成

デフォルトでは、Webサービス・クライアントではサーバーに対して定義されているWebサービス構成を使用します。次のメソッドのいずれかを使用してWebサービス・クライアントが使用する構成設定をオーバーライドできます。

- 該当する場合、管理またはWLSTを使用。クライアントで構成可能なのはWebサービス機能のサブセットのみです。

- @WebServiceRefアノテーションを使用してWebサービスのクライアントを指定のWebサービス参照に対して定義する構成に関連付けます。Webサービスの参照構成はWebコンテナではweblogic.xmlに定義され、EJBコンテナではweblogic-ejb-jar.xmlで定義されます。@WebServiceRefアノテーションの詳細は、「@WebServiceRefアノテーションを使用したWebサービス参照を定義」を参照してください。

- Webサービスの信頼性のあるメッセージング・クライアントを作成する場合は、WsrmClientInitFeatureを使用。詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービス・クライアントの信頼性のあるメッセージングの構成に関する項を参照してください。

@WebServiceRefアノテーションを使用したWebサービス参照の定義

@WebServiceRefアノテーションを使用すると、Webサービスへの参照を定義し、クライアント・インスタンスにWebサービスの構成をアタッチできます。

たとえば、次のコードの引用では、@WebServiceRefを使用して、クライアントのWebサービス・インスタンスにMyReliableEchoServiceの構成をアタッチします。後で作成および初期化されるポートは、Webアプリケーションのweblogic.xmlのMyReliableEchoServiceサービス参照で定義されているプロパティを使用します。

package wsrm_jaxws.example;
import java.xml.ws.WebService;
import java.xml.ws.WebServiceRef;
import wsrm_jaxws.example.client_service.*;
import wsrm_jaxws.example.client_service.EchoResponse;
...
@WebService
public class ClientServiceImpl {

@WebServiceRef(name="MyServiceRef")
private ReliableEchoService service;
private ReliableEchoPortType port = null;

@PostConstruct
public void initPort() {
port = service.getReliableEchoPort();
...
}
}

例6-1にWebサービス参照の記述を含むweblogic.xmlファイルの例を示します。この例に示す信頼性のあるメッセージ・プロパティの詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』の信頼性のあるメッセージングの構成に関する項を参照してください。

例6-1 Webサービス参照の記述を含むweblogic.xmlのサンプル・ファイル

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<service-reference-description>
<!-- Any name you want, but use this same name on
@WebServiceRef(name=<my name>). This anno goes on the service
field in your client container -->
<service-ref-name>MyServiceRef</service-ref-name>
<!-- Use / and any path within the web app to get a local WSDL, or
use a resource name as defined by the Java ClassLoader, or use an
absolute/external URL you can guarantee is deployed when this web
app deploys -->
<wsdl-url>/WEB-INF/wsdls/ReliableEcho.wsdl</wsdl-url>
<!-- One or more port-infos, one for each type of port/stub you'll create
in your JWS -->
<port-info>
<!-- The local name of wsdl:port (not portType). The Java type for this
port, when created from the @WebServiceRef JWS field, will contain,
in RequestContext, the props you define below -->
<port-name>ReliableEchoPort</port-name>

<!-- Any prop name/value pairs you want to show up on you service stub
The Java type for this port, when created from the @WebServiceRef JWS field,
will contain, in RequestContext, the stub-props you define below -->

<!-- RM Source Properties -->

<stub-property>
<name>weblogic.wsee.wsrm.BaseRetransmissionInterval</name>
<value>PT30S</value>
</stub-property>

<stub-property>
<name>weblogic.wsee.wsrm.RetransmissionExponentialBackoff</name>
<value>true</value>
</stub-property>

<!-- RM Destination Properties -->

<stub-property>
<name>weblogic.wsee.wsrm.RetryCount</name>
<value>5</value>
</stub-property>

<stub-property>
<name>weblogic.wsee.wsrm.RetryDelay</name>
<value>PT30S</value>
</stub-property>

<stub-property>
<name>weblogic.wsee.wsrm.AcknowledgementInterval</name>
<value>PT5S</value>
</stub-property>

<stub-property>
<name>weblogic.wsee.wsrm.NonBufferedDestination</name>
<value>true</value>
</stub-property>

<!-- RM Source *or* Destination Properties -->

<stub-property>
<name>weblogic.wsee.wsrm.InactivityTimeout</name>
<value>PT5M</value>
</stub-property>

<stub-property>
<name>weblogic.wsee.wsrm.SequenceExpiration</name>
<value>PT10M</value>
</stub-property>

</port-info>

</service-reference-description>
<wl-dispatch-policy>weblogic.wsee.mdb.DispatchPolicy</wl-dispatch-policy>
</weblogic-web-app>

クライアント・アイデンティティの管理

Webサービスを使用すると、クライアント・アイデンティティ(クライアントID)として表される意味のある名前をクライアントに割り当てることができます。このクライアントIDを使用して、実行時検証のレポートの目的などで統計情報およびその他の監視情報をグループ化します。

サーバー上のクライアント(WebLogic Serverインスタンス内のコンテナで実行されるクライアント)では、次のいずれかの方法でクライアントIDを生成できます。

- Webサービス・ポートへの接続を初期化する場合はクライアントで実行。これは、推奨アプローチです。「ポート初期化時のクライアントIDの定義」を参照してください。

- サーバーで実行、その後クライアントで検出。クライアント「サーバー生成のクライアントIDへのアクセス」を参照してください。

注意:

省略可能ですが、クライアントIDを明示的に定義することをお薦めします。

weblogic.wsee.jaxws.persistence.ClientIdentityFeatureクライアント機能を使用すると、Webサービス・クライアントがWebサービスのクライアントIDを設定およびアクセスできます。次の表では、ClientIdentityFeatureメソッドをまとめます。

表6-2 クライアントIDの設定およびアクセスのためのClientIdentityFeatureメソッド

メソッド

説明

getClientID()

Webサービス・ポートで現在定義されているクライアントIDを取得します。

setClientID()

Webサービス・ポートのクライアントIDを設定します。

また、ClientIdentityFeatureオブジェクトをインスタンス化する場合は、クライアントIDを引数として渡すことにより、クライアントIDを設定できます。例:

ClientIdentityFeature clientIDFeature = new
ClientIdentityFeature("MyBackendServiceAsyncClient");

dispose()

クライアントIDを破棄します。

クライアントIDを明示的に破棄される場合、クライアントIDを使用するクライアント・インスタンスのコンテナが無効化されるとき(ホストWebアプリケーションまたはEJBが無効化される場合など)に実行されます。詳細は、「クライアント・アイデンティティのライフサイクル」を参照してください。

次の項は、クライアントIDを管理するためのメソッドを説明します。

- ポート初期化時のクライアントIDの定義

- サーバー生成のクライアントIDのアクセス

- クライアントIDのライフサイクル

ポート初期化時のクライアントIDの定義

クライアントIDを提供するには、初期化時にクライアントIDを含むClientIdentityFeatureのインスタンスをWebサービス・ポートに渡すことができます。

クライアントIDは、クライアントを含むWebアプリケーションまたはEJB内で一意である必要があります。クライアントIDがビジネスの目的を適宜反映していることをお薦めします。クライアントIDが必ず一意であるようにするため、含む側のサーバー、アプリケーション、コンポーネント(WebアプリケーションまたはEJB)の名前をクライアントIDの前に付けます。

注意:

クライアントIDの選択時は注意する必要があります。既存のクライアント・インスタンスと同じクライアントIDを使用してクライアント・インスタンスを作成する場合、2つのクライアント・インスタンスが同じインスタンスとして処理されます。例外がスローされ重複していることをアラートします。

次の例に、クライアントIDを指定するこのメソッドを示します。次の示すように、すべての処理が完了したら、クライアント・インスタンスを閉じることをお薦めします。

この例は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービス・クライアントのベスト・プラクティスの例の引用です。

例6-2 ポート初期化時のクライアントIDの指定例

import javax.servlet.*;
import javax.xml.ws.*;
import weblogic.jws.jaxws.client.ClientIdentityFeature;
. . .
public class BestPracticeAsyncClient
extends GenericServlet {
...
private BackendServiceService _service;
...
// Client ID
ClientIdentityFeature clientIdFeature =
new ClientIdentityFeature("MyBackendServiceAsyncClient");
features.add(clientIdFeature);
...
_features = features.toArray(new WebServiceFeature[features.size()]);
...
BackendService port = _service.getBackendServicePort(_features);
...
((java.io.Closeable)_port).close();
}
}

サーバー生成クライアントIDへのアクセス

注意:

この項での説明に従って、クライアントIDが一意であるようにするため、サーバー生成のバージョンが長く読みにくくなる場合があります。クライアントIDが読みづらい形式で表示されるように保証するため、「ポート初期化時のクライアントIDの定義」の説明に従ってポート初期化時にクライアントIDを定義することをお薦めします。

サーバーが自動生成するクライアントIDでは次の形式を使用します。

applicationname[_applicationversion]:componentname:uniqueID

ここで:

- applicationname - クライアントをホストするアプリケーションの名前。

- applicationversion - アプリケーションのバージョン。同じアプリケーションの複数のバーションを同時に実行する場合にのみ使用します。

- componentnam - クライアントをホストするコンポーネント(WebアプリケーションまたはEJB)の名前。

- uniqueID - クライアント・インスタンスが作成される場合に使用可能な情報に基づいて算出されます。uniqueIDは次のいずれか(使用可能な方)を選択することで作成されます。

- Webサービス参照名。@WebServiceRefアノテーションにより定義されます。

- [portNamespaceURI:portLocalName][:][endpointAddress] - ポート名、エンドポイント・アドレスまたは両方(コロンで区切ります)。

- ポートクラスの単純な名前。

また、次の情報(可能な場合)は、次に示す順序でコロン(:)で区切り、uniqueIDに連結することができます。

- WSDLの場所(マイナス記号 ?wsdl)

- クライアント・インスタンスの作成に使用する機能。機能のクラス名で表し、ダッシュ(-)で区切ります。

たとえば、Webサービス・クライアントに関連付けられている次の情報を使用してWebサービス・クライアントをデプロイするとします。

- アプリケーション名: example

- コンポーネント: BestPracticeClientと呼ばれるWebアプリケーション

- ポート名: http://example/BackendServicePort

- ポート・クラス: BackendService

- WSDL: jar:file:/E:/p4/dev/src1034/wls/modules/wsee/test/server/build/output/example/BackendService.war!/WEB-INF/BackendServiceService.wsdl

サーバー生成クライアントIDは次のようになります。

example:BestPracticeClient:http://example/:BackendServicePort:jar:file:/E:/p4/dev/src1034/wls/modules/wsee/test/server/build/output/example/BackendService.war!/WEB-INF/BackendServiceService.wsdl:AsyncClientTransportFeature()-ClientIdentityFeature

コードを実行するたびに、同一の包含階層内にあることを前提として、同一のクライアントIDが生成されます。これにより、サーバー仮想マシンのインスタンス全体で使用できる安定したクライアントIDを提供し、サーバーの再起動後でも非同期レスポンスをクライアントに配信できます。

注意:

クライアント・コードの複数の場所から特定のクライアントIDを使用できますが、クライアントIDの他の場所で使用されている方法と同じ方法(同じ機能、サービスなど)でクライアントIDを使用するポート/ディスパッチ・インスタンスの初期化時に注意する必要があります。

クライアント・インスタンス(ポートまたはディスパッチ)の初期化における推奨アプローチのベスト・プラクティスは、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebサービス・クライアント開発のロードマップに関する項を参照してください。

次の例に、サーバー生成のクライアントIDにアクセスする方法を示します。この例は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のWebサービス・クライアントのベスト・プラクティスの例の引用です。

例6-3 サーバー生成クライアントIDへのアクセス

...
// Create a port without explicitly defining the client ID to view the client ID that is
// generated automatically.
ClientIdentityFeature dummyClientIdFeature = new ClientIdentityFeature(null);
BackendService dummyPort = _service.getBackendServicePort(dummyClientIdFeature);
System.out.println("Generated Client Identity is: " + dummyClientIdFeature.getClientId());

// Best Practice: Explicitly close client instances when processing is complete.
// If not closed, the port will be closed automatically when it goes out of scope.
// Note, this client ID will remain registered and visible until our
// container (Web application) is undeployed.
((java.io.Closeable)dummyPort).close();

クライアント・アイデンティティのライフサイクル

クライアントIDを使用して最初のクライアント・インスタンス(ポートまたはディスパッチ・インスタンス)が作成されるときに、WebサービスのランタイムでクライアントIDが登録されます。また、クライアント・インスタンスに関連付けられている非同期レスポンスのエンドポイントも登録されているクライアントIDで追跡されます。

クライアントIDは次のいずれかが発生するまで登録が維持されます。

- 表6-2に示すように、クライアントIDは、ClientIdentityFeatureでdispose()メソッドを使用して明示的に公開します。

- クライアントIDを使用するクライアント・インスタンスのコンテナが無効化されます(ホストWebアプリケーションまたはEJBが無効化される場合など)。

Webサービス呼出し時のプロキシ・サーバーの使用

プロキシ・サーバーを使用すると、クライアント・アプリケーションから、呼び出されるWebサービスをホストするアプリケーション・サーバー(WebLogic、非WebLogicいずれでも)へのリクエストをプロキシできます。通常、プロキシ・サーバーは、アプリケーション・サーバーがファイアウォールの内側にある場合に使用します。Javaシステム・プロパティを使用してクライアント・アプリケーションにプロキシ・サーバーを指定できます。クライアント・アプリケーションでプロキシ・サーバーを指定する方法には、WebLogic ClientProxyFeature APIでプログラム的に行う方法と、システム・プロパティを使用する方法の2つがあります。

ClientProxyFeature APIを使用したプロキシ・サーバーの指定

weblogic.wsee.jaxws.proxy.ClientProxyFeature APIを使用してWebサービスの呼出しをプロキシするプロキシ・サーバーの詳細を、Javaクライアント・アプリケーション自体にプログラムで指定できます。ClientProxyFeature APIの詳細は、Oracle WebLogic Server APIリファレンスを参照してください。

JVMレベルに定義されている設定は、「システム・プロパティを使用したプロキシ・サーバーの指定」に記載されているように、ClientProxyFeatureで定義されたプロキシ・サーバー設定によってオーバーライドされます。

注意:

ClientProxyFeatureは、WebLogic HTTP over SSLのポートを構成します。WebLogic ServerにはSSLを構成することをお薦めします。詳細は、『Oracle WebLogic Serverの保護』のSSLの構成に関する項を参照してください。

次の例で示すように、ClientProxyFeatureを使用してプロキシ・サーバー情報を構成し、Webサービス・ポートの作成時に引数としてClientProxyFeatureを渡すことができます。

例6-4 ポート作成時に引数としてClientProxyFeatureを渡す

package examples.webservices.simple_client;
import weblogic.wsee.jaxws.proxy
public class Main {
public static void main(String[] args) {
ComplexService test = new ComplexService();
ClientProxyFeature cpf = new ClientProxyFeature();
cpf.setProxyHost("localhost");
cpf.setProxyPort(8888);
cpf.setProxyUserName("proxyu");
cpf.setProxyPassword("proxyp");
ComplexPortType port = test.getComplexPortTypePort(cpf);
BasicStruct in = new BasicStruct();
in.setIntValue(999);
in.setStringValue("Hello Struct");
BasicStruct result = port.echoComplexType(in);
System.out.println("echoComplexType called. Result: " + result.getIntValue() + ", " + result.getStringValue());
}
}

または、次の例に示すように、ポートが作成された後にプロキシ・サーバー情報を構成することも可能です。この場合は、attachsPort()メソッドを実行し、既存のポートにClientProxyFeatureをアタッチします。

例6-5 ポート作成後のClientProxyFeatureの構成

package examples.webservices.simple_client;
import weblogic.wsee.jaxws.proxy
public class Main {
public static void main(String[] args) {
ComplexService test = new ComplexService();
ComplexPortType port = test.getComplexPortTypePort();
ClientProxyFeature cpf = new ClientProxyFeature();
cpf.setProxyHost("localhost");
cpf.setProxyPort(8888);
cpf.setProxyUserName("proxyu");
cpf.setProxyPassword("proxyp");
cpf.attachsPort(port);
BasicStruct in = new BasicStruct();
in.setIntValue(999);
in.setStringValue("Hello Struct");
BasicStruct result = port.echoComplexType(in);
System.out.println("echoComplexType called. Result: " + result.getIntValue() + ", " + result.getStringValue());
}
}

ClientProxyFeatureを構成し、クライアント・プロキシ設定を無効化するポートにアタッチしたら、プロキシ・ポートを負の値に設定します。例:

例6-6 クライアント・プロキシ設定の無効化

. . .
ClientProxyFeature cpf = new ClientProxyFeature();
cpf.setProxyPort(-1);\
cpf.attachsPort(port);
. . .

システム・プロパティを使用したプロキシ・サーバーの指定

プロキシ・サーバーの指定にシステム・プロパティを使用する場合は、クライアント・アプリケーションの記述は標準的な方式で行い、クライアント・アプリケーションの実行時に以下のシステム・プロパティを指定します。

次の表に、Javaシステム・プロパティをまとめます。

注意:

その場合は、proxySetのシステム・プロパティを設定することはできません。proxySetのシステム・プロパティが(proxySet=false)に設定されている場合、プロキシ・プロパティは無視され、プロキシは使用できません。

表6-3 Javaシステム・プロパティを使用したプロキシ・サーバーの指定

プロパティ

説明

http.proxyHost=proxyHostまたはhttps.proxyHost=proxyHost

プロキシ・サーバー が動作しているホスト・コンピュータ名。HTTP over SSLに対してhttps.proxyHostを使用します。

http.proxyPort=proxyPortまたはhttps.proxy.Port=proxyPort

プロキシ・サーバーがリスニングしているポート。HTTP over SSLに対してhttps.proxyPortを使用します。

http.nonProxyHosts=hostname | hostname | ...

プロキシをバイパスし、直接アクセスするホストのリスト。各ホスト名を「|」文字で区切ります。このプロパティはHTTPおよびHTTPSの両方に適用されます。

以下のAntビルド・スクリプトの抜粋では、clients.InvokeMyServiceというクライアント・アプリケーションを呼び出す場合のJavaシステム・プロパティの設定例を示します。

<target name="run-client">
<java fork="true"
classname="clients.InvokeMyService"
failonerror="true">
<classpath refid="client.class.path"/>
<arg line="${http-endpoint}"/>
<jvmarg line=
"-Dhttp.proxyHost=${proxy-host}
-Dhttp.proxyPort=${proxy-port}
-Dhttp.nonProxyHosts=${mydomain}"
/>
</java>
</target>

Webサービスを再デプロイする際にクライアント側で考慮すべき事項

WebLogic Serverでは本番再デプロイメントをサポートしています。つまり、更新後の新しいバージョンのWebLogic Webサービスを同じWebサービスの古いバージョンと並行してデプロイできます。

WebLogic Serverでは、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでにWebサービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続け、それらの作業が完了した時点で、WebLogic Serverが古いWebサービスを自動的にリタイアします。

Webサービスの新しいバージョンで以下のWebサービス・アーティファクトが変更されていなければ、その新しいバージョンで古いクライアント・アプリケーションを引続き使用できます。

- Webサービスを記述するWSDL

- Webサービスに添付されたWS-Policyファイル

上記のアーティファクトのいずれかが変更されている場合、clientgen Antタスクを再び実行して、クライアント・アプリケーションで使用されるJAX-WSスタブを再生成する必要があります。

たとえば、Webサービスの新しいバージョンで操作のシグネチャを変更すると、Webサービスの新しいバージョンを記述するWSDLファイルも変更されます。この場合、JAX-WSスタブを再生成する必要があります。ただし、単に操作の実装のみを変更し、操作のパブリック・コントラクトは変更しない場合、既存のクライアント・アプリケーションを引続き使用できます。

Webサービスおよびクライアントを同一の管理対象サーバーにデプロイする場合のクライアントに関する考慮事項

Webサービスおよびクライアントを同一の管理対象サーバーにデプロイし、次のいずれかが該当する場合:

- Webサービス・クライアントが@WebServiceRefアノテーションを使用しますが、wsdlLocation要素の値を指定しません。

- Webサービス・クライアントが@WebServiceRefアノテーションのwsdlLocation要素を使用して、Webサービス・アプリケーションでパッケージ化されるWSDL(たとえば、@WebServiceRef(wsdlLocation="myService.wsdl"))とは反対に、ライブのWSDLの場所(たとえば、@WebServiceRef(wsdlLocation="http://xyz.com/myService?WSDL"))を参照します。

続いて、Webサービスとクライアントがデプロイされている管理対象サーバーを再起動するとき、アプリケーションは最初管理モードでデプロイされ、その後本番モードに遷移してHTTPリクエストを受け入れるため、デプロイメントの順序に関係なくWebサービス・クライアントは再デプロイに失敗する場合があります。この場合、サーバーが再起動したらアプリケーションを手動で再起動する必要があります。

Webサービスおよびクライアントを同一の管理対象サーバーにデプロイする場合、この状況を回避するために、Webサービス・アプリケーションの一部としてWSDLをパッケージ化し、@WebServiceRefアノテーションからパッケージ化されたバージョンを参照することをお薦めします。

7 Webサービスの管理

この章では、Java API for XML-based Web services (JAX-WS) を使用して開発したWebLogic Webサービスの管理方法について説明します。

この章では、以下のトピックについて説明します。

- WebLogic Webサービスの管理タスクの概要

- 管理ツール

- WebLogic Server管理コンソールの使用

- Oracle Enterprise Manager Fusion Middleware Controlの使用

- WebLogic Scripting Toolの使用

- WebLogic Antタスクの使用

- Java Management Extensions (JMX)の使用

- Java EE Deployment APIの使用

- ワーク・マネージャによるWebサービス作業の優先付けとスタック実行スレッドの削減

- Webサービスおよびクライアントの監視

WebLogic Webサービスの管理タスクの概要

jwsc Antタスクを使用してWebLogic Webサービスをコンパイルおよびパッケージ化すると、Webサービスはエンタープライズ・アプリケーションの一部としてパッケージ化されます。デフォルトでは、Webサービス自体はエンタープライズ・アプリケーション内にWebアプリケーションWARファイルとしてパッケージ化されます。ただし、JWSファイルにセッションBeanが実装されている場合、WebサービスはEJB JARファイルとしてパッケージ化されます。したがって、Webサービスの基本的な管理は、標準のJava Platform, Enterprise Edition (Java EE)バージョン5アプリケーションおよびモジュールの基本的な管理と非常に似ています。標準的なタスクは次のとおりです。

- Webサービスを含むエンタープライズ・アプリケーションをインストールします。

- デプロイされたエンタープライズ・アプリケーションを起動および停止します。

- エンタープライズ・アプリケーションと、実際のWebサービスを実装するアーカイブ・ファイルを構成します。エンタープライズ・アプリケーションの全般的な特性(デプロイメント順など)や、モジュールに固有の特性(Webアプリケーションのセッション・タイムアウト、EJBのトランザクションの種類など)を構成できます。

- エンタープライズ・アプリケーションのデプロイメント・プランを作成および更新します。

- エンタープライズ・アプリケーションをモニターします。

- エンタープライズ・アプリケーションをテストします。

Webサービス固有の管理タスクは次のとおりです。

- Webサービスのエンドポイントまたはその操作に関連付けられたWS-Policyファイルを構成します。

- Webサービスに関連付けられたSOAPハンドラを表示します。

- WebサービスのWSDLを表示します。

- Webサービスのセキュリティ構成を作成します。

管理ツール

WebLogic Serverで動作するJava EEモジュールおよびアプリケーションの管理方法には、Webサービスを含め様々な方法があります。ニーズに最も適合するツールを使用してください。

- WebLogic Server管理コンソールの使用

- Oracle Enterprise Manager Fusion Middleware Controlの使用

- WebLogic Scripting Toolの使用

- WebLogic Antタスクの使用

- Java Management Extensions (JMX)の使用

- Java EE Deployment APIの使用

WebLogic Server管理コンソールの使用

WebLogic Server管理コンソールは、サーバーやクラスタにデプロイされたWebLogic Serverドメイン、1つまたは複数のWebLogic Serverインスタンス、クラスタ、およびアプリケーション(Webサービスを含む)の管理に使用するWebブラウザ形式のグラフィカル・ユーザー・インタフェースです。

各ドメインでは、1つのWebLogic Serverインスタンスが管理サーバーとして構成されます。管理サーバーではWebLogic Serverドメインを一元的に管理できます。ドメイン内の他のすべてのWebLogic Serverインスタンスは、管理対象サーバーと呼ばれます。1つのWebLogic Serverインスタンスしか含まれないドメインでは、そのサーバーが管理サーバーおよび管理対象サーバーとして機能します。管理コンソールは、管理サーバーによってホストされるWebアプリケーションであり、サポートされている任意のWebブラウザから、管理サーバーへのネットワーク・アクセスを使用してアクセスできます。

WebLogic管理コンソールを使用して、以下の作業を行うことができます。

- エンタープライズ・アプリケーションのインストール

- デプロイされたエンタープライズ・アプリケーションの起動と停止

- エンタープライズ・アプリケーションの構成

- Webアプリケーションの構成

- EJBの構成

- デプロイメント・プランの作成

- デプロイメント・プランの更新

- エンタープライズ・アプリケーションのモジュールのテスト

- WS-PolicyファイルとWebサービスとの関連付け

- WebサービスのSOAPメッセージ・ハンドラの表示

- WebサービスのWSDLの表示

- Webサービス・セキュリティ構成の作成

管理コンソールを使用したWebサービスの管理の詳細は、Oracle WebLogic Server管理コンソール・ヘルプを参照してください。

次のセクションでは、次のトピックの詳細について説明します。

- 管理コンソールの起動

- 管理コンソールでのWebサービスの表示

- Webサービスのセキュリティ構成の作成

Webサービスおよびクライアントの監視の詳細は、「Webサービスおよびクライアントの監視」を参照してください。

管理コンソールの起動

ブラウザで管理コンソールを起動するには、次のURLを入力します。

http://host:port/console

説明:

- hostは、管理サーバーが動作しているコンピュータを指します。

- portは、管理サーバーが接続リクエストをリスニングしているポート番号を指します。管理サーバーのデフォルトのポート番号は7001です。

管理コンソールの右上にある「ヘルプ」ボタンをクリックすると、管理コンソールの詳しい使い方を説明するオンライン・ヘルプが表示されます。

次の図は、管理コンソールのメイン・ウィンドウを示しています。

図7-1 WebLogic Server管理コンソールのメイン・ウィンドウ

図7-1 「WebLogic Server管理コンソールのメイン・ウィンドウ」の説明

管理コンソールでのWebサービスの表示

通常、Webサービスはエンタープライズ・アプリケーションの一部としてWebLogic Serverにデプロイされます。エンタープライズ・アプリケーションは、EARとしてアーカイブするか、展開されたディレクトリの形式とすることができます。Webサービス自体はほとんどの場合、Webアプリケーションとしてパッケージ化されます。ただし、JWSファイルにセッションBeanが実装されている場合だけは、EJBとしてパッケージ化されます。Webサービスは、アーカイブ形式(Webアプリケーションの場合はWARファイル、EJBの場合はEJB JARファイル)または展開されたディレクトリ形式にできます。

Webサービスは、必ずしもエンタープライズ・アプリケーションの一部としてインストールする必要はありません。Webサービスは、WebアプリケーションまたはEJBとしてそのままインストールすることもできます。ただし、Oracleでは、Webサービスをエンタープライズ・アプリケーションの一部としてインストールすることをお薦めしています。Webサービスの作成に使用されるWebLogic Antタスク(jwsc)は、生成されたWebサービスを常にエンタープライズ・アプリケーションにパッケージ化します。

管理コンソールを使用してWebサービスに関するWebサービス固有の構成情報を表示および更新するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービスがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開すると、「Webサービス」カテゴリにアプリケーション内のWebサービスのリストが表示されます。構成を表示または更新するには、そのWebサービスの名前をクリックします。

次の図では、管理コンソールの「デプロイメント」表に、helloWorldEarエンタープライズ・アプリケーションにパッケージ化されているHelloWorldService Webサービスが表示されています。

図7-2 WebLogic Server管理コンソールのメイン・ウィンドウ

「図7-2 WebLogic Server管理コンソールのメイン・ウィンドウ」の説明

Webサービスのセキュリティ構成の作成

デプロイ済のWebLogic Webサービスがメッセージ・レベルのセキュリティ(WS-Security仕様で定義されている暗号化およびデジタル署名)を使用するように構成されている場合、Webサービス・ランタイムは、そのWebサービスにWebサービス・セキュリティ構成が関連付けられているかどうかを判断します。このセキュリティ構成では、IDの認証にX.509証明書を使用するかどうか、パスワード・ダイジェストを使用するかどうか、暗号化にキーストアを使用するかどうかなどを指定します。1つのセキュリティ構成を多数のWebサービスに関連付けることができます。

Webサービスのセキュリティ構成はドメイン全体を対象とするため、管理コンソールでは「デプロイメント」タブではなく「domainName」>「Webサービス・セキュリティ」タブから作成します。次の図に、このタブの場所を示します。

図7-3管理コンソールでのWebサービスのセキュリティ構成

「図7-3管理コンソールでのWebサービスのセキュリティ構成」の説明

Oracle Enterprise Manager Fusion Middleware Controlの使用

Oracle Enterprise Manager Fusion Middleware Control (Fusion Middleware Control)は、ファームをモニターと管理するために使用するWebブラウザ形式のグラフィカル・ユーザー・インタフェースです。ファームはFusion Middleware Controlによって管理されるコンポーネントの集合です。これは、Oracle WebLogic Serverドメイン、1つまたは複数の管理対象サーバー、およびドメインにインストール化、構成および実行できるOracle Fusion Middlewareシステムのコンポーネントが含まれています。

Fusion Middleware Controlは、様々なパフォーマンス・データおよび管理機能を個別のファームに対するWebベースのホームページ、Oracle WebLogic Serverドメイン、コンポーネントおよびアプリケーションに分割しています。Fusion Middleware Controlのホームページを使用すると、Webブラウザからの重要性の高いモニター・データと最もよく使用される管理機能のすべてを簡単に検索することができます。

次の図は、Fusion Middleware Controlを示します。

図7-4 Oracle Enterprise Manager Fusion Middleware Control

「図7-4 Oracle Enterprise Manager Fusion Middleware Control」の説明

Enterprise Managerを使用してWebサービスをモニターとテストする方法の詳細は、『Webサービスのためのセキュリティおよび管理者ガイド』のWebLogic Webサービスのセキュリティと管理に関する項を参照してください。

Fusion Middleware Controlは、Oracle Fusion Middleware製品に含まれていますが、Oracle WebLogic Serverのスタンドアロン・バージョンを購入した場合には同梱されていません。Fusion Middleware Controlの詳細については、Oracle Application Server管理者ガイドのOracle Enterprise Manager Fusion Middleware Controlの使用に関するスタート・ガイドを参照してください。

WebLogic Scripting Toolの使用

WebLogic Scripting Tool (WLST)は、コマンド・ライン形式のスクリプト・インタフェースで、WebLogic Serverのドメインやインスタンスと対話して構成したり、Java EEモジュールおよびアプリケーション(Webサービスを含む)を特定のWebLogic Serverインスタンスにデプロイする目的で使用します。システム管理者およびオペレータは、WLSTを使用してWebLogic Serverの構成の変更を開始、管理および永続化できます。

通常、Webサービスの管理に使用するWLSTコマンドの種類は、デプロイメント・カテゴリに分類されます。

WLSTの使用方法の詳細は、『Oracle WebLogic Scripting Tool』を参照してください。

WebLogic Antタスクの使用

WebLogic Serverには、構成タスクや管理タスクの多くを単一のAntビルド・スクリプトに一元化するのに使用できる様々なAntタスクが用意されています。これらのAntタスクを使用すると、以下のことが行えます。

- wlserverおよびwlconfig Antタスクを使用して、新しいWebLogic Serverドメインを作成、起動、および構成します。

- wldeploy Antタスクを使用して、新しく作成したドメインに、コンパイル済みアプリケーションをデプロイします。

Webサービスに関係のないWebLogic Antタスクに固有の情報は、『Oracle WebLogic Serverアプリケーションの開発』のAntタスクを使用したWebLogic Serverドメインの構成と使用に関する項およびwldeploy Antタスクのリファレンスに関する項を参照してください。

Java Management Extensions (JMX)の使用

マネージドBean (MBean)は、Java Management Extensions (JMX)インタフェースを提供するJava Beanです。JMXは、ネットワーク上のリソースをモニターおよび管理するためのJava EEソリューションです。JMXはSNMPおよび他の管理規格と同様に公開された仕様であり、一般的に用いられるモニター用製品を扱うベンダーの多くでサポートされています。

WebLogic Serverには、JMXを使用してWebLogic Serverリソースを構成、モニター、および管理するための様々なMBeanが用意されています。WebLogic Webサービスにも、Webサービスの管理タスクを実行するのに使用する専用のMBeanが複数あります。

MBeanには2種類あります。読取り専用のモニター情報の表示に使用する実行時MBeanと、デプロイ済のWebサービスの構成に使用する構成MBeanです。

構成WebサービスMBeanは次のとおりです。

- WebserviceSecurityConfigurationMBean

- WebserviceCredentialProviderMBean

- WebserviceSecurityMBean

- WebserviceSecurityTokenMBean

- WebserviceTimestampMBean

- WebserviceTokenHandlerMBean

実行時WebサービスMBeanは次のとおりです。

- WseeRuntimeMBean

- WseeHandlerRuntimeMBean

- WseePortRuntimeMBean

- WseeOperationRuntimeMBean

- WseePolicyRuntimeMBean

JMXの詳細は、Oracle WebLogic Server MBeanリファレンスおよび『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の次のセクションを参照してください:

- WebLogic Server MBeanの理解

- JMXを使用したWebLogic Server MBeanへのアクセス

- JMXを使用したドメインの構成の管理

Java EE Deployment APIの使用

Java EE 5では、J2EE Application Deployment仕様(JSR-88) (http://jcp.org/en/jsr/detail?id=88を参照)により、ターゲット・アプリケーション・サーバー環境へのデプロイメント用にアプリケーションを構成するために使用できる標準APIが定義されています。

この仕様には、Java EE Deploymentアーキテクチャが記述されています。このアーキテクチャでは、ツールやアプリケーション・プログラマがあらゆるJava EEプラットフォーム製品でアプリケーションを構成およびデプロイできるようにするための規約を定義しています。この規約では、アプリケーションのデプロイメント構成とデプロイメントについて、ツールとJava EEプラットフォーム製品の間での共通モデルが定義されています。Deploymentアーキテクチャを使用すると、アプリケーションのデプロイメントがより容易に行えます。多様なJava EEプラットフォーム製品にアプリケーションをデプロイするために、さまざまなJava EEデプロイメント・ツールのすべての機能を理解する必要はありません。

詳細は、『Oracle WebLogic Serverへのアプリケーションのデプロイ』を参照してください。

ワーク・マネージャによるWebサービス作業の優先付けとスタック実行スレッドの削減

クライアント・アプリケーションとWebサービスの間の接続が確立されると、理論的にはこれらの間の対話がスムーズかつ迅速になり、クライアントによるリクエストとサービスによる応答が適切なタイミングで行われます。ただし、クライアント・アプリケーションが新しいリクエストを行うのに時間がかかり、その間(最長でWebLogic Serverインスタンスの存続時間の間)、Webサービスが応答を待機する状況が発生することもあります。これは、しばしばスタック実行スレッドと呼ばれます。ある一時点においてスタック実行スレッドが大量に発生すると、サーバー全体のパフォーマンスが低下する可能性があります。

特定のWebサービスでこの状態が頻繁に発生する場合は、ワーク・マネージャを構成してそのサービスに適用することで、そのサービスにおいて作業の実行をどのように優先付けするかを指定できます。たとえば、レスポンス時間リクエスト・クラス(特定のタイプのワーク・マネージャ・コンポーネント)を構成すると、Webサービスのレスポンス時間の目標値を指定できます。

次に、デプロイメント記述子でレスポンス時間リクエスト・クラスを定義する方法の例を示します。

<work-manager>
<name>responsetime_workmanager</name>
<response-time-request-class>
<name>my_response_time</name>
<goal-ms>2000</goal-ms>
</response-time-request-class>
</work-manager>

Oracle WebLogic Server管理コンソール・ヘルプの「ワーク・マネージャ: レスポンス時間: 構成」で説明されるように管理コンソールを使用してレスポンス時間リクエスト・クラスを構成することができます。

ワーク・マネージャの詳細、およびWebサービスに対して構成する方法の詳細は、『Oracle WebLogic Serverサーバー環境の構成』のワーク・マネージャを使用したスケジューリング済作業の最適化に関する項を参照してください。

Webサービスおよびクライアントの監視

管理コンソールまたはWLSTを使用して、呼出し回数、エラー数、フォルト数などのWebサービスおよびクライアントの実行時の情報を監視できます。

次のネーミング規則では、監視ページでWebサービスまたはクライアントを特定します。

<application_name>#<application_version>!<service_name><contextpath><url_pattern>

ここで:

- application_name - Webサービスまたはクライアントを含むアプリケーションの名前。

- application_version - Webサービスまたはクライアントを含むアプリケーションのバージョン。

- service_name - Webサービスまたはクライアントの名前。

- context_path - Webサービス用に定義されるコンテキスト・パス。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebLogic Webサービスのコンテキスト・パスの定義に関する項を参照してください。

- url_pattern - システム・デフォルトまたはユーザー定義によるWebサービスのURLパターン。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスの起動に使用するトランスポートの指定に関する項を参照してください。

Webサービスの監視

管理コンソールを使用してWebサービスを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービスがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックしてアプリケーションを展開すると、「Webサービス」カテゴリにアプリケーション内のWebサービスのリストが表示されます。Webサービスの名前をクリックして「監視」タブをクリックします。

または、左ペインの「デプロイメント」ノード、右ペインに表示される「監視」タブ、「Webサービス」タブの順にクリックします。監視統計を表示するWebサービスの名前をクリックします。

次の表に、Webサービス情報を監視するために選択できるタブを示します。ページには、Webサービスが実行されているすべてのサーバーの統計が集約されます。

注意:

JAX-WS Webサービスの場合、組込みのWs-Protocol操作では、基になるWS-*プロトコルに関する統計情報が表示されます。この情報は、アプリケーションのパフォーマンスを評価するときに役立ちます。

表7-1 Webサービスの監視

クリックするタブ

表示内容

「監視」>「一般」

合計エラー数や呼出し数など、Webサービスに関する一般的な統計。

「監視」>「呼出し」

ディスパッチ時間、実行時間および平均など、呼出しの統計。

「監視」>「WS-Policy」

Webサービスにアタッチされているポリシー。認証、認可、機密性、整合性のカテゴリに編成されています。

「監視」>「ポート」

Webサービス・エンドポイント(ポート)がリストされている表。この表には、各ポートの情報がまとめられています。ポート名をクリックすると、詳細が表示されます。

「監視」>「ポート」>「一般」

Webサービス・エンドポイントに関する一般的な統計。ページには、Webサービス・エンドポイント名、そのURI、関連付けられているWebサービス、エンタープライズ・アプリケーション、およびアプリケーション・モジュールなどの情報が表示されます。すべてのWebサービス・エンドポイント操作に関して、エラー数と呼出し数が集約されます。

「監視」>「ポート」>「呼出し」

成功、失敗、違反の数など、Webサービス・エンドポイントの呼出しの統計。

「監視」>「ポート」>「クラスタ・ルーティング」

リクエストとレスポンス、およびルーティング失敗など、Webサービス・エンドポイントのクラスタ・ルーティングの統計。

「監視」→「ポート」→「接続」

WebサービスのMakeConnection非同期エンドポイント。非同期エンドポイントごとに、受信メッセージ数、保留メッセージ数など、実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

非同期エンドポイントの名前をクリックして詳細を表示します。

「監視」→「ポート」→「信頼できるメッセージ」

Webサービスの信頼性のあるメッセージングの順序。信頼性のあるメッセージングの順序ごとに、順序の状態、移行元サーバーおよび宛先サーバーなどの実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

順序IDをクリックして詳細を表示します。

「監視」→「ポート」→「リクエスト」

Webサービスの信頼性のあるメッセージング・リクエスト。信頼性のあるメッセージング・リクエストごとに、実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

信頼できるメッセージIDをクリックして詳細を表示します。

「監視」>「ポート」>「WS-Policy」

Webサービス・エンドポイントにアタッチされているポリシーに関連した統計。認証、認可、機密性、整合性のカテゴリに編成されています。

「監視」>「ポート」>「操作」

Webサービス・エンドポイントの操作のリスト。

WebLogic Serverインスタンスが起動されてから操作が呼び出された回数、Webサービスの呼出しにかかった平均時間、レスポンスにかかった時間など、各操作に関する実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

注意: JAX-WS Webサービスの場合、組込みのWs-Protocol操作では、基になるWS-*プロトコルに関する統計情報が表示されます。たとえば、Webサービスの信頼性メッセージでは、この操作により、Webサービスまたはクライアントの代理で信頼性のあるメッセージサブシステムによって送受信されるCreateSequenceメッセージおよびAckRequestedメッセージのメッセージ統計を取得します。この情報は、アプリケーションのパフォーマンスを評価するときに役立ちます。

操作の名前をクリックすると詳細が表示されます。選択した操作の一般的な統計や呼出しの統計を表示するには、それぞれ「一般」または「呼出し」タブをクリックします。

Webサービス・クライアントの監視

管理コンソールを使用してWebサービス・クライアントを監視するには、左ペインの「デプロイメント」ノードをクリックし、右ペインに表示される「デプロイメント」表でWebサービスがパッケージ化されているエンタープライズ・アプリケーションを探します。「+」ノードをクリックし、Webサービス・クライアントが存在するアプリケーション・モジュールをクリックします。「監視」タブ>「Webサービス・クライアント」タブの順にクリックします。

または、左ペインの「デプロイメント」ノード、右ペインに表示される「監視」タブ、「Webサービス・クライアント」タブの順にクリックします。監視統計を表示するWebサービス・クライアントの名前をクリックします。

表には、各Webサービス・クライアントの実行時の情報がまとめて表示されます。表でクライアント名をクリックすると詳細が表示されます。

注意:

JAX-WS Webサービスの場合、Webサービスの実行時、Webサービス・エンドポイント内にシステム定義のクライアント・インスタンスを作成し、それを使用してエンドポイントに定められたプロトコル固有のメッセージを送信します。これらのクライアント・インスタンスは、自身が動作するWebサービス・エンドポイントの名前に接尾辞-SystemClientが付いた名前になります。システム定義のクライアント・インスタンスに関する監視情報を利用して、アプリケーションを評価できます。

表7-2 Webサービス・クライアントの監視

クリックするタブ

表示内容

「監視」>「一般」

エラーや呼出しの合計数など、Webサービス・クライアントに関する一般的な統計。ページには、Webサービス・クライアント名、関連付けられているエンタープライズ・アプリケーションとアプリケーション・モジュール、およびコンテキスト・ルートが表示されます。Webサービスが実行されているすべてのサーバーに関して、エラーと呼出しの統計が集約されます。

「監視」>「呼出し」

ディスパッチ時間、実行時間および平均など、呼出しの統計。

「監視」>「WS-Policy」

Webサービス・クライアントにアタッチされているポリシー。認証、認可、機密性、整合性のカテゴリに編成されています。

「監視」>「サーバー」

現在クライアントが実行されているサーバーがリストされている表。そのサーバーのWebサービス・クライアントに関する詳細を表示するには、クライアント名をクリックし、この後の手順のタブを使用します。

「監視」>「サーバー」>「一般」

Webサービス・クライアントに関する一般的な統計。ページには、Webサービス・クライアント・ポート、関連付けられているエンタープライズ・アプリケーションとアプリケーション・モジュール、およびコンテキスト・ルートなどの情報が表示されます。すべてのWebサービス・クライアント操作に関して、エラー数と呼出し数が集約されます。

「監視」>「サーバー」>「呼出し」

成功、失敗、違反の数など、Webサービス・クライアントの呼出しの統計。

「監視」>「サーバー」>「クラスタ・ルーティング」

リクエストとレスポンス、ルーティングの失敗など、Webサービス・クライアントのクラスタ・ルーティングの統計。詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のクラスタ・ルーター・パフォーマンスの監視に関する項を参照してください。

「監視」→「サーバー」→「接続」

Webサービス・クライアントのMakeConnection非同期エンドポイント。非同期エンドポイントごとに、受信メッセージ数、保留メッセージ数など、実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

非同期エンドポイントの名前をクリックして詳細を表示します。

「監視」→「サーバー」→「信頼できるメッセージ」

Webサービス・クライアントの信頼性のあるメッセージングの順序。信頼性のあるメッセージングの順序ごとに、順序の状態、移行元サーバーおよび宛先サーバーなどの実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

非同期エンドポイントの名前をクリックして詳細を表示します。

「監視」>「サーバー」>「WS-Policy」

Webサービス・クライアントにアタッチされているポリシーに関連した統計。認証、認可、機密性、整合性のカテゴリに編成されています。

「監視」>「サーバー」>「操作」

Webサービス・クライアントの操作のリスト。レスポンス、実行およびディスパッチの平均時間、レスポンス、呼出しおよびエラーの数など、各操作に関する実行時の監視情報が表示されます。「この表のカスタマイズ」をクリックして、表に表示される情報をカスタマイズできます。

操作の名前をクリックすると詳細が表示されます。選択した操作の一般的な統計や呼出しの統計を表示するには、それぞれ「一般」または「呼出し」タブをクリックします。

8 JAX-WSへのJAX-RPC Webサービスおよびクライアントの移行

この章では、Java API for XML-based RPC (JAX-RPC) WebサービスおよびクライアントをXML-based Web services (JAX-WS)に移行する方法について説明します。

JAX-RPC Webサービスを移行する場合、JAX-RPC Webサービスを生成するには、WSDLファイルから、トップダウンのアプローチを使用して元のWSDLファイルを保存します。詳細は、「WSDLファイルから開始するWebLogic Webサービスの開発: 主な手順」を参照してください。

注意:

JAX-WSでJAX-RPCの機能がサポートされていない場合があります。この場合は、アプリケーションを再構築しないと移行できません。

次の表に、説明するトピックをまとめます。

表8-1 JAX-RPCのWebサービスおよびクライアントをJAX-WSへ移行するためのヒント

トピック

説明

WebLogic Webサービスの最終コンテキスト・ルートの設定

WebLogic Webサービスの最終コンテキスト・ルートの設定方法を説明します。JAX-WSでは@WLXXXTransport JWSアノテーションの使用がサポートされていません。これらのアノテーションはJAX-RPCでのみサポートされます。

WebLogic独自のアノテーションの使用

JAX-WSでサポートされるWebLogic独自のアノテーションについて説明します。

WSDLファイルの生成

jwsc Antタスクを使用してJAX-WS Webサービスを生成する際にWSDLファイルを生成する方法を説明します。

JAXBカスタム・タイプの使用

すべてのデータ・バインディング・タスクを管理するためのJava Architecture for XML Binding (JAXB)の使用について説明します。

EJB 3.0の使用

EJB 2.1からのEJB 3.0における変更点について説明します。JAX-WSはEJB 3.0をサポートします。JAX-RPCはEJB 2.1のみをサポートします。

RPCスタイルSOAPバインディングからの移行

SOAPバインディングを設定するためのガイドラインについて説明します。RPC形式はサポートされますが、JAX-WSでは推奨されません。

SOAPメッセージ・ハンドラの更新

JAX-WSへの移行時に、現在のJAX-RPC SOAPメッセージ・ハンドラを書き直さなければならない点について説明します。

JAX-WSクライアントの呼出し

JAX-WSクライアントを呼び出すようにJAX-RPCクライアントを書き直さなければならない点について説明します。

WebLogic Webサービスの最終コンテキスト・ルートの設定

『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebLogic Webサービスの最終コンテキスト・ルートの確定方法に関する項で説明しているように、WebLogic Webサービスの最終コンテキスト・ルートは様々な方法で設定できます。

このセクションで説明するように、JAX-RPC Webサービスを定義する際は、@WLXXXTransport JWSアノテーションを使用してコンテキスト・ルートを指定できます。この@WLXXXTransport JWSアノテーションは、JAX-WS Webサービスには無効です。JAX-RPC Webサービスで使用する場合、他の方法の1つを使用するためにこのアノテーションを削除してJWSファイルを更新する必要があります。

WebLogic独自のアノテーションの使用

JAX-WSでは以下のWebLogic独自のアノテーションがサポートされています。

- @Policy

- @Policies

- @SecurityPolicy

- @SecurityPolicies

- @WssConfiguration

その他のWebLogic固有のアノテーションは、JAX-WSへの移行時にJAX-RPCアプリケーションからすべて削除する必要があります。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebLogic固有のアノテーションに関する項を参照してください。

WSDLファイルの生成

JAX-RPC Webサービスでjwscファイルを実行すると、指定した出力ディレクトリにWSDLファイルが生成されます。JAX-WS Webサービスの場合、WSDLファイルはサービス・エンドポイントのデプロイ時に生成されます。WSDLファイルを出力ディレクトリに生成するには、jwsc Antタスクの<jws子要素でwsdlOnly属性を指定する必要があります。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のjwscに関する項を参照してください。

JAXBカスタム・タイプの使用

JAX-WSでは、Java Architecture for XML Binding (JAXB) (http://jcp.org/en/jsr/detail?id=222を参照)を使用してあらゆるデータ・バインディング・タスクを管理します。アプリケーションでXMLBeanまたはTylarを使用してカスタム・タイプをサポートしている場合、JAXBを使用するようにそれらを変更する必要があります。JAXBを使用する方法の詳細は、第5章「JAXBデータ・バインディングの使用」を参照してください。

EJB 3.0の使用

JAX-WSはEJB 3.0をサポートします。JAX-RPCはEJB 2.1のみをサポートします。

EJB 3.0では、EJBを実装する場合に必要なEJBリモートおよびホーム・インタフェース・クラスおよびデプロイメント記述子ファイルを、手動で作成するのではなく、自動的に生成することができるメタデータ・アノテーションが導入されました。

EJB 3.0 Beanクラス要件および2.xからの変更点については、『Enterprise JavaBeans (EJB) 3.0』の「Beanファイルのプログラミング: 要件および2.Xからの変更点」を参照してください。

RPCスタイルSOAPバインディングからの移行

SOAPBinding.Style.RPCスタイルの使用はサポートされていますが、JAX-WSでは推奨されません。このスタイルはSOAPBinding.Style.DOCUMENTへ変更するようお薦めします。

SOAPメッセージ・ハンドラの更新

SOAP APIは似ていますが、JAX-RPC SOAPハンドラは、JAX-WSで動作するよう変更する必要があります。詳細は、『Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング』のSOAPメッセージ・ハンドラの作成と使用に関する項を参照してください。

JAX-WSクライアントの呼出し

JAX-RPCとJAX-WSのクライアントAPIは完全に異なるため、JAX-RPCクライアントを書き直す必要があります。JAX-WSクライアントの記述に関する詳細は、『JAX-WSを使用したWebLogic Webサービスの開始』の「Webサービスの呼出し」を参照してください。

Copyright © 2007, 2013, Oracle and/or its affiliates. All rights reserved.