Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.3.0) E90376-03 |
|
前 |
次 |
この章の内容は次のとおりです。
サービス対応ADFビジネス・コンポーネント・アプリケーション・モジュールは、サービス・インタフェースを通じてSOAPサービス顧客が使用できるようになります。
サービス対応アプリケーション・モジュールは、サービス・インタフェースを通じてサービス・コンシューマに通知するADFアプリケーション・モジュールです。サービス利用者がサービス対応アプリケーション・モジュールの利用には、Webサービス・アクセス、Service Component Architecture (SCA)コンポジット・アクセス、および別なADFアプリケーション・モジュールからのアクセスという3つのシナリオがあります。
Service Component Architecture (SCA)は、リモートで使用可能なサービスを実装するためのオープンで技術に中立なモデルを提供します。SCAはビジネス機能の観点から定義されており、アプリケーション開発者によるミドルウェア機能のアクセスを容易にします。ADFビジネス・コンポーネントはサービス・インタフェースで公開可能なアプリケーション・モジュールにより、SCA準拠ソリューションをサポートしています。
アプリケーション・モジュールをサービス対応にすると、JDeveloperが必要なアーティファクトを作成します。その構成内容は次のとおりです。1) サービスを定義しているJavaインタフェース、2) Javaインタフェースを実装するEJB 3.0セッションBean、3) サービスの操作を記述したWSDLファイル、および4) サービスのデータ構造を定義したXMLスキーマ・ドキュメント(XSD)。サービス・インタフェースはWSDLとXSDを組み合せた中立言語で、Fusion Webアプリケーション・クライアント用に記述されます。
SCAは次の2種類のサービスを定義します。
リモート対応可能なサービス。通常はきめが粗く、結合が緩いSOAアーキテクチャでのリモート公開用に設計されます。
ローカル・サービス。通常はきめが細かく、緊密に結合されたアーキテクチャ内で同時にデプロイされる他の実装でのローカルな使用のために設計されます。
ADFビジネス・コンポーネント・サービスは最初のカテゴリに分類され、リモート対応可能サービスとしてのみ使用する必要があります。
リモート・アプリケーション・モジュールによって定義されたADFビジネス・コンポーネント・サービス(データ・アクセスとメソッド・コールを含む)は、その他のあらゆるアプリケーション・モジュールとの相互運用が可能です。これは、同じアプリケーション・モジュールで、ADFデータ・コントロールおよびWebサービス・クライアントを使用している対話型のWebユーザー・インタフェースをサポートできるということを意味しています。
サービス対応アプリケーション・モジュールは、開発チームが公開し、Fusion Webアプリケーションに提供できます。リモートWebサービスからアセンブルされたFusion Webアプリケーションも、単一のアプリケーション・サーバー上で稼働するための参加サービスが不要です。
Webアプリケーションは異なる複数のアプリケーション・サーバーで実行されることがありますが、SCAは統合アプリケーションのように見えます。利用するクライアント・プロジェクトはADFサービス・ファクトリ検索メカニズムを使用して、データおよびサービス対応アプリケーション・モジュールによってカプセル化されたあらゆるビジネス・メソッドにアクセスします。実行時は、サービスの起動に使用されるプロトコル(SOAPまたはRMI)に応じて、コール元のクライアントとADF Webサービスが同じトランザクションに参加する場合とそうでない場合があります。RMIプロトコルとJava Transaction API (JTA)マネージド・トランザクションのみで、コール元のクライアントと同じトランザクションでサービスをコールすることができます。デフォルトでは、ADF Webサービスは、RMIプロトコルをサポートするために、同じトランザクションに参加するように構成されます。
ADFビジネス・コンポーネント・サービスを使用する前に、他のOracle ADF機能を理解しておくと役立つ場合があります。次に、関連する他の機能へのリンクを示します。
SCAおよびサービス・データ・オブジェクト(SDO)標準の詳細は、http://www.oasis-opencsa.org
にあるOpen Composite Services Architecture (CSA)を通じてOrganization for the Advancement of Structured Information Standards (OASIS)のWebサイトの仕様の項を参照してください。
WebサービスおよびOracle WebLogic ServerのWebサービス・サポートの背景の詳細は、『Webサービスの理解』のWebサービスの概要に関する項参照してください。
Business Process Execution Language (BPEL)エンティティ変数を使用してSDOデータ・プロバイダにデータ操作を委譲する方法の詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』のBPELプロセスでのXMLデータの操作の章を参照してください。
RMIクライアントの認可を有効にするために使用されるbinding_permission_authorization_policy
を含め、Oracle Web Services Manager (OWSM)によりサポートされる事前定義済の認可ポリシーの詳細については。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の付録「事前定義済ポリシー」を参照してください。
ローカル・サービス・サポートには、「アプリケーション・モジュールのクライアント・インタフェースのプログラム的操作」で説明しているApplicationModule
インタフェースとViewObject
インタフェース・サポートを使用します。
oracle.jbo
パッケージに関連するAPIのドキュメントについては、次のJavadocリファレンス・ドキュメントを参照してください。
Oracle ADFモデルJava APIリファレンス
ADFアプリケーション・モジュールを使用してSOAPベースのWebサービスを有効にし、ビュー・オブジェクト・データの行を使用可能にします。
アプリケーション・モジュールは、ビジネス・ロジックを関連する一連のビジネス機能としてカプセル化するADFビジネス・コンポーネント・フレームワーク・コンポーネントです。アプリケーション・モジュールはサービスにマップされます。アプリケーション・モジュールの概要エディタを使用して、Webサービス・インタフェースを有効化し、ビュー・オブジェクト・データの行をサービス・データ・オブジェクト(SDO)コンポーネントとして公開します。
SDOコンポーネントの基礎になっているSDOフレームワークによって、ビュー・オブジェクトのデータが抽出され、JavaとXML間でのデータ構造のやり取りが標準化されます。この種のデータ抽出によってサービス指向アーキテクチャ(SOA)での異種環境データ・ソースの処理が簡略化され、対話型のWebユーザー・インタフェースとWebサービス・クライアントに同じビュー・オブジェクトを使用することで、ビュー・オブジェクトを選択してサービス対応にできます。
JDeveloperでは、アプリケーション・モジュールをWebサービスとして公開できます。このようなWebサービスでは、アプリケーション・モジュールで定義されたビュー・インスタンスに基づくSDOコンポーネントを使用して、JavaとXML間のデータ構造のやり取りが標準化されます。JDeveloperは、Webサービス・クライアントがコンシューミング・アプリケーションで使用するWSDLサービス記述も生成します。
注意:
JDeveloperでは、サービス対応アプリケーション・モジュールのビュー・オブジェクトのSDOコンポーネント生成のみをサポートします。現時点では、これ以外のADFビジネス・コンポーネントをSDOコンポーネントとして定義できません。
サービス対応アプリケーション・モジュールは、ビュー・オブジェクト、カスタム・メソッド、組込みデータ処理操作、および指定されたビュー基準に基づく特殊な検索方法を公開し、クライアントが使用できるようにします。アプリケーション・モジュール・サービス・インタフェースの有効後、ADFビジネス・コンポーネントService Interfaceデプロイメント・プロファイルを作成して、ターゲット・アプリケーション・サーバーにデプロイする必要があります。
Business Process Execution Language (BPEL)プロセス・サービス・コンポーネントで使用する、ビュー・インスタンス・データ処理操作も公開する必要があります。BPELは、複数のサービスからエンドツーエンドのビジネス・プロセスを構成するための言語です。BPELエンティティ変数を使用してデータ操作をSDOデータ・プロバイダに委譲する方法の詳細は、『Oracle SOA SuiteでのSOAアプリケーションの開発』の「BPELプロセスでのXMLデータの操作」の章のXMLデータ操作のデータ・プロバイダ・サービスへの委譲を参照してください。
注意:
SDOパラメータを使用して直接メソッドを実装するのではない点が重要です。SDOフレームワークを使用して、実行時にのみビュー行のタイプをラップします。
JDeveloperでアプリケーション・モジュールを編集して、最上位のビュー・オブジェクトを公開し、サポートしているサービス操作を定義するWebサービス・インタフェースを作成します。サービスを有効化でき、サービス・クライアントがアクセス可能にできる最上位のビュー・オブジェクトは、次のとおりです。
スタンドアロン・ビュー・オブジェクトのビュー・インスタンス(階層関係に参加しません)
マスター詳細関連ビュー・オブジェクトのマスター・ビュー・インスタンス(子ビュー・インスタンスを含みません)
親ビュー・オブジェクトを拡張するビュー・オブジェクトのビュー・インスタンス(多相ビュー・オブジェクトを定義するためのサブタイプ識別子属性を含む必要はありません)
サービス・インタフェースに自動的に参加しないビュー・オブジェクトは、次のとおりです。
マスター詳細関連ビュー・オブジェクトの子ビュー・インスタンス
サービス・インタフェースには、個々に子ビュー・オブジェクトを追加できます。子ビュー・オブジェクトのSDOクラスの作成方法の詳細は、「個別のビュー・オブジェクトのサービス対応化の方法」を参照してください。
多相ビュー・オブジェクトのビュー・インスタンス(サブタイプ識別子属性によって定義されます)
JDeveloperで、多相ビュー・オブジェクトに対するアクセスや操作を可能にする、Webサービス・プロキシ・クライアントを作成できます。JAX-WSクライアントの例は、「コンシューミング・アプリケーションでの多相コレクションへのアクセス」を参照してください。
標準的なサービス操作の目的は、ビュー・オブジェクトのデータ処理操作を公開することです。標準のサービス操作を起動することで、基になるフレームワーク・オブジェクトで定義したあらゆるビジネス・ロジック(たとえばビジネス・ルールの評価など)が、適用されます。
表15-1は、サービス・ビュー・インスタンスがサポートしている標準操作のリストです。
表15-1 標準ビュー・インスタンス・データ処理操作
操作 | メソッド名 | 操作の説明 |
---|---|---|
|
|
1つのADFビジネス・コンポーネント・ビュー行を作成します。 |
|
|
1つのADFビジネス・コンポーネント・ビュー行を更新します。 |
|
|
1つのADFビジネス・コンポーネント・ビュー行を削除します。 |
|
|
ADFビジネス・コンポーネント・ビュー行があれば更新し、なければ新しく作成します。 |
|
|
主キーによって、単一のADFビジネス・コンポーネント・ビュー行を取得します。 |
|
|
選択したビュー・オブジェクトの問合せ文に適用されるSDOベースのビュー基準を使用して、ADFビジネス・コンポーネントのビュー行のリストを検索して戻します。 問合せでは、問合せの実行に必要として定義されたバインド変数は指定してはなりません。サービス・インタフェースは実行時には必須バインド変数を公開しません。このシナリオ用の検索メソッドの作成の詳細は、「必須バインド変数によってフィルタされる宣言的検索操作の公開方法」を参照してください。 |
|
|
必要なバインド変数の名前付きビュー基準と値により、ADFビジネス・コンポーネントのビュー行のリストを検索して戻します。これは必須バインド変数に依存しているADFビジネス・コンポーネント・ビュー行のフィルタには適した方法です。 |
|
|
ADFビジネス・コンポーネント・ビュー行リストに対する作成、更新、削除、またはマージ操作を実行します。指定した操作が特定のリスト内のすべてのオブジェクトに対して適用されます。 |
|
|
ADFビジネス・コンポーネント・ビュー行リストに対する作成、更新、または削除操作を実行します。 |
また、複数の組込みメソッドをオプションでアプリケーション・モジュール(AppModuleService.java
)のクライアント・サービス・インタフェースに追加できます。表15-2に、有効にするサービス・ビュー・インスタンスのランタイム・サポートを提供する組込みメソッドのリストを示します。
表15-2 組込みサービス・インタフェース・メソッド
操作 | メソッド名と非同期メソッド名 | メソッドの説明 |
---|---|---|
|
|
特定のロケールに基づくオブジェクトについて、オブジェクトと属性の表示名ラベルを含むベースUIヒントを返します。メソッドは、サービスでオブジェクトの名前を受け取り、ベース・ヒントのローカリゼーションを駆動するヒントおよびロケール名(ISO 639-1形式)を取得します。 このメソッドを、Webサービス・コンシューミング・アプリケーションで使用して、サービス・ビュー・インスタンスとその属性の適切なラベルでユーザー・インタフェースを生成できます。表示名UIヒントの指定の詳細は、「サービス・ビュー・インスタンスと属性の表示名の設定方法」を参照してください。 |
|
|
SOAPサービス・エンドポイントのサービス・スキーマ・ファイルの最終変更時刻を返します。 このメソッドは、オブジェクトがいつ更新されたかを判断するためにサービス・ビュー・インスタンス・スキーマ・ファイル(XSD)をキャッシュするWebサービス・コンシューミング・アプリケーションで使用できます。 |
|
|
サービス・ビュー・インスタンス名と、SOAPサービス・エンドポイントの各サービス・ビュー・オブジェクトが「作成」、「更新」、「マージ」および「削除」操作をサポートするかどうかを示すフラグのリストを返します。 このメソッドは、カスタム・オブジェクト・サービスを使用して使用可能な操作を判断するWebサービス・コンシューミング・アプリケーションで使用できます。カスタム・オブジェクト・サービスは、設計時にADFビジネス・コンポーネントWebサービスを使用して作成されず、このドキュメントでは説明しません。 |
始める前に:
SDOフレームワークによって、サービス対応ADFアプリケーション・モジュールがどのようにサポートされ、Webサービス・クライアントのデータ行アクセスやサービス操作がどのように有効化されるかについて、理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
サービス対応アプリケーション・モジュールは、標準Webサービス(@WebService
の注釈の付いたJavaクラスまたはJavaインタフェース)がすでに含まれているプロジェクトには作成しないでください。JDeveloperのデプロイメント・プロファイルでは、同じプロジェクトに属する標準WebサービスとADFビジネス・サービスのデプロイはサポートされません。標準Webサービスと同じプロジェクトに属するADFビジネス・サービスのWebサービスをデプロイしようとすると、Oracle WebLogic Server例外エラーが発生してデプロイメントが失敗します。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。
「アプリケーション・モジュールの作成方法」の説明に従って、該当するアプリケーション・モジュールを作成します。
オプションで、JDeveloperプリファレンスを設定して、生成されるSDOクラス名のデフォルト接尾辞の指定、サービス共通のインタフェースとクラスが入るサブパッケージの変更、および生成されるSDOスキーマとWebサービスのデフォルトのネームスペース接頭辞の設定を行います。「ADF Webサービス・インタフェース生成用プリファレンスの設定方法」を参照してください。
サービスでカスタム検索操作を公開する場合は、「名前付きビュー基準を宣言的に作成する方法」の説明に従って、宣言的なビュー基準を作成してカスタム問合せを指定します。
Webサービス・インタフェースを作成するには:
「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。
概要エディタで、「サービス・インタフェース」ナビゲーション・タブをクリックし、サービス・インタフェースのサポートの有効化ボタンをクリックします。
「サービス・インタフェースの作成」ウィザードを使用して、該当するオプションを構成します。
「サービス・インタフェースの作成」ウィザードの「サービス・インタフェース」ページで、Webサービスの名前とターゲット・ネームスペースを入力します。
ターゲット・ネームスペースはサービスのURIで、同じURIを入力することで、類似のサービスをグループ化するために割り当てることができます。デフォルトのターゲット・ネームスペースは、「プリファレンス」ダイアログで指定したパッケージ名と組み合せたアプリケーション・モジュールのパッケージ名です。
ヒント:
URIを成形するJDeveloperプリファレンスを定義し、サービスの一意のターゲット・ネームスペースを定義できます。ネームスペースURI成形プリファレンスの詳細は、「ADF Webサービス・インタフェース生成用プリファレンスの設定方法」を参照してください。
アプリケーション・モジュールのメソッドを非同期サービス・メソッドとして公開し、Webサービスで同期と非同期の両方の操作を有効にするには、「非同期Webサービス・メソッドの生成」を選択します。
デフォルトでは、Webサービスは同期サービス・メソッドをサポートしています。これによってクライアント・アプリケーションを強制的に起動して待機させ、レスポンスが返されるまで作業を続行できません。レスポンスが即座に返る場合、このWebサービス呼出しの方法が一般的です。しかし、リクエスト処理が遅延する場合もあるため、クライアント・アプリケーションは先に処理を続行し、後でレスポンスを処理するほうが効率的なことも少なくありません。
以前に定義したカスタマイズ・ロールに基づいてロール形成が定義されていないかぎり、Service Categoriesリストは空白になります。組織でサービスを分類していないかぎり、「選択済」は空白のままにしてください。
この機能はサービスWSDLファイルに影響がなく、Webサービス操作に関係しません。
「サービス組込みメソッド」ページで、オプションで「オブジェクトと属性のコントロール・ヒント操作の生成」を選択して、ビュー・インスタンスに定義された静的コントロール・ヒント(UIヒント)とその属性を返すメソッドを生成します。
このオプションを有効にすると、ウィザードがgetDfltObjAttrHints()
メソッドをクライアント・サービス・インタフェース(AppModuleService.java
)に追加します。Webサービス・コンシューミング・アプリケーションは、このメソッドを起動して、データベース・ラウンドトリップを必要とせずにサーバー上のUIヒントを解決できます。メソッドはサービス・ビュー・オブジェクト名とロケール名を受け取り、特定のロケールに基づくオブジェクトについて、オブジェクトと属性の表示名ラベルを含むベースUIヒントを返します。ロケール名が指定されていない場合、メソッドはデフォルト・ロケールを使用します。
オプションで、「最終更新時間操作の生成」を選択して、サービス・スキーマ・ファイルの最終変更時刻を返すメソッドを生成します。
このオプションを有効にすると、ウィザードがgetServiceLastUpdateTime()
メソッドをクライアント・サービス・インタフェース(AppModuleService.java
)に追加します。カスタマイズが行われる前に、このメソッドは最終更新スキーマ・ファイルのファイル・タイムスタンプを返します。スキーマが実行時にカスタマイズされると、最終更新タイムスタンプが更新され、この最新のタイムスタンプが返されます。この機能は、主に、サービスXSDをキャッシュするWebサービス・コンシューミング・アプリケーションで役立ちます。
オプションで、「エンティティ・リスト操作の生成」を選択して、サービス・ビュー・インスタンスのリストを返すメソッドを生成します。
このオプションを有効にすると、ウィザードがgetEntityList()
メソッドをクライアント・サービス・インタフェース(AppModuleService.java
)に追加します。メソッドは、サービス・ビュー・インスタンス名、XSDタイプ、およびサービス・ビューが「作成」、「更新」、「マージ」および「削除」操作をサポートするかどうかを示すフラグのリストを返します。この機能は、主に、カスタマイズを必要とするWebサービス・コンシューミング・アプリケーションで役立ちます。
「サービス・カスタム・メソッド」ページで、サービス・インタフェースに公開するカスタム・メソッドを追加し、各メソッドのパラメータと戻り値のデータ型を定義します。
有効にするカスタム・サービス・メソッドのパラメータとvoid以外の戻り値は、サービス・インタフェースでサポートされているデータ型(Javaプリミティブ・タイプなど)またはそのようなデータ型のリスト(oracle.jbo.server.ViewRowImpl
、java.util.List<
ViewRowImpl
>
、oracle.jbo.AttributeList
、java.util.List<
AttributeList
>
、java.util.List<
PrimitiveType
>
など)である必要があります。
ViewRowImpl
およびAttributeList
の両方のデータ型は、Webサービス・クライアントに対して同一の行構造で公開されますが、実行時には基本的な違いがあります。サポートされているデータ型の詳細は、「ADF Webサービス・インタフェース上のメソッド・シグネチャに関する必知事項」を参照してください。
ViewRowImpl
またはAttributeList
データ型を使用して、各パラメータと戻り値に対して、サービス・インタフェース内で使用可能なカスタム・メソッドを選択後、行構造に対応するビュー・オブジェクト・インスタンスの名前を選択する必要があります。
「選択済」リストで、returnまたはparametersを展開して、項目を選択します。
Java要素データ型を「要素Javaタイプ」に入力します。
Java要素型がViewRowImpl
またはAttributeList
の場合は、「要素のビュー・オブジェクト」に行構造を識別するビュー・オブジェクト・インスタンス名を入力します。
たとえば、CustomerInfo
ビュー・オブジェクト・インスタンスの単一行を定義する場合、次のようなカスタム・メソッド・シグネチャが必要になります。
public ViewRowImpl findCustomerInfo(int id)
次にサービス・インタフェース内での表示用にfindCustomerInfo()
カスタム・メソッドを選択した後、その戻り値をツリー内で選択し、「ビュー・オブジェクト」プロパティを、実行時に行構造を使用するビュー・インスタンスの名前であるCustomerInfo
に設定します。
カスタム・メソッドの警告のサービス情報メッセージやプロセス処理メソッドの警告を公開するには、「戻りサービス・データ・オブジェクトに警告を含める」を選択します。
たとえば、従業員給与の合計を返すメソッドで合計が望ましい範囲を超えている場合に、情報メッセージを表示するとします。
「戻りサービス・データ・オブジェクトに警告を含める」が選択されていない場合、サービス・レスポンスとともに情報メッセージは返されません。
このオプションは、メソッドがビュー行やビュー行のリストを返さない場合にのみ有効になります。メソッドがビュー行を返す場合、メソッドで警告がサポートされるかどうかは、「個別のビュー・オブジェクトのサービス対応化の方法」で説明しているように、基礎となるビュー・オブジェクトによって決定されます。
情報メッセージ(および警告)は、戻りオブジェクトの一部として報告されます。JDeveloperにより、戻りオブジェクトとして適切なラッパーが生成され、このラッパーに実際のメソッド戻り値と情報メッセージが含まれています。
「サービス・ビュー・インスタンス」ページで、サービス・インタフェースで公開する、アプリケーション・モジュール内の最上位ビュー・インスタンスを選択します。
最上位のビュー・レベル・インスタンスのビュー・オブジェクト・サブタイプは、自動的にサービス対応になります。
このページで、公開したメソッドでサポートされる、使用可能なデータ処理操作も有効にできます(図15-1を参照)。
図15-1 ビュー・インスタンスとCRUD操作の選択
「基本操作」タブで、現在選択されているビュー・インスタンスのデータ処理操作を選択し、「メソッド名」フィールドで、選択したサービスの操作の名称を、サービス・インタフェースで公開する名前に変更します。
標準的なサービス操作の目的は、ビュー・オブジェクトのデータ処理操作を公開することです。サービス操作を起動することで、基になるフレームワーク・オブジェクトで定義したあらゆるビジネス・ロジック(たとえばビジネス・ルールの評価など)が、適用されます。サービス・ビュー・インスタンスでサポートされている操作の詳細は、表15-1を参照してください。
選択可能な検索メソッド操作の場合、検索メソッドはビュー・オブジェクトの問合せ文で必須バインド変数を参照してはなりません。必須バインド変数は、有効なバインド変数値がなければ問合せの実行ができないようにするものです。サービス・インタフェースは実行時には必須バインド変数を公開しません。このシナリオ用の検索操作の定義の詳細は、「必須バインド変数によってフィルタされる宣言的検索操作の公開方法」を参照してください。
宣言的検索操作を公開するには、「ビュー基準の検索操作」タブを選択し、「ビュー基準の追加」アイコンをクリックします。
カスタム検索操作を定義して、事前に定義された問合せの実行をサービスにサポートさせることができます。名前付きビュー基準の定義の詳細は、「名前付きビュー基準の処理」を参照してください。
注意:
サービス・インタフェースの検索操作は、プロジェクトで定義された特定のビュー基準に基づいています。したがって、ビュー基準のバインド変数が対応する検索操作メソッドのパラメータと一致しなければなりません。検索操作を定義しサービス・インタフェースを生成した後、バインド変数の数や順番を変更すると、対応するメソッドが実行時に実行されなくなります。したがって基にあるビュー基準を変更したら、サービス・インタフェースを生成しなおす必要があります。
「ビュー基準検索操作の構成」ダイアログで、検索操作用の名前付きビュー基準を選択します。
このダイアログには、参照先のビュー・オブジェクトが公開しているビュー基準のリストが表示されます。たとえば、OrdersView
はオーダーIDを指定するバインド変数OrdId
を使用して、OrdersViewCriteria
を定義しています(図15-2を参照)。
図15-2 名前付きビュー基準に基づく専用検索メソッド
ビュー基準でバインド変数が使用されている場合、XML名をダブルクリックして、XML定義内でそのサービスが表示される名前をカスタマイズできます。
「次」をクリックして、サービス・ビュー・インスタンスによって公開されるカスタム・メソッドを確認します。
「終了」をクリックします。
JDeveloperはサービス・インタフェース・クラスを生成し、選択したすべてのビュー・インスタンス・オプションを有効にします(図15-3を参照)。
サービス対応アプリケーション・モジュール用に生成されたファイルは変更しないでください。生成されたファイルにより、サービス・インタフェースに必要なメソッドが実装されます。この例外となるのは、サービス実装クラスにJava注釈を追加する必要があるユースケースです。たとえば、サービス・インタフェース実装クラスに注釈を追加することにより、「SOAPクライアントによるアクセス用にADF Webサービスを保護する方法」で説明しているように、セキュリティ・ポリシーを追加できます。
次の種類のファイルが生成され、「アプリケーション」ウィンドウの「プロジェクト」パネルで、アプリケーション・モジュールの「serviceinterface」ノードの下に表示されます(図15-4を参照)。
Webサービス・インタフェース(例: ServiceAppModuleService.java
)
Webサービス・スキーマ・ファイル(例: ServiceAppModuleService.xsd
)
Webサービス定義ファイル(例: ServiceAppModuleService.wsdl
)
Webサービス実装クラス(例: ServiceAppModuleServiceImpl.java
)
図15-4 アプリケーション・モジュールの下に表示されるサービス・インタフェース・ファイル
さらに、ADFビジネス・コンポーネント・サービスを初めて作成すると、connections.xml
ファイルが作成されます。このファイルは、Webサービス・クライアント(コンシューミング・アプリケーション)のみで使用されますが、便宜的にサービス対応アプリケーションも一緒に生成されます。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードの下に表示されます。
Webサービス・インタフェースはWebサービス仕様(JSR-181)で指定されたメタデータの注釈を使用して、インタフェースをWebサービスとして公開する方法を指定します。この例は、SummitADF_Examples
ワークスペースのoracle.summit.model.amservice
パッケージ内のServiceAppModule
アプリケーション・モジュールのWebサービス・インタフェース・クラスである、ServiceAppModuleService.java
の一部を示しています。
package oracle.summit.model.amservice.common.serviceinterface; ... import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.soap.SOAPBinding; ... import oracle.summit.model.amservice.common.CustomerViewSDO; import oracle.summit.model.amservice.common.OrderViewSDO; ... import oracle.webservices.annotations.PortableWebService; import oracle.webservices.annotations.SDODatabinding; ... @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED, style=SOAPBinding.Style.DOCUMENT) @PortableWebService(targetNamespace="http://www.globalcompany.com/ServiceAppModuleService", name="ServiceAppModuleService", wsdlLocation= "oracle/summit/model/amservice/common/serviceinterface/ServiceAppModuleService.wsdl") @SDODatabinding(schemaLocation= "oracle/summit/model/amservice/common/serviceinterface/ServiceAppModuleService.xsd") public interface ServiceAppModuleService { public static final String NAME = ("http://www.globalcompany.com/ServiceAppModuleService") @WebMethod(action="www.globalcompany.example.com/createCustomersView", operationName="createCustomersView") @RequestWrapper(targetNamespace="www.globalcompany.example.com/types/", localName="createCustomersView") @ResponseWrapper(targetNamespace="www.globalcompany.example.com/types/", localName="createCustomersViewResponse") @WebResult(name="result") CustomersViewSDO createCustomersView(@WebParam(mode = WebParam.Mode.IN, name="customerView") CustomersViewSDO customersView) throws ServiceException; ... }
Webサービス・スキーマ・ファイルはWebサービス・スキーマを示すXMLスキーマ・ファイルです(図15-5を参照)。
Webサービス定義ファイルは、Web Service Definition Language (WSDL)仕様に準拠したXML構造化ドキュメント・ファイルで、生成されたWebサービスをエンドポイント、すなわちポートの集合として記述します。ポートは、ネットワーク・アドレスを再利用可能なバインドに関連付けることで定義されます。Webサービスに接続したクライアント・アプリケーションはWSDLを読み取り、サーバー上で提供されている機能を判断します。WSDLはサービス自体のエンドポイントも指定しており、デプロイ済のサービスの検索およびテストに使用できます。
図15-6は、WSDLビジュアル・エディタ内でServiceAppModule
アプリケーション・モジュール用に生成されたWebサービス用のWSDLを示しています。「ソース」タブを選択すると、WSDLをXMLドキュメントとして表示できます。
サービス実装クラスとは、Webサービス・インタフェースを実装し、ADFビジネス・コンポーネントの汎用的なサービス実装であるoracle.jbo.server.svc.ServiceImpl
クラスを拡張する、EJB 3.0ステートレス・セッションBeanです。次の例は、SummitADF_Examples
ワークスペースのoracle.summit.model.amservice
パッケージ内のServiceAppModule
アプリケーション・モジュールのサービス実装クラスである、ServiceAppModuleServiceImpl.java
の一部を示しています。
package oracle.summit.model.amservice.server.serviceinterface; ... import oracle.summit.model.amservice.common.CustomersViewSDO; import oracle.summit.model.amservice.common.OrdersViewSDO; import oracle.summit.model.amservice.common.serviceinterface.ServiceAppModuleService; ... import oracle.webservices.annotations.PortableWebService; @Interceptors({ ServiceContextInterceptor.class }) @Stateless(name="oracle.summit.model.amservice.common.ServiceAppModuleServiceBean", mappedName="ServiceAppModuleServiceBean") @Remote(ServiceAppModuleService.class) @PortableWebService(targetNamespace="http://www.globalcompany.com/ServiceAppModuleService", serviceName="ServiceAppModuleService", portName="ServiceAppModuleServiceSoapHttpPort", endpointInterface="oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService") public class ServiceAppModuleServiceImpl extends ServiceImpl implements ServiceAppModuleService { ... public CustomersViewSDO createCustomersView(CustomersViewSDO customersView) throws ServiceException { return (CustomersViewSDO) create(customersView, "CustomersView"); } public CustomersViewSDO updateCustomersView(CustomersViewSDO customersView) throws ServiceException { return (CustomersViewSDO) update(customersView, "CustomersView"); } ... }
connections.xml
ファイルを使用すると、Webサービス・クライアントでファクトリ・クラスoracle.jbo.client.svc.ServiceFactory
を使用してサービスを検索できます。ADFビジネス・コンポーネント・サービス・ファクトリは、サービス・クライアントによるサービス検索を可能にするメカニズムです。サービス・ファクトリでは、ADF接続アーキテクチャとconnections.xml
ファイルによって、サービス・エンドポイントの場所を管理します。ADFビジネス・コンポーネント・サービスを初めて作成すると、connections.xml
ファイルが作成されます。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードの下に表示されます。
次の例は、ADFビジネス・コンポーネント・サービスを初めて作成した際にJDeveloperによって作成される、最初のconnections.xml
エントリを示しています。
<Reference name="{http://www.globalcompany.com}ServiceAppModuleService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.summit.model.amservice.common.serviceinterface. ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>ADFBC</Contents> </StringRefAddr> <StringRefAddr addrType="jndiName"> <Contents>ServiceAppModuleServiceBean#oracle.summit.model.amservice. common.serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaName"> <Contents>ServiceAppModuleService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/summit/model/amservice/common/ serviceinterface/</Contents> </StringRefAddr> </RefAddresses> </Reference>
モデル・プロジェクトがベース・ビュー・オブジェクトを拡張するサブタイプ・ビュー・オブジェクトを定義している場合、生成されたSDOサービス・インタフェースは、ベース・ビュー・オブジェクトに対しては厳密に型指定されますが、多相サブタイプに対しては異なります。たとえば、SalespersonViewEx
がSEmpView
を拡張し、属性CommissionPct
を追加してサブタイプを定義すると想定します。サービス対応ビュー・インスタンス用のサービス・インタフェースを生成する場合、図15-7に示すように、「アプリケーション」ウィンドウに、サービス・インタフェースとサービス・オブジェクトが表示されます。
注意:
ベース・ビュー・オブジェクトとサブタイプ・ビュー・オブジェクトを定義するADFモデル・プロジェクトからSDOサービス・インタフェースを生成した後、生成されたサービス・スキーマ定義は、ベース・ビュー・オブジェクトに対しては厳密に型指定されますが、多相サブタイプに対しては異なります。このため、多相サブタイプ・ビュー・オブジェクトにアクセスする必要があるWebサービス・クライアントは、「コンシューミング・アプリケーションでの多相コレクションへのアクセス」で説明されているアプローチを使用します。
多相サブタイプは、アプリケーション・モジュール・データ・モデルで、ベース・サービス対応ビュー・インスタンスへのインポートとして指定されるため、JDeveloperはベース・サービス・オブジェクトからサブタイプ・サービス・オブジェクトを自動的に生成します。次の例は、追加の属性CommissionPct
が定義されたSalespsersonViewExSDO.xsd
サブタイプ・スキーマ定義を示しています。サブタイプ・スキーマは、ベース・サービス・オブジェクトSEmpViewSDO
の属性を含みます。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="/oracle/model/polymorphicvo/views/common/" xmlns="/oracle/model/polymorphicvo/views/common/" elementFormDefault="qualified"> <xsd:include schemaLocation="SEmpViewSDO.xsd"/> <xsd:complexType name="SalespersonViewExSDO"> <xsd:annotation> <xsd:appinfo source="http://xmlns.oracle.com/adf/svc/metadata/"> <key xmlns="http://xmlns.oracle.com/adf/svc/metadata/"> <attribute>Id</attribute> </key> </xsd:appinfo> </xsd:annotation> <xsd:complexContent> <xsd:extension base="SEmpViewSDO"> <xsd:sequence> <xsd:element name="CommissionPct" type="xsd:decimal" minOccurs="0" nillable="true"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name="salespersonViewExSDO" type="SalespersonViewExSDO"/> </xsd:schema>
生成されたサービス・インタフェースは、XSD <import>
要素を使用して、多相サブタイプを公開します。次の例は、SalespersonViewExSDO
サブタイプのインポート定義を含むサービス・インタフェースXSD AppModuleService.xsd
を示しています。
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/apps/hr/service/types/" xmlns:tns="http://xmlns.oracle.com/apps/hr/service/types/" xmlns:ns0="/oracle/model/polymorphicvo/views/common/" xmlns:ns1="http://xmlns.oracle.com/adf/svc/types/"> <import namespace="http://xmlns.oracle.com/adf/svc/types/" schemaLocation="classpath:/META-INF/wsdl/BC4JService.xsd"/> <import namespace="/oracle/model/polymorphicvo/views/common/" schemaLocation="../../../views/common/SalespersonViewExSDO.xsd"/> <import namespace="/oracle/model/polymorphicvo/views/common/" schemaLocation="../../../views/common/SDeptViewSDO.xsd"/> <import namespace="/oracle/model/polymorphicvo/views/common/" schemaLocation="../../../views/common/SEmpViewSDO.xsd"/>
図15-8は、Webサービス・スキーマが、各種の厳密に型指定されたサービス・オブジェクトと、多相サブタイプSalespersonViewExSDO
用のインポート定義を表す方法を示しています。
アプリケーション・モジュールに対して、クライアント・インタフェースとサービス・インタフェースという2種類のインタフェースを定義できます。クライアント・インタフェースは、ADFモデルがUIクライアント用に使用します。サービス・インタフェースはアプリケーションの統合用で、外部のWebサービスまたはその他のアプリケーション・サービスによって使用されます(プログラミングによって、またはサービス対応エンティティ機能を使用して自動的に)。
アプリケーション・モジュールではインタフェースをまったくサポートしないことも、クライアント・インタフェースまたはサービス・インタフェースのいずれかだけをサポートすることも、両方を組み合せてサポートすることもできます。ただし、それぞれのインタフェース用に定義するカスタム・メソッドのパラメータや戻り値としてサポートされているデータ型は、2種類のインタフェースで異なっている点に注意してください。クライアント・インタフェースでサポートされている型の詳細は、「クライアント・インタフェースのメソッド・シグネチャに関する必知事項」を参照してください。
サービス・インタフェースは、クライアント・インタフェースよりも限定的なカスタム・メソッド・パラメータと戻り値をサポートしています(次に限定されている)。
Javaプリミティブ・タイプとそのオブジェクト・ラッパー型(int
、Integer
、Long
など)
java.lang.String
java.math.BigDecimal
java.math.BigInteger
java.sql.Date
java.sql.Time
java.sql.Timestamp
java.util.Date
oracle.jbo.AttributeList
oracle.jbo.domain.BlobDomain
oracle.jbo.domain.Char
oracle.jbo.domain.ClobDomain
oracle.jbo.domain.DBSequence
oracle.jbo.domain.Date
oracle.jbo.domain.NClobDomain
oracle.jbo.domain.Number
oracle.jbo.domain.Timestamp
oracle.jbo.domain.TimestampLTZ
oracle.jbo.domain.TimestampTZ
oracle.jbo.server.ViewRowImpl
または任意のサブタイプ
java.util.List<
aType
>
(aType
は、Javaプリミティブ・タイプなど、サービス・インタフェースでサポートされている任意のデータ型)
注意: サービス・インタフェースは特にJava Map
コレクションをサポートしていません。つまり、型の異なるオブジェクトのコレクションを返すことはできません。ただし、コレクションはビュー行属性には限定されません。戻り型は、サービス・インタフェースでサポートされている任意のデータ型のリストとして定義できます。たとえば、List<DataObject>
、List<AttributeList>
およびList<String>
はすべて有効な型です。
クライアント開発者が属性リストを使用して、カスタム操作を実行することで、カスタム・メソッドの実行前にフレームワークを使用しなくてもよくする場合は、AttributeList
の型を戻すカスタム・メソッドを定義できます。あるいは、クライアント開発者がフレームワークを使用して行を管理(作成、検索および移入)する場合は、かわりにViewRowImpl
またはList<ViewRowImpl>
を戻すカスタム・メソッドを定義します。したがって、メソッド・シグネチャでデータ型としてViewRowImpl
またはList<ViewRowImpl>
が定義されている場合は、アプリケーションは自動的に次を行います。
主キー、代替キーのいずれかまたは両方で、対応するビュー・オブジェクト・インスタンス内の行を検索
行が検出されない場合は、新しい行を作成
検出された行または新規行に属性の変更を適用
メソッド・シグネチャでAttributeList
のデータ型が定義されている場合は自動動作は行われず、カスタム・メソッドで実行されるアクションおよび変更されるデータは、カスタム・メソッドのコードに限定されます。
ビュー・オブジェクト行検索を作成すると、公開されるサービス・ビュー・インスタンスのサービス操作は、行検索により定義されるキー以外の属性を使用した行の参照をサポートします。たとえば、サービスで行検索を起動して、従業員ID (行キー属性)のかわりに従業員の電子メール・アドレスを使用して従業員を検索できます。行検索がビュー・オブジェクトの非キー属性で定義されていて、エンド・ユーザーがこの属性の値をWebサービス・ペイロードで指定する場合、サービスは自動的に行検索を起動して一致する行を特定します。電子メール・アドレスが行検索の唯一の必須の値である場合は、サービスの更新操作により、エンド・ユーザーは電子メール・アドレスでのみ識別される従業員のレコードを更新できます。サービス・ビュー・インスタンスで使用するための行検索の定義の詳細は、「行検索の使用」を参照してください。
アプリケーション・モジュール用の概要エディタを使用してWebサービス・インタフェースを有効にすることで、JDeveloperは親のビュー・インスタンス選択をService Data Object (SDO)コンポーネントとして自動的に有効化します。各ビュー・インスタンス用に生成されたSDOコンポーネントは同じネームスペースを参照し、警告のサポートの有無など、同じオプション設定で構成されます。概要エディタの「Java」ページを使用して、既存のサービス対応ビュー・オブジェクトのSDO定義をカスタマイズできます。「Java」ページを使用して、サービス・インタフェースにまだ追加されていなかったビュー・オブジェクトをサービス対応にすることもできます。たとえば、マスター/ディテール関係でマスターとなる親ビュー・オブジェクトを選択しても、子ビュー・オブジェクトは自動的にサービス対応となりません。子ビュー・オブジェクトの概要エディタで「Java」ページを使用して、サービス・インタフェースに個別に追加できます。
ビュー・オブジェクトの概要エディタで「Java」ページを使用して、ビュー・オブジェクトのSDO名とネームスペースを構成するか、子ビュー・オブジェクトを個別に選択してサービス対応にします。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。
「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従って、アプリケーション・モジュールのサービス・インタフェースを有効にします。
オプションで、JDeveloperプリファレンスを設定して、生成されるSDOクラス名のデフォルト接尾辞の指定、サービス共通のインタフェースとクラスが入るサブパッケージの変更、および生成されるSDOスキーマとWebサービスのデフォルトのネームスペース接頭辞の設定を行います。「ADF Webサービス・インタフェース生成用プリファレンスの設定方法」を参照してください。
ビュー・オブジェクトのSDO名とネームスペースを設定する手順:
ビュー・オブジェクトの概要エディタを使用して、サービス対応ビュー・オブジェクトのSDOコンポーネント定義をカスタマイズできます。デフォルトでは、サービス対応ビュー・オブジェクトはSDOプロパティとして公開されます。ビュー・オブジェクト定義をカスタマイズすることで、サービス・インタフェースから個別のSDOプロパティを除外できます。数値を定義するSDOプロパティの場合は、2つのプロパティを関連付けて、サービス・インタフェースに単一の複合型として表示させることができます。たとえば、通貨または測定単位を定義する1つのプロパティを、数値を表示する別なプロパティに関連付けることができます。現在サポートされているのは、AmountType
(通貨コード)およびMeasureType
(測定単位)の複合サービス型だけです。
アプリケーション・モジュール用の概要エディタを使用してWebサービス・インタフェースを有効にすることで、JDeveloperは親のビュー・インスタンス選択をSDOコンポーネントとして自動的に有効化します。さらに、子ビュー・オブジェクトを個別に選択してサービス対応とし、SDOコンポーネントを生成できます。デフォルトでは、生成されたSDOコンポーネントは、基本ビュー・オブジェクト定義のすべての属性をSDOプロパティとして公開します。サービス・インタフェースにSDOプロパティとして戻させたくない属性は、非表示にできます。
概要エディタの「属性」ページを使用して、サービス・インタフェースから除外するビュー・オブジェクト属性を選択します。 次に、ビュー・オブジェクトの概要エディタの「詳細」タブを使用して、選択した属性をSDOコンポーネントで非表示にします。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。
「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。
サービス対応ビュー・オブジェクトからSDOプロパティを除外する手順:
ビュー・オブジェクトをサービス対応にすると、JDeveloperは基になっているビュー・オブジェクトのデータ型に対応するXSD定義済のサービス・タイプとして、SDOプロパティを自動的に公開します。数値を定義する属性の場合は、次のいずれかの事前定義済サービス・タイプを使用して関係のあるプロパティに関連付けるように、SDOプロパティのサービス・タイプを変更できます。
AmountType
サービス・タイプは、通貨コードを定義する任意のプロパティ用です。
MeasureType
サービス・タイプは、測定単位を定義する任意のプロパティ用です。
SDOプロパティのサービス・タイプをこのいずれかの複合型に変更すると、サービス・インタフェースが2つのプロパティを一緒に関連付け、単一のXML要素として戻します。SDOコンポーネントの両方のプロパティを、基本サービス対応ビュー・オブジェクトの属性で定義しておく必要があります。
たとえば、ビュー・オブジェクトでOrderTotal
属性およびCurrencyCode
属性を定義し、対象の国での通貨コードを指定すると仮定します。デフォルトでは、サービス・インタフェースはこれらの属性をSDOプロパティとして公開し、各プロパティを個別のXML要素として戻します。
<OrderTotal>100.00</Price> <CurrencyCode>USD</CurrencyCode>
OrderTotal
プロパティの型を(XSDファイルがこのプロパティをdecimal
型として定義していると仮定)から複合型AmountType
に変更し、CurrencyCode
プロパティを関連付けた場合、サービス・インタフェースはそれらを単一のXML要素として戻します。
<OrderTotal CurrencyCode="USD">123.00</OrderTotal>
また、「アプリケーション・モジュールでプロキシ・クラスを使用したWebサービス・メソッドのコール」で説明しているように、Webサービス・プロキシを生成すると、2つの値はクラスで1つのオブジェクトとして扱われます。
AmountType price; ... price.setValue(123.00); price.setCurrencyCode("USD");
概要エディタの「属性」ページを使用して、カスタマイズするサービス・タイプのビュー・オブジェクト属性を選択します。 概要エディタの「属性」ページから表示される「属性の編集」ダイアログを使用して、選択した属性のSDOプロパティを関連付け、事前定義済の複合サービス・タイプを選択します。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。
「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。
サービス対応ビュー・オブジェクト内のSDOプロパティを関連付ける手順:
データ・モデルで親と子のビュー・オブジェクト間のマスター/ディテール関係を定義した場合、マスター・ビュー・オブジェクトに対して有効化するサービス操作が、ディテール・ビュー・オブジェクトでは自動的に実行されない場合があります。デフォルトでは、ディテール・ビュー・オブジェクトに対するポスト操作は、マスター・ビュー・オブジェクトのプライマリ関連元エンティティ・オブジェクトがディテール・ビュー・オブジェクトのプライマリ関連先エンティティ・オブジェクトで構成されている場合にのみサポートされます。このマスター/ディテール関係はコンポジット・アソシエーションとして知られ、「コンポジット・アソシエーションに関する必知事項」で説明するように、関連元エンティティ・オブジェクトにネストされた論理的部分として関連先エンティティ・オブジェクトが含まれる場合にJDeveloperで作成されます。
親とともに子の詳細をポストする、作成、マージ、更新および処理メソッドをサポートするには、次のいずれかのシナリオに従ってビュー・リンクを作成し、マスター/ディテール関係を作成する必要があります。
ビュー・リンクがコンポジット・アソシエーションを使用しており、ディテール・ビュー・オブジェクトに対するポスト操作がデフォルトでサポートされる場合。
ビュー・リンクがアソシエーションに基づいており、アソシエーションにリンク先アクセッサが生成されており、アソシエーションにカスタム・プロパティSERVICE_PROCESS_CHILDREN=true
が定義されている場合。
ビュー・リンクはアソシエーションに基づいていないが、カスタム・プロパティSERVICE_PROCESS_CHILDREN=true
が定義されている場合。
カスタム・プロパティは、ビュー・リンクが定義された任意のビュー・オブジェクトで、コンポジット・アソシエーションを使用せずにネストされた処理をサポートできる便利な方法です。概要エディタでSERVICE_PROCESS_CHILDREN
を、ビュー・リンクまたはビュー・リンクのアソシエーション(存在する場合)のカスタム・プロパティとして定義できます。
親と一緒に子の詳細も入手する取得および検索メソッドをサポートするには、マスターおよびディテール・ビュー・オブジェクト間のビュー・リンクでリンク先アクセッサを生成しておく必要があります。リンク先アクセッサでにより、マスターから詳細なビュー・オブジェクトまでの階層が通過できます。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
ビュー・リンクまたはエンティティ・アソシエーションを使用したマスター・ディテール関係の定義方法を理解しておくと、役立つ場合があります。
ビュー・リンクの詳細は、「マスター/ディテール階層における複数表の使用」を参照してください。
アソシエーションの詳細は、「アソシエーションの作成と構成」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
該当するビュー・オブジェクトを作成し、「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従い、マスター/ディテール階層の子ビュー・オブジェクトをサービス対応にします。
ビュー・リンクがアソシエーションに基づいていない場合は、概要エディタでビュー・リンクを開き、「関係」ページを表示して、そのビュー・リンクのリンク先アクセッサがあることを確認します。アクセッサを生成し、「関係」ページに表示させるには、「アクセッサの編集」ボタンをクリックし、「ビュー・リンク」ダイアログ内でリンク先アクセッサに対してビュー・オブジェクトでアクセッサを作成を選択します。
ビュー・リンクがアソシエーションに基づいている場合は、アソシエーションのリンク先のエンティティ・オブジェクトに対して、リンク先アクセッサが存在している必要があります。リンク先アクセッサを作成するには、アソシエーションの概要エディタの「関連」ページを使用します。
マスター/ディテール階層でのネスト処理のサポート手順:
SDOクラスを作成すると、次のファイルが生成され、「アプリケーション」ウィンドウ内の所有ビュー・オブジェクトの下に表示されます。
サービス・データ・オブジェクト・インタフェース
サービス・データ・オブジェクト・クラス
サービス・データ・スキーマ・ファイル
サービス・データ・オブジェクト結果クラスとインタフェースは、「Javaオプションの選択」ダイアログで「警告のサポート」を有効化すると生成されます。
サービス対応ビュー・オブジェクト用に生成されたファイルは変更しないでください。生成されたファイルにより、ビュー・オブジェクトのSDOインタフェースに必要なメソッドが実装されます。
次の例に示すように、ビュー・オブジェクトSDOインタフェースには、SDOプロパティに対して強く型付けされたアクセッサが含まれています。
package oracle.summit.model.amservice.common; public interface OrdersViewSDO extends java.io.Serializable { public java.math.Integer getId(); public void setId(java.lang.Integer value); ...}
ビュー・オブジェクトSDOクラスはビュー・オブジェクトSDOインタフェースを実装し、OracleによるSDO仕様の実装であるSDODataObject
クラスを拡張します。
実行時は、SDOオブジェクトのインスタンスはメモリー内の行を示します。
SDOクラスはビュー行クラスと類似しています(次の例を参照)。
package oracle.summit.model.amservice.common; import org.eclipse.persistence.sdo.SDODataObject; public class OrdersViewSDOImpl extends SDODataObject implements OrdersViewSDO { ... }
図15-16に示すようなビュー・オブジェクトSDOスキーマ・ファイルは、SDOスキーマを示すXMLスキーマ・ファイルです。
ビュー・オブジェクトSDO結果クラスは、サービス操作がビュー行のリスト(サービス・データ・オブジェクトでラップされている)およびこれらのビュー行に関連付けられた警告リストを戻せるようにする、コンテナ・オブジェクトです。具体的には、サービスの取得操作で元のオブジェクトが返され、作成、更新、マージ、検索および処理操作で元のオブジェクトのリストと情報メッセージのリストを含むラッパー・オブジェクトが、削除操作では情報メッセージのみが返されます。サービス対応ビュー・オブジェクトの「警告のサポート」オプションを有効にしている場合は、生成されたメソッド結果インタフェースを使用して警告を抽出できます。
次の例に示すようなビュー・オブジェクトSDO結果クラスは、ビュー行クラスに類似しています。
package oracle.summit.model.amservice.common; import oracle.sdo.SDODataObject; public class OrdersViewSDOResultImpl extends oracle.jbo.common.service.types.MethodResultImpl implements OrdersViewResult { public static final int START_PROPERTY_INDEX = oracle.jbo.common.service.types.MethodResultImpl.END_PROPERTY_INDEX + 1; public static final int END_PROPERTY_INDEX = START_PROPERTY_INDEX + 0; public OrdersViewResultImpl() {} public java.util.List getValue() { return getList(START_PROPERTY_INDEX + 0); } public void setValue(java.util.List value) { set(START_PROPERTY_INDEX + 0 , value); } }
ADFサービス・インタフェース・フレームワークにより、宣言的検索操作を公開して、選択したビュー・オブジェクトによる問合せ定義を行えます。ただし、その問合せがバインド変数を使用して問合せ結果をフィルタしている場合は、バインド変数を「必須」および「更新可能」として指定する必要があります。サービス・インタフェースは必須の更新可能バインド変数を公開しないので、この種のビュー・オブジェクトに対して実行する検索操作では、結果が戻されません。
バインド変数を使用して問合せ結果をフィルタする場合は、ビュー基準を使用して、サービス・インタフェース上での検索操作として公開します。作成するビュー基準に基づくサービス・インタフェースの検索操作には、必須バインド変数を指定できます。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
また、バインド変数を使用したビュー・オブジェクト問合せのフィルタ処理方法を理解しておくと役立つ場合があります。詳細は、「バインド変数の使用」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成方法」の説明に従って、該当するアプリケーション・モジュールを作成します。
「名前付きビュー基準を宣言的に作成する方法」の説明に従って、ビュー基準を作成します。「ビュー基準の編集」ダイアログで、基準アイテムをバインド変数として設定し、「検証」フィールドを「必須」に設定します。このような選択によって、有効な値がなければ問合せが実行されなくなります。
必須バインド変数のあるビュー基準に対して検索操作を公開する手順:
ビュー基準に依存する宣言的検索操作を公開するかわりに、データ・モデル・プロジェクトのアプリケーション・モジュール実装クラス内でサービス・メソッドを定義できます。この目的で作成するクラスでは、ビジネス・サービス機能を、実装する単一メソッドにカプセル化できます。カスタム・アプリケーション・モジュールの目的の詳細は、「サービス・メソッドによるアプリケーション・モジュールのカスタマイズ」を参照してください。
次の例は、AppModuleName
Impl.java
ファイルで実装されているカスタム検索メソッドを示しています。このメソッドは、バインド変数を設定し、ビュー・オブジェクト・インスタンス問合せを行います。ビュー・オブジェクト・インスタンス上でsetNamedWhereClauseParam()
を使用して、バインド変数を設定します。問合せ実行前に、検索メソッドが前方のみモードでビュー・オブジェクトを設定し、検索メソッドが繰り返し処理するビュー行のキャッシングを行わないようにします。
public class AppModuleImpl extends ApplicationModuleImpl { public List<ViewRowImpl> findProducts(String location) { List<ViewRowImpl> result = new ArrayList<ViewRowImpl>(); ViewObjectImpl vo = getProductsView1(); vo.setNamedWhereClauseParam("TheLocation", location); vo.setForwardOnly(true); vo.executeQuery(); while (vo.hasNext()) { result.add((ViewRowImpl)vo.next()); } return result; } }
始める前に:
SDOフレームワークによって、サービス対応ビュー・オブジェクトがどのようにサポートされ、Webサービス・クライアントのデータ行アクセスやサービス操作がどのように有効化されるかについて、理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
また、バインド変数を使用したビュー・オブジェクト問合せのフィルタ処理方法を理解しておくと役立つ場合があります。詳細は、「バインド変数の使用」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールのカスタム・クラスの生成方法」の説明に従い、カスタム・アプリケーション・モジュール・クラスを作成します。
「実行時に名前付きバインド変数を含むWHERE句を追加する方法」の説明に従い、問合せ結果をプログラム的にフィルタし、必要なバインド変数を設定するための、カスタム検索メソッドを作成します。
必須バインド変数を設定する検索メソッドの公開手順:
デフォルトでは、Webサービスは同期サービス・メソッドをサポートしています。これによってクライアント・アプリケーションを強制的に起動して待機させ、レスポンスが返されるまで作業を続行できません。レスポンスが即座に返る場合、このWebサービス呼出しの方法が一般的です。しかし、リクエスト処理が遅延する場合もあるため、クライアント・アプリケーションは先に処理を続行し、後でレスポンスを処理するほうが効率的なことも少なくありません。
始める前に:
SDOフレームワークによって、サービス対応ビュー・オブジェクトがどのようにサポートされ、Webサービス・クライアントのデータ行アクセスやサービス操作がどのように有効化されるかについて、理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
また、非同期のリクエストとレスポンスを使用したWebサービスの起動について理解しておくと役立つ場合があります。詳細は、『Oracle Infrastructure Webサービスの開発』の「非同期Webサービスの開発」、非同期Webサービスの概要に関する項を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
非同期Webサービス・メソッドの公開手順:
JDeveloperはWebサービスのサービス・インタフェースを生成し、非同期サービス操作を有効にします。次の例に示すように、クラスの注釈@AsyncWebService
はEmpService
サービス・インタフェースを非同期と宣言し、インタフェース内の各同期メソッドに対して、サービスが同じメソッド名にAsync
が付加された非同期メソッドを公開します。
同じインタフェース内で同期および非同期の両方のメソッドを公開することで、Webサービス・クライアント開発者は、Webサービス・プロキシによる操作(適切な名前が付いたメソッドのコール)の起動方法を決定できます。開発者は、oracle.jbo.client.svc.ServiceFactory.getServiceProxy()
メソッドから戻されるADFビジネス・コンポーネント・サービス・プロキシで非同期メソッドを起動してはならない点に注意してください。
この例では、EmpService
サービスが非同期操作用に有効化されているため、インタフェースはgetEmployeeAsync()
メソッドを公開して、@CallbackMethod(exclude=true)
メソッド注釈を使用してデフォルト操作をオーバーライドし、getEmployee()
メソッドを同期として宣言しています(非同期サービス内のメソッドを同期として宣言しているのは、exclude=true
の部分)。クラス注釈@AsyncWebService
がある場合は、非同期サービス・メソッドの宣言に注釈は不要です。
import javax.xml.ws.Action; ... import oracle.webservices.annotations.async.AsyncWebService; import oracle.webservices.annotations.async.CallbackMethod; @SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.WRAPPED, style=SOAPBinding.Style.DOCUMENT) @PortableWebService(targetNamespace="http://xmlns.example.com/apps/service/", name="EmpService", wsdlLocation="oracle/apps/service/EmpService.wsdl") @SDODatabinding(schemaLocation="oracle/apps/service/EmpService.xsd") @AsyncWebService public interface EmpService { ... @WebMethod(action="http://xmlns.example.com/apps/service/getEmployee", operationName="getEmployee") @RequestWrapper(targetNamespace="http://xmlns.example.com/apps/service/types/", localName="getEmployee") @ResponseWrapper(targetNamespace="http://xmlns.example.com/apps/service/types/", localName="getEmployeeResponse") @WebResult(name="result") @CallbackMethod(exclude=true) Emp getEmployee(@WebParam(mode = WebParam.Mode.IN, name="empno") Integer empno) throws ServiceException; @WebMethod(action="http://xmlns.example.com/apps/service/getEmployeeAsync", operationName="getEmployeeAsync") @RequestWrapper(targetNamespace="http://xmlns.example.com/apps/service/types/", localName="getEmployeeAsync") @ResponseWrapper(targetNamespace="http://xmlns.example.com/apps/service/types/", localName="getEmployeeAsyncResponse") @WebResult(name="result") @Action(input="http://xmlns.example.com/apps/service/getEmployeeAsync", output="http://xmlns.example.com/apps/service/getEmployeeAsyncResponse") Emp getEmployeeAsync(@WebParam(mode = WebParam.Mode.IN, name="empno") Integer empno); }
重複した非同期メソッドはサービス実装で同期メソッドに移譲されます(次の例を参照)。これにより、基になっているビジネス・ロジックが、同期または非同期として宣言された操作と同一になります。
... import oracle.webservices.annotations.async.AsyncWebService; @Stateless(name="oracle.apps.service.EmpServiceBean", mappedName="EmpServiceBean") @Remote(EmpService.class) @PortableWebService(targetNamespace="http://xmlns.oracle.com/apps/service/", serviceName="EmpService", portName="EmpServiceSoapHttpPort", endpointInterface="oracle.apps.service.EmpService") @Interceptors(ServiceContextInterceptor.class) @AsyncWebService public class EmpServiceImpl extends ServiceImpl implements EmpService { ... /** * getEmployee: generated method. Do not modify. */ public Emp getEmployee(Integer empno) throws ServiceException { return (Emp) get(new Object[] { empno }, "Employee", Emp.class); } /** * getEmployeeAsync: generated method. Do not modify. */ public Emp getEmployeeAsync(Integer empno) throws ServiceException { return getEmployee(empno); } }
クライアントから見ると、非同期コールは一方向の2つのメッセージ交換から構成されます。図15-12のシーケンス図は、次のフローを示しています。
クライアントが非同期操作をコールします。(図中のステップ1。)
非同期サービスはリクエストを受信し、リクエストを実際には処理せずに、HTTP確認をクライアントに戻します。(図中のステップ2。)
最終的には非同期操作が完了し、サーバー側のモジュールがレスポンスをクライアント側に送信します。(図中のステップ3。)
クライアント側でレスポンスを受信するには、クライアントにサーブレットまたはWebサービスなど、なんらかのHTTPリスナーが必要です。
クライアント側で生成されたWebサービス(コールバック・サービス)が、非同期レスポンスを受信します。(図中のステップ4。)
ステップ3ではサーバー側のモジュールが、コールバック・サービスに対してクライアントのように機能するので、コールバック・クライアントと呼ばれます。
図15-12 非同期コール・シーケンス
JDeveloperで生成されたサービスに対しては、追加のコントロールが可能です。JDeveloperプリファレンスを設定して、次のタスクを実行できます。
生成されたSDOクラスの名前のデフォルトの接尾辞の指定
サービス・インタフェースとクラスが存在するデフォルト・サブパッケージの変更
デフォルトのネームスペース接頭辞の設定およびURIから除外するパッケージの名前の指定による、生成されたSDOスキーマおよびWebサービス・ターゲット・ネームスペースのURIの成形。
SDOクラス名接尾辞の設定手順:
メイン・メニューで、「ツール」、「プリファレンス」を選択します。
「プリファレンス」ダイアログで、「ADFビジネス・コンポーネント」を開き、「クラス・ネーミング」を選択します。
「ビュー・オブジェクト」接尾辞リストに、たとえばSDO
のような、SDOの接尾辞を入力します。
生成されたサービス・インタフェースにデフォルト・サブパッケージを設定する手順:
メイン・メニューで、「ツール」、「プリファレンス」を選択します。
「プリファレンス」ダイアログで、「ADFビジネス・コンポーネント」 を展開し、「パッケージ」を選択します。
「クラスに対する関連パッケージの指定」リストで、デフォルト・パッケージ名を指定します。
サービス・インタフェース・パッケージ名を設定するには、「クライアント・インタフェース」に値を入力します。(「サービス・インタフェース」に、クライアント・インタフェースに指定したのと同じパッケージ名が表示されます)。デフォルト・パッケージ名はcommon
です。
「サービス・インタフェース」の「サービス・インタフェース・サブパッケージ」に値を入力します。デフォルトのサブパッケージ名はserviceinterface
です。
たとえば「サービス・インタフェース」にcommon
、「サービス・インタフェース・サブパッケージ」にserviceinterface
(デフォルト)を入力すると、データ・モデル・パッケージoracle.summit.model.amservice
内のデータ・モデル・コンポーネントのサービス・インタフェースが、サブパッケージoracle.summit.model.amservice.common.serviceinterface
に配置されます。
生成されたSDOスキーマおよびサービス・インタフェース・ターゲット・ネームスペースのURIを成形する手順:
表示名は、ユーザー・インタフェースをプログラムで生成し、サービス・ビュー・インスタンスとその属性を正しい識別ラベルとともに表示するために、Webサービス・コンシューミング・アプリケーションをサポートするラベルです。コンシューミング・アプリケーションで実行時にこれらの表示名にアクセスできるようにするには、「サービス・インタフェースの作成」ウィザードを使用して、組込みメソッドgetDfltObjAttrHints()
をリモート・クライアント・サービス・インタフェースに追加します。このメソッドでは、コンシューミング・アプリケーションの開発者が、サービス・ビュー・インスタンスとその属性に関連付けられた「表示名」UIヒントをプログラムで取得できます。ビュー・オブジェクトの「プロパティ」ウィンドウでUIヒントを定義します。ここでは、各ビュー・インスタンス名と属性名の単一ラベルおよび複数ラベルを定義できます。たとえば、図15-13に示すように、OrdersVO
ビュー・オブジェクトのUIヒントをラベルOrder
およびOrders
で定義できます。
始める前に:
次のタスクを完了する必要があります。
getDfltObjAttrHints()
をリモート・クライアント・サービス・インタフェースに定義します。ビュー・インスタンスのUIヒント・ラベルとその属性を設定する手順:
実行時、Webサービス・クライアントはSOAPプロトコルを使用して、アプリケーション・モジュールのサービス対応メソッドを起動します。Oracle Web Service Manager (OWSM)セキュリティ・ポリシーの構成によって、サービスの認証と許可を有効化できます。選択するセキュリティ・ポリシーでは、SOAPクライアント・コールによってSOAPヘッダーの一部として資格証明(SAMLトークン)を提供する必要があります。たとえば受信するSOAPリクエストなどに対するメッセージ保護(整合性および機密保護)を有効化するその他のポリシーも構成できます。
SOAPクライアント用にWebサービスを保護するには:
OWSM認証ポリシーを構成します。
OWSM許可ポリシーを構成します。
認証を有効にして、サービス・インタフェース上のサービス・メソッドへのアクセス前に、ユーザーに資格証明の提供を求めることができます。必要な認証タイプは、OWSM認証ポリシー注釈を使用しているサービス実装で構成します。
権限チェックを有効化し、十分な権限を持つユーザーだけに、サービス・インタフェース上のサービス・メソッド起動を許可できます。権限チェックは、このOWSM許可注釈を使用して、サービス実装クラスで構成します。
binding_permission_authorization_policy
このポリシーは、SOAPバインディング・レベルの認証されたサブジェクトに基づき、リクエストに対して簡単な権限ベースの認可を行います。このポリシーは、サブジェクトに操作を実行する権限があることを保証します。このポリシーは、サブジェクトが作成されている認証ポリシーの後に続ける必要があり、SOAPベースの任意のエンドポイントに添付できます。
権限チェック・ポリシーのかわりに、ロールベースのOWSMセキュリティ・ポリシーのいずれかを構成することもできます。
binding_authorization_denyall_policy
このポリシーは、SOAPバインディング・レベルの認証されたサブジェクトに基づき、リクエストに対して簡単なロールベースの認可を行います。このポリシーは、任意のロールを持つすべてのユーザーを拒否します。サブジェクトが作成されている認証ポリシーの後に続ける必要があり、SOAPベースの任意のエンドポイントに添付できます。
binding_authorization_permitall_policy
このポリシーは、SOAPバインディング・レベルの認証されたサブジェクトに基づき、リクエストに対して簡単なロールベースの認可を行います。このポリシーは、任意のロールを持つすべてのユーザーを許可します。サブジェクトが作成されている認証ポリシーの後に続ける必要があり、SOAPベースの任意のエンドポイントに添付できます。
許可ポリシーの詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のセキュリティ・ポリシー - 認証のみに関する項を参照してください。
ADFサービス・インタフェース・フレームワークには、EJBインターセプタであるServicePermissionCheckInterceptor
も用意されています。これは、oracle/binding_permission_authorization_policy
と同じチェックを実施し、さらにサービスに対するRMI起動にも対応します。サービスが常にSOAPを使用して起動される場合は、OWSMの許可ポリシーoracle/binding_permission_authorization_policy
を添付してください。サービスがRMIを使用しても起動される場合は、EJBインターセプタServicePermissionCheckInterceptor
を添付してください。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
また、OWSMでサポートされる事前定義済認証ポリシーについても理解しておくと役立つ場合があります。詳細は、『Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』のセキュリティ・ポリシー - 認証のみに関する項を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
認証と許可を構成するには:
「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、「serviceinterface」ノードを開いて、サービス実装クラス(AppModule
ServiceImpl.java
ノード)をダブルクリックします。
SummitADF_Examples
ワークスペースのoracle.summit.model.amservice
パッケージ内のServiceAppModule
アプリケーション・モジュールから生成されたWebサービスでは、サービス実装クラスはServiceAppModuleServiceImpl.java
です。
サービスが常にSOAPを使用してのみ起動される(RMIは使用しない)場合は、次の手順に従ってOWSM許可ポリシーを使用する必要があります。
サービス実装クラスのソースで、カーソルを@PortableWebService
注釈上に配置します。
たとえば、ServiceAppModuleServiceImpl.java
では、サービスの注釈が次のように表示されます。
... @PortableWebService( targetNamespace="/oracle/summit/model/amservice/common/", serviceName="ServiceAppModuleService", portName="ServiceAppModuleServiceSoapHttpPort", endpointInterface= "oracle.summit.model...common.serviceinterface.ServiceAppModuleService")
「プロパティ」ウィンドウで、「ポリシー」 セクションを開き、「複数ポリシー」フィールドの横にあるボタンをクリックします。
「プロパティの編集: 複数ポリシー」ダイアログで、目的のセキュリティ・ポリシーを選択し、「OK」をクリックします。
OWSMでサポートされるセキュリティ・ポリシーの詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のセキュリティ・ポリシー - 認証のみに関する項を参照してください。
ソース・ファイルに戻り、注釈@PolicySet
の構成を確認します。
サービス実装クラスに対して定義した@PolicySet
という注釈は、潜在的なクライアントに対するセキュリティ要件を指定します。この例では、注釈に権限チェック許可ポリシー(oracle/binding_permission_authorization_policy
)と認証ポリシーの両方が表示されます。
... @PortableWebService( targetNamespace="/oracle/summit/model/amservice/common/", serviceName="ServiceAppModuleService", portName="ServiceAppModuleServiceSoapHttpPort", endpointInterface= "oracle.summit.model...common.serviceinterface.ServiceAppModuleService") @PolicySet(references = { @PolicyReference(value = "oracle/wss_username_token_service_policy"), @PolicyReference(value = "oracle/binding_permission_authorization_policy") })
サービスがSOAPとRMIを使用して起動される場合は、次の手順に従って、ServicePermissionCheckInterceptor
のみを使用してください(OWSM許可ポリシーを使用する必要はありません)。
ソース・エディタで@Interceptors
注釈にカーソルを置き、ServicePermissionCheckInterceptor.class
を追加して、実行時の権限チェックを有効にします。
... @Interceptors({ ServiceContextInterceptor.class, ServicePermissionCheckInterceptor.class }) @Stateless(name= "oracle.summit.model.amservice.common.ServiceAppModuleServiceBean", mappedName="ServiceAppModuleServiceBean")
サービス実装クラス・ファイルを保存します。
ADF WebサービスはEJBとして実装され、Oracle WebLogic Server上でOracle Web ServiceのPortableWebService
としてデプロイされるので、クライアント・アプリケーションは、RMIプロトコルを使用してアプリケーション・モジュールのサービス対応メソッドを起動できます。
RMIクライアント用にWebサービスを保護するには:
JNDIコンテキスト・プロパティを構成して認証を有効にします。
権限チェックを有効にして、許可ポリシーを構成します。
始める前に:
OWSMでサポートされる事前定義済許可ポリシーについて理解しておくと役立つ場合があります。詳細は、『Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』のセキュリティ・ポリシー - 認証のみに関する項を参照してください。
RMIを使用してADF Webサービスを起動すると、共通のJAASログイン・モジュールによって認証が処理されます。ログイン・モジュールは、コール元のアプリケーションでEJBの当初のJNDIコンテキストの一部として、プリンシパルおよび資格証明を受け取ります。JNDIコンテキスト・プロパティを定義しなかった場合、ログイン・モジュールはコール元の現在のセキュリティ・コンテキストを取得しようとします。
リモートJNDIコンテキスト情報を定義した場合、次の4つのJNDIコンテキスト・プロパティをconnections.xml
ファイルに追加する必要があります。
注意:
Integrated WebLogic Serverを使用してJDeveloperでサービスのテストを行う場合、サービスのデプロイ前に、connections.xml
ファイルで直接JNDIコンテキスト・プロパティを編集できます。ただし、スタンドアロンOracle WebLogic Serverにサービスをデプロイする場合は、Oracle Enterprise Managerを使用してJNDIコンテキスト・プロパティを構成します。
jndiFactoryInitial
はweblogic.jndi.WLInitialContextFactory
に設定する必要があります。
jndiProviderURL
はJNDIプロバイダのURLで、JNDIサーバーの場所を示します。URLはt3://
<hostname>
:
<server port>
という構成でなければなりません。
JDeveloperでサービスをテストし、サービスをIntegrated WebLogic Serverにデプロイする場合は、Integrated WebLogic ServerのJNDIプロバイダのURLにt3://
<hostname>
:7101を指定します。
リモートOracle WebLogic Serverにサービスをデプロイする場合は、t3://localhost:8888
のようなURLを指定します。ここでt3
はOracle WebLogicプロトコル、localhost
はリモートOracle WebLogic Serverインスタンスを実行するホスト名、8888
はポート番号です。
jndiSecurityPrincipal
は、リモートJNDIへのアクセス権のあるプリンシパル(ユーザー名)を指定します。
JDeveloperの統合WebLogic Serverでサービスをテストする場合は、Integrated WebLogic Server上でJNDIサーバーのセキュリティが構成されていないため、このコンテキスト・プロパティは省略する必要があります。
スタンドアロンOracle WebLogic Serverにデプロイすると、ユーザー名をファイルから読み取ることができます。
jndiSecurityCredentials
は、セキュリティ・プリンシパルに使用する資格証明(パスワード)を指定します。
JDeveloperの統合WebLogic Serverでサービスをテストする場合は、Integrated WebLogic Server上でJNDIサーバーのセキュリティが構成されていないため、このコンテキスト・プロパティは省略する必要があります。
サービスをテスト環境内のスタンドアロンOracle WebLogic Serverにデプロイする際は、JNDIプロバイダ用の資格証明をプレーン・テキストで指定できます。たとえば、Oracle WebLogic ServerのJNDIプロバイダにアクセスするための十分な権限を持つ、デフォルト管理者のユーザー名/パスワード資格証明である、weblogic
/weblogic1
を指定できます。
サービスを本番環境にデプロイする場合は、セキュリティの脆弱性を回避するために、プレーン・テキストのパスワードを削除する必要があり、かつ、connections.xml
ファイルには、パスワードを設定せずに<SecureRefAddr addrType="jndiSecurityCredentials"/>
を含める必要があります。スタンドアロンOracle WebLogic Server用のサービス・パスワードを構成するには、Oracleの資格証明ストアに暗号化されたパスワードを保存するOracle Enterprise Managerを使用する必要があります。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
認証処理用にJNDIコンテキスト・プロパティを構成する手順:
権限チェックを有効化し、十分な権限を持つユーザーのみに、サービス・インタフェース上のサービス・メソッド起動を許可できます。権限チェックを有効にするために、ADFサービス・インタフェース・フレームワークはServicePermissionCheckInterceptor
という名前のEJBインターセプタを提供しています。このEJBインターセプタにより、実行時に権限チェックが確実に実行されます。現在、インターセプタはOWSMが許可ポリシーbinding_permission_authorization_policy
に対して実装するものと同じロジックでコード化されています。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「RMIクライアント認証の有効化」の説明に従って、クライアント・アプリケーション(サービスを起動するアプリケーション)のconnections.xml
ファイルで、サービスの認証ポリシーを構成します。
「サービスへのアクセスをテスト・ユーザーに許可する方法」の説明に従って、ユーザーにサービスへのアクセスを許可します。
権限ベースの許可ポリシーを構成するには:
サービスの認可ポリシーを構成後、Oracle Platform Security Services (OPSS)セキュリティ・プロバイダを構成して、サービスにメソッドを起動できるユーザーを指定する必要があります。設計時にjazn-data.xml
構成ファイルを編集して、アプリケーション・ロールの作成と該当するアプリケーション・ロールへの起動権限許可を行うことでこのタスクを実行します。その後サービスをデプロイする際には、ターゲットOracle WebLogic Serverの管理者が、指定したアプリケーション・ロールをエンタープライズ・ユーザーに関連付けます。これによって、サービス・メソッドの起動権利を、そのアプリケーション・ロールのメンバーである任意のユーザーに付与できます。起動権限が付与されていないロール・メンバーであるユーザーは、サービス・メソッドへのアクセスを拒否されます。
Oracle Web Servicesの起動権限は、oracle.wsm.security.WSFunctionPermission
クラスで定義されています。サービスの全メソッドまたは個別のメソッドに対して、定義するアプリケーション・ロールの権限を付与できます。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
また、アプリケーション・ロールとOPSSセキュリティ・プロバイダについても理解しておくと役立つ場合があります。詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』の「Oracle Platform Security Servicesの概要」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「SOAPクライアントによるアクセス用にADF Webサービスを保護する方法」または「RMIクライアントによるアクセス用にADF Webサービスを保護する方法」の説明に従って、サービスの認証および許可ポリシーを構成します。
jazn-data.xml
デプロイメント・ディスクリプタを作成して、OPSSセキュリティ・プロバイダ構成ファイルをプロジェクトに追加します。デプロイメント・ディスクリプタの詳細は、『Oracle JDeveloperによるアプリケーションの開発』の「アプリケーションのデプロイ」を参照してください。
JDeveloper内の「新規ギャラリ」を開いて「一般」を展開し、「デプロイメント・ディスクリプタ」→「Oracleデプロイメント・ディスクリプタ」を選択して、「OK」をクリックします。
「アプリケーション・ロールの作成」の説明に従って、付与対象のアプリケーション・ロールを作成します。
JDeveloperで統合WebLogic Serverを使用してWebサービスをテストするために、「テスト・ユーザーの作成」の説明に従って、アプリケーション・ロールにテスト・ユーザーを追加できます。
jazn-data.xmlファイルでアプリケーション・ロールへのWebサービス権限を付与する手順:
ADFサービス・インタフェースは、Message Transmission Optimization Mechanism (MTOM)を使用して、BlobDomain
/ClobDomain
属性のViewRow
に対して機能するサービス・メソッドでのバイナリ・データ送信処理をサポートしています。これによって、保険金請求書類に画像が必要な場合など、バイナリ・データにXMLメッセージを添付できます。サービス対応アプリケーション・モジュールのSDOデータ・オブジェクトは、BlobDomain
/ClobDomain
をjavax.activation.DataHandler
にマップします。SOAPプロトコルを使用してWebサービスをコールする際、SDOデータ・オブジェクトのマーシャリング/アンマーシャリング中に、これらのDataHandler
プロパティを添付データとして渡すことができます。
SOAPプロトコルのMTOMサポートを有効化するには、@MTOM
という注釈をサービス実装クラス(たとえばServiceAppModuleServiceImpl.java
)に追加し、また、BlobDomain
/ClobDomain
属性を持つビュー行に対してメソッドが機能する必要があります。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
バイナリ・データ添付の送信サポートを有効化する手順:
データベースでCLOB型として定義された大きな文字列データの作業の結果は、文字列データとバイナリ・データ間の変換時に使用する文字エンコーディングです。ClobDomain
属性をサービス・データ・オブジェクトで処理した場合、ADFサービス・インタフェース・フレームワークは属性値をbase64でエンコードされたSDOプロパティにマッピングすることでデータをストリーミングします。このbase64バイナリ・ストリームへのマッピングには、元のデータの文字セットは含まれません。
文字列データとバイナリ・データ間の変換をサポートするために、ADFサービス・インタフェース・フレームワークでは、ビュー・オブジェクトの個々のClobDomain
属性のエンコーディング文字セットを構成できます。または、すべてのClobDomain
属性を同じ文字エンコーディング・スキームを使用して変換する場合は、ビュー・オブジェクト定義のレベルでエンコーディング文字セットを構成できます。
フレームワークでバイナリ・ストリームとClobDomain
属性の文字間の変換が必要な場合は、ビュー・オブジェクトに対して定義したこれらのカスタム・プロパティの値として指定された文字エンコーディングを適用できます。
SERVICE_USE_SERVER_DEFAULT_CHARSET
SERVICE_CLOB_CONVERSION_CHARSET
カスタム・プロパティSERVICE_USE_SERVER_DEFAULT_CHARSET
は、データベースで使用される特定の文字エンコーディングがわからない場合に役立ちます。サーバーJVMの文字セットはロケールに依存するため、サーバーのエンコーディング文字セットをいつデフォルトに設定するかを考慮する必要があります。
ClobDomain
属性の理想的な構成は、カスタム・プロパティSERVICE_CLOB_CONVERSION_CHARSET
および指定する文字エンコーディングに依存します。この構成では、ADFサービス・インタフェース・フレームワークが異なるエンコーディング文字セットを使用して変換しないように、ターゲット・データの文字エンコーディングを検証できることを想定します。
注意:
カスタム・プロパティが文字エンコーディングを構成するようにビュー・オブジェクトに定義されていない場合、実行時に、ADFサービス・インタフェース・フレームワークはデフォルトでUTF-8文字エンコーディング・スキームを使用してClobDomain
データの変換を処理します。UTF-8は、Oracle DatabaseでサポートされるCLOBデータに多言語サポートを提供するUnicodeエンコーディングです。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
@MTOM
注釈をサービス実装クラスに追加してMTOMサポートを有効にし、サービス・メソッドがClobDomain
属性を持つビュー行を操作できるようにします。ビュー・オブジェクトの個々のClobDomain属性の文字エンコーディングを構成する手順:
「アプリケーション」ウィンドウで、ClobDomain属性が含まれているビュー・オブジェクトをダブルクリックします。
概要エディタで、「属性」ナビゲーション・タブをクリックします。
「属性」ページで、「タイプ」列にClobと表示されている属性を選択します。
「カスタム・プロパティ」タブをクリックし、「追加」アイコンをクリックし、ドロップダウン・リストから「変換不能プロパティ」を選択して、「プロパティ」名フィールドに次の事前定義済カスタム・プロパティの1つを入力します。
SERVICE_USE_SERVER_DEFAULT_CHARSET
- JVMの文字エンコーディングをデータの変換に使用する場合。「値」にtrue
と入力します。
SERVICE_CLOB_CONVERSION_CHARSET
- データの文字エンコーディングに対応する既知の文字エンコーディングを指定する場合。「値」に目的の文字エンコーディングを入力します。たとえば、UTF-16
と入力します。値を指定しない場合は、デフォルトのUTF-8が使用されます。
ビュー・オブジェクトのすべてのClobDomain属性の文字エンコーディングを構成する手順:
Integrated WebLogic Serverを使用して、JDeveloperでWebサービスを実行できます。Oracle WebLogic ServerにWebサービスをデプロイして、サービスをテストすることもできます。
Integrated WebLogic Serverを使用した実行とテストの手順:
Webサービスをテストすると、一部のカスタム・メソッドがJava Transaction API (JTA)で設定されたタイムアウト制限を超えていることに気付く場合があります。JTAタイムアウト設定では、サービス・メソッドの実行制限時間をデフォルトでは30秒以内に設定しています。Oracle WebLogic Server管理コンソールを使用して、JTAタイムアウト設定を延長できます。それでもタイムアウト例外を受信する場合や、サービス・インタフェースのカスタム・メソッドの実行に長時間かかることが予想される場合は、ステートレス・セッションBean用のEJBトランザクション属性を指定して、EJBがJTAトランザクションでこれらのメソッドを実行しないようにします。
カスタム・メソッドでタイムアウトが発生しないようにするには、「プロパティ」ウィンドウでそのメソッドに対してTransactionAttributeType.NOT_SUPPORTED
を設定します。次の例に示すように、JDeveloperは注釈@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
を追加して、メソッドを更新します。
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void updateCustomerInterests(List<String> pCategoryIds) throws ServiceException { invokeCustom((Method) _map.get("updateCustomerInterests"), new Object[] { pCategoryIds }, new String[] { null }, false); }
このトランザクション属性が設定されたメソッドはJTAトランザクションでは実行されないため、oracle.jbo.ApplicationModule
and oracle.jbo.Transaction
インタフェースのADFビジネス・コンポーネント・メソッドを使用して各自でトランザクションの制御を行う必要があります。たとえば、次の例に示すように、サービス対応にしたアプリケーション・モジュールの実装クラスのメソッドでは、am.getDBTransaction().commit()
またはrollback()
をコールして、トランザクションを完了する必要があります。
public void updateCustomerInterests(List pCategoryIds) { try { if (pCategoryIds != null && pCategoryIds.size() > 0) { List<Integer> copyOfCategoryIds = (List<Integer>) this.cloneList(pCategoryIds); ViewObject selectedCategories = this.getSelectedCategoriesShuttleList(); RowSetIterator rsi = selectedCategories.createRowSetIterator(null); // remove rows for the current user not in the list of product keys while (rsi.hasNext()) { Row r = rsi.next(); Number interestId = (Number)r.getAttribute("CategoryId"); // existing row is in the list, we're ok, so remove from list. if (copyOfCategoryIds.contains(interestId)) { copyOfCategoryIds.remove(interestId); } // if the existing row is in not list, remove it. else { r.remove(); } } rsi.closeRowSetIterator(); // at this point, add new rows for the keys that are left for (int i =0 ;i < copyOfCategoryIds.size(); i++ ) { Row newRow = selectedCategories.createRow(); selectedCategories.insertRow(newRow); newRow.setAttribute("CategoryId", (String) copyOfCategoryIds.get(i).toString()); } this.getTransaction().commit(); } } catch (JboException e) { this.getTransaction().rollback(); throw e; } }
サービス・インタフェース用に生成した標準サービス・メソッドのデフォルト・トランザクション属性設定は、変更しないでください(表15-1を参照)。標準メソッドは、JTAトランザクション用に設定されたデフォルト実行境界内で実行されます。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
カスタム・メソッドがJTAトランザクションで実行されないようにする手順:
たとえば、サービスのテストの第2段階を実行するために、Oracle WebLogic ServerにWebサービスをデプロイすることができます。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
プロジェクトに標準Webサービス(@WebService
注釈付きのJavaクラスまたはJavaインタフェース)が含まれている場合は、ビジネス・コンポーネントのWebサービスをデプロイする前に、該当Javaクラスから@WebService
注釈を削除する必要があります。標準Webサービスと同じプロジェクトに属するビジネス・コンポーネントのWebサービスをデプロイしようとすると、Oracle WebLogic Server例外エラーが発生してデプロイメントが失敗します。そのため、標準Webサービスは、ADFビジネス・コンポーネント・サービスとは別のプロジェクトに作成する必要があります。
非同期Webサービスを作成した場合は、サービスのデプロイ前に、リクエストおよびレスポンスを格納するためのキューを構成する必要があります。リクエストおよびレスポンス・キューの構成の詳細は、『Oracle Infrastructure Webサービスの開発』の「非同期Webサービスの開発」、リクエストおよびレスポンス・キューの作成に関する項を参照してください。
「SOAPクライアントによるアクセス用にADF Webサービスを保護する方法」の説明に従ってWebサービスの認可を構成した場合は、weblogic-application.xml
ファイルを編集して、アプリケーションIDパラメータを定義します。このファイルは、「アプリケーション」ウィンドウの「アプリケーション・リソース」パネルで、「ディスクリプタ」および「META-INF」ノードの下に表示されます。
次の<application-param>
定義を最初の要素として追加します。
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://www.bea.com/ns/weblogic/weblogic-application.xsd">
<application-param>
<param-name>jps.policystore.applicationid</param-name>
<param-value>ApplicationName</param-value>
</application-param>
...
</weblogic-application>
入力するApplicationName
は、 jazn-data.xml
ポリシー・ストア定義内の名前と一致する必要があります。
<jazn-data>
<policy-store>
<applications>
<application>
<name>ApplicationName</name>
<app-roles>
...
</app-roles>
<jazn-policy>
...
</jazn-policy>
</application>
</applications>
</policy-store>
</jazn-data>
ejb-jar.xml
ファイルを編集して、EJBでのアプリケーション・ロール評価に必要な、次のJpsInterceptor
定義を追加します。このファイルは「アプリケーション」ウィンドウの、Webサービス・プロジェクトの「META-INF」ノードの下にあります。
<?xml version = '1.0' encoding = 'windows-1252'?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/j2ee/ejb-jar_3_0.xsd" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee">
<enterprise-beans>
...
</enterprise-beans>
<interceptors>
<interceptor>
<interceptor-class>
oracle.security.jps.ee.ejb.JpsInterceptor
</interceptor-class>
<env-entry>
<env-entry-name>application.name</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>ApplicationName</env-entry-value>
<injection-target>
<injection-target-class>
oracle.security.jps.ee.ejb.JpsInterceptor
</injection-target-class>
<injection-target-name>
application_name
</injection-target-name>
</injection-target>
</env-entry>
</interceptor>
...
<interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>
oracle.security.jps.ee.ejb.JpsInterceptor
</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
ApplicationName
も、jazn-data.xml
ポリシー・ストア定義内のアプリケーション名と一致する必要がある点に注意してください。
Oracle WebLogic Serverへのデプロイ手順:
Oracle WebLogic Serverにアプリケーション・サーバーの接続を作成する手順:
メイン・メニューで、「ウィンドウ」、「アプリケーション・サーバー」を選択します。
「アプリケーション・サーバー」ウィンドウで、「アプリケーション・サーバー」ノードを右クリックし、「新規アプリケーション・サーバー」を選択して、「アプリケーション・サーバー接続の作成」ウィザードを完了します。
サービス・デプロイメント・プロファイルの作成:
「アプリケーション」ウィンドウで、Webサービスが含まれているプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。
「プロジェクト・プロパティ」ダイアログの「デプロイメント」ページを開き、 「新規」をクリックします。
「デプロイメント・プロファイルの作成」ダイアログで、アーカイブ・タイプとして「ビジネス・コンポーネント・サービス・インタフェース」を選択します(図15-14を参照)。
図15-14 ビジネス・コンポーネント・サービス・デプロイメント・プロファイルの作成用ダイアログ
メイン・メニューで、作成したデプロイメント・プロファイルに対して、「アプリケーション」→「デプロイ」を選択し、作成したデプロイメント・プロファイルを選択します。
「デプロイ」ウィザードの「デプロイメント・アクション」ページで、「アプリケーション・サーバーへのデプロイ」を選択し、「次へ」をクリックします。
「サーバーの選択」ページで、アプリケーション・サーバー接続を選択します。
「OK」をクリックします。
ADFアプリケーション・モジュールは、サービス・データ・オブジェクト(SDO)を公開します。SDOを利用するためのサービスバック・エンティティ・オブジェクトを作成して、ビジネス・サービスをSOAPサービスに公開できます。
ADFビジネス・コンポーネント・アプリケーションはWebサービス用の組込みサポート、およびビュー・オブジェクト・データをサービス・データ・オブジェクト(SDO)として公開するための組込みサポートを提供しています。ローカル・データ・モデル・プロジェクト内で作成するエンティティ・オブジェクトは、サービス対応アプリケーション・モジュールがそのサービス・インタフェースで公開するSDOサービスを利用できます。ローカル・オブジェクト内でサービスバック・エンティティ・オブジェクトを作成することで、すべての共通Webサービス・データ・アクセス・タスクに対して、サービス・プロキシとSDOをプログラミングによって直接扱う必要がなくなります。
エンティティ・オブジェクトの作成ウィザードを使用すると、エンティティ・オブジェクトの作成時に、ローカル・データベースとADFビジネス・コンポーネントWebサービスのいずれかの選択が簡単になります(「サービス対応エンティティ・オブジェクトとビュー・オブジェクトの使用方法」を参照)。このようにすると、サービス対応アプリケーション・モジュールにより、データベースでローカルに使用できないデータにアクセスするための代替の方法が提供されます。
サービスバック・エンティティ・オブジェクトを作成すると、ビュー・オブジェクト、ビュー・リンクおよびビュー基準を作成して、実行時にデータをフィルタできるようになります。また、あたかもデータベース表からローカルに提供されたデータにアクセスして作業しているかのように、これらのビュー・データをデータ・モデルで活用することもできます。
次の各項では、サービス対応ADFアプリケーション・モジュールを使用して、データ・モデル・プロジェクトを強化する方法を説明します。
次のいずれかの状況が発生した場合に、アプリケーション設計戦略の一環として、サービスバック・コンポーネントを使用できます。
クライアント・データ・モデル・プロジェクトで、別なビジネス・プロセスに含まれているサービス対応アプリケーションを使用する必要がある場合。
クライアント・データ・モデル・プロジェクトで、プラガブルな外部サービスを使用する必要がある場合。
最初の場合は、サービスの両側を提供します。2番目の場合は、外部サービスが不明なことがあるので、次を行う必要があります。
サービスのFusion実装は必要ないかもしれませんが、サービス対応アプリケーション・モジュールのサービス・インタフェースがプラガブル機能のサポート単位になっており、サービスバック・エンティティ・オブジェクトおよびビュー・オブジェクト作成方法としてサポートされているので、「標準的な」プラガブル・サービスに求める形状をサービス・インタフェースに記述してアプリケーション・モジュールを作成します。
「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従ってサービス対応アプリケーション・モジュールを生成した後、サービスバック・エンティティ・オブジェクトとビュー・オブジェクトを作成する必要があります。
最後にステップ2で作成した「標準的」なサービス対応アプリケーション・モジュールと同じサービス・インタフェースをサポートするEJBセッションBean(またはSCAコンポジット)を作成し、このサービス・インタフェースに基づくサービス対応ビジネス・コンポーネントを含むクライアント・プロジェクトのconnections.xml
ファイルが、この「プラグイン」バージョンを使用するように構成します。
アプリケーション・モジュールをWebサービスとして公開する方法の詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
エンティティ・オブジェクトの作成ウィザードで、アプリケーション・サーバー上ですでに稼働しているデプロイ済サービスを記述したWSDLドキュメントのURLを入力して、サービスバック・エンティティ・オブジェクトを作成します。WSDLは、UDDIレジストリ、またはURLエンドポイントが使用できない場合はダウンロードしたWSDLドキュメント内にあります。このウィザードはWSDLサービス記述を使用して、使用可能なサービス・ビュー・インスタンスのリストを表示します。ウィザードで、表示されたビュー・インスタンスの中から選択して、エンティティ・オブジェクトのデータ・ソースを指定します。ウィザードの実行時、WSDLドキュメントを検索するためにサービス・エンドポイントへのアクセスが可能でなければなりません。
サービスバック・エンティティ・オブジェクトの作成に使用できるのは、保護されていない(HTTP)サービス・エンドポイントのみです。保護された(HTTPS)サービス・エンドポイントにアクセスしようとすると、エンティティ・オブジェクトの作成ウィザードでエラー・メッセージが表示されます。
始める前に:
クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
デプロイ済のサービスを記述するWSDLドキュメントのURLを入手します。セキュリティ保護されていないHTTP URLにアクセスできない場合、サービスのWSDLファイルをダウンロードし、ダウンロードしたWSDLを使用してローカル・ファイル・システムからサービスを取得します。
「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従い、Webサービスとしてアプリケーション・モジュールを公開します。
「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従い、特定のビュー・オブジェクトをサービス対応にします。
「複合データ型を使用した関連するSDOプロパティの関連付け」の説明に従って、サービス対応ビュー・オブジェクトの属性に対して複合型(通貨コードまたは測定単位を含む)を必要に応じて定義します。
データ・ソースとしてサービス・ビュー・インスタンスを使用するエンティティ・オブジェクトを作成する手順:
「アプリケーション」ウィンドウで、エンティティ・オブジェクトを作成するプロジェクトを右クリックし、「新規」、「エンティティ・オブジェクト」の順に選択します。
エンティティ・オブジェクトの作成ウィザードの「名前」ページで、次の操作を実行してエンティティ・オブジェクトを作成します。
エンティティ・オブジェクトが作成されるパッケージ名を入力し、エンティティ・オブジェクト名を入力します。
「サービス・インタフェース」を、エンティティ・オブジェクト作成用のデータ・ソースとして選択します。
公開済サービスのURLのWSDLドキュメントを入力するか、「参照」をクリックして「UDDIレジストリ」を選択し、「Webサービスの検索」ウィザードを使用してUDDIレジストリでWebサービスを検索します。URLエンドポイントにアクセスできない場合、WSDLファイルをローカル・ファイル・システムにコピーし、「参照」をクリックして「ファイル・システム」を選択し、ファイルに移動します。
JDeveloperはサービス・エンドポイントに接続して、WSDLサービス記述からサービス・ビュー・インスタンスのリストにデータを移入しようとします。エンドポイントが使用できな場合は、リストは空のままです。
「サービス・ビュー・インスタンス」ドロップダウンから、データ・ソースとして適切なサービス・ビュー・インスタンスを選択します(図15-15を参照)。
図15-15 エンティティ・オブジェクトの作成ウィザードにおけるデータ・ソースとしてのサービス・インタフェース
「次へ」をクリックして、エンティティ・オブジェクトの属性設定を変更してから、ウィザードを終了します。
たとえば「属性の設定」ページで、エンティティの変更時には常に変更が予想される属性について、「リフレッシュ」の「挿入後」および「リフレッシュ」の「更新後」オプションを有効化できます。通常、このような値には、行内のバージョン番号列や更新日付列などがあります。
「終了」をクリックします。
サービスバック・エンティティ・オブジェクトを作成すると、ベース・サービス対応ビュー・オブジェクトのSDOプロパティにより定義されている属性が、JDeveloperによって自動的に公開されます。エンティティ・オブジェクトに複合型の属性が含まれる場合、エンティティ・オブジェクトから複合型の関連属性を選択する必要があります。たとえば、サービスバック・エンティティ・オブジェクトでOrderTotal
属性およびCurrencyCode
属性を定義し、対象の国での通貨コードを指定すると仮定します。この場合、関連属性CurrencyCode
を、サービス対応ビュー・オブジェクトにより指定されるSDOプロパティのタイプにマップする必要があります。複合型でサポートされているサービス・タイプは次のとおりです。
AmountType
サービス・タイプは、通貨コードを定義する任意のプロパティ用です。
MeasureType
サービス・タイプは、測定単位を定義する任意のプロパティ用です。
概要エディタの「属性」ページを使用して、複合型として定義されたエンティティ・オブジェクトを選択します。概要エディタの「属性」ページから表示される「詳細」ダイアログを使用して、選択した属性の複合型を適切な型の関連属性にマップします。
始める前に:
クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。
複合型とSDOプロパティに関する知識が役立つ場合があります。詳細は、「複合データ型を使用した関連するSDOプロパティの関連付け」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従い、Webサービスとしてアプリケーション・モジュールを公開します。
「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。
「複合データ型を使用した関連するSDOプロパティの関連付け」の説明に従って、サービス対応ビュー・オブジェクトの個々の属性に対して複合型を指定します。
「SDOサービスにバックアップされたエンティティ・オブジェクトの作成」の説明に従って、サービス対応ビュー・オブジェクトからサービスバック・エンティティ・オブジェクトを作成します。
サービスバック・エンティティ・オブジェクトで複合型を使用して属性を関連付けるには:
プロジェクトにサービスバック・エンティティ・オブジェクトを追加したら、サービスバック・ビュー・オブジェクトを作成して、ユーザー・インタフェースで使用するWebサービス・データの問合せが行え、オプションでフィルタもできます。サービスバック・ビュー・オブジェクトは、そのエンティティを単独で使用すると、SDOサービスでバックアップされたエンティティ・オブジェクトを参照するビュー・オブジェクトです。既存のビュー・オブジェクトをサービスバックにできません。ビュー・オブジェクトを作成する際に、エンティティをサービスバック・エンティティ・オブジェクト用に使用する場合は、新しいビュー・オブジェクトが自動的にサービスバックになります。
始める前に:
クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
サービスバック・エンティティ・オブジェクトからビュー・オブジェクトを作成する手順:
サービスバック・エンティティ・オブジェクトはアクセスの詳細、および必要に応じてADFビジネス・コンポーネントWebサービスからのデータ行の変更の詳細をカプセル化するエンティティ・オブジェクトです。「エンティティ・オブジェクトの作成」ウィザードを使用してサービスバック・エンティティ・オブジェクトを作成後、JDeveloperが追加のサービス関連メタデータを、エンティティ・コンポーネント定義の<Datasource>
要素に保存します。エンティティ・コンポーネント定義には、複合型定義を持つ属性も含め、サービス対応ビュー・オブジェクト・インスタンスから選択したすべての属性が含まれます(次の例を参照)。
サービスバック・ビュー・オブジェクトは、エンティティ・ベースのビュー・オブジェクトと同様に、そのメタデータ内の単一のサービスバック・エンティティ・オブジェクトを参照します。サービスバック・ビュー・オブジェクトは、他のビュー・オブジェクトと同様に使用できます。ビュー・オブジェクトに関する作業方法の詳細は、「ビュー・オブジェクトを使用したSQL問合せの定義」を参照してください。ADFランタイムは、ADFビジネス・コンポーネントWebサービスとの対話を処理します。
<Entity xmlns="http://xmlns.example.com/bc4j" Name="Customer_ServiceBasedEO" InheritPersnalization="true" AliasName="CustomerSEO" BindingStyle="OracleName" UseGlueCode="false"> <DataSource DataSourceClass="oracle.jbo.datasource.svc.SIEODataSourceImpl" Type="ServiceInterface"> <ServiceInterface ServiceName="{http://www.globalcompany.com/oesvc/}OrderEntryService" SDOName="{http://www.globalcompany.com/oesvc/}CustomersSVO" SVIName="{http://www.globalcompany.com/oesvc/}CustomersSVO" CreateOpName="createCustomer" UpdateOpName="updateCustomer" DeleteOpName="deleteCustomer" GetOpName="getCustomer" FindOpName="findCustomers" ProcessOpName="processCustomers"/> </DataSource> <Attribute Name="CustomerId" ColumnName="CustomerId" SQLType="NUMERIC" Type="oracle.jbo.domain.Number" ColumnType="NUMBER" PrimaryKey="true"/> <!-- ... Attribute that is associated with complex type attribute ... --> <Attribute Name="CurrencyCode" Precision="255" ColumnName="CurrencyCode" SQLType="VARCHAR" Type="java.lang.String" ColumnType="VARCHAR2"/> <!-- ... Attribute with complex type mapping ... --> <Attribute Name="OrderTotal" ColumnName="OrdTotal" SQLType="NUMERIC" Type="java.math.BigDecimal" ColumnType="NUMBER" <Properties> <SchemaBasedProperties> <DomainAttrMappings> <DomainAttrMapping MappedAttrName="CurrencyCode" Name="currencyCode"/> </DomainAttrMappings> </SchemaBasedProperties> </Properties> </Attribute> <!-- ... Other Attribute elements here ... --> </Entity>
サービス・インタフェースは各ビュー・インスタンスを公開するので、コンシューミング・プロジェクトで、サービスバック・エンティティ・オブジェクト間の階層関係の定義(アソシエーションによる)、およびサービスバック・ビュー・オブジェクトの階層関係の定義(ビュー・リンクによる)を行う必要があります。サービスバック・ビジネス・コンポーネントを作成しても、ビュー・リンクとアソシエーションは自動的には作成されません。たとえば、公開済のADFビジネス・コンポーネント・サービスのアプリケーション・モジュールで、使用するマスター/ディテール関係が定義されている場合、プロジェクト内で対応するビュー・オブジェクトのビュー・リンクを定義して、この階層を維持する必要があります。
さらに、ローカルなデータとサービスバック・ビュー・オブジェクトを問い合せる(またはその逆)、ビュー・オブジェクト間のビュー・リンクは作成できますが、ビュー・リンクを一度定義すると、次のようなオブジェクト慣用名では、エンティティ・ベースのビュー・オブジェクトを作成できません。
ビュー・オブジェクトは、サービスバック・エンティティ・オブジェクトであるセカンダリ・エンティ慣用名を参照できません。
ビュー・オブジェクトは、セカンダリ・エンティティの慣用名付きのサービスバック・エンティティ・オブジェクトである、プライマリ・エンティ慣用名を参照できません。
クライアント・プロジェクト内の通常のエンティティ・オブジェクトとサービスバック・エンティティ・オブジェクト間のアソシエーションにも同じ制約が適用されます。アソシエーションは作成できますが、ビュー・オブジェクトは作成できません。
「ビュー・リンクの作成」ウィザードを使用して、プロジェクトで定義されたビュー・オブジェクト間の関係を指定します(図15-17を参照)。ビュー・リンクの作成の詳細は、「エンティティ・アソシエーションに基づくマスター/ディテール階層の作成方法」を参照してください。
作成するビュー・リンクでは、ローカルにアクセスしたデータベース表に問い合せるサービスバック・ビューとビュー・オブジェクト間の関係を定義できます。たとえば、サービスバック・マスター・ビュー・オブジェクトで、データベースから派生したディテール・ビュー・オブジェクトを実行する場合があります。表15-3に示す組合せで、ビュー・リンクを作成できます。
表15-3 サービスバック・ビュー・オブジェクトに関連する、サポートされているビュー・リンクの組合せ
ユースケース | マスター・ビュー・オブジェクト・タイプ | ビュー・リンク・ディテール・ビュー・オブジェクト・タイプ | ビュー・リンク・カーディナリティ |
---|---|---|---|
リモート・ディテールのあるローカル・マスター行 |
問合せベース |
サービスバック |
1対多 |
ローカル・ディテールのあるリモート・マスター行 |
サービスバック |
問合せベース |
1対多 |
リモート参照情報のあるローカル・マスター行 |
問合せベース |
サービスバック |
多対1 |
ローカル参照情報のあるリモート・マスター行 |
サービスバック |
問合せベース |
多対1 |
該当するビュー階層を定義したら、「ビュー・リンクの作成」ウィザードを使用して、プロジェクトのアプリケーション・モジュールの概要エディタで、データ・モデルの新しいビュー・インスタンスを定義します(図15-18を参照)。更新したデータ・モデルによって、Fusion Webアプリケーションのユーザー・インタフェースのコンポーネントとのデータバインドを可能にするADFデータ・コントロールとして、ビュー・オブジェクトを公開できます。データ・モデルの更新の詳細は、「アプリケーション・モジュールへのマスター/ディテール・ビュー・オブジェクト・インスタンスの追加」を参照してください。
アプリケーションを実行し、公開済のサービス対応ADFアプリケーションとの対話を行ってサービス操作を起動する前に、サービス・エンドポイント・プロバイダ・タイプおよびその他の構成情報を含む、公開済サービスの記述を行う必要があります。ADFビジネス・コンポーネントのServiceFactory
クラス (oracle.jbo.client.svc.ServiceFactory
)はサービスのプロキシを戻し、サービス・プロキシを使用してサービス操作を起動します。サービス・ファクトリは、3つの異なるサービス・エンドポイント・プロバイダのプロキシを戻して、これらのトランスポート・プロトコルをサポートできます。
サービス・エンドポイント・プロバイダがADFビジネス・コンポーネントの場合は、トランスポート・プロトコルはEJB RMIです。
サービス・エンドポイント・プロバイダがSOA Fabricの場合は、トランスポート・プロトコルはSOA Fabric SDOバインディングです。
サービス・エンドポイント・プロバイダがSOAP (JAX-WSクライアント用)の場合は、トランスポート・プロトコルはSOAPです。
公開済のサービス操作を起動するようにコンシューミング・アプリケーションを構成する手順:
SDO生成クラスのbcProfileName
_Common.jar
ファイルを、クライアント・プロジェクトのクラスパスに追加します。
クライアント・プロジェクトの.adf/META-INF
フォルダ内のconnections.xml
ファイルを更新して、公開済ADFビジネス・コンポーネント・サービスを記述します。
このファイルでの更新内容はアプリケーションで使用しているトランスポート・プロトコルがEJB RMIプロトコル、SOA Fabric SDOバインディング、またはSOAPプロトコル(JAX-WSクライアント用)のいずれかによって異なります。
アプリケーションで公開済サービスにアクセスできるようになるには、サービス・コンシューミング・プロジェクトから生成されたSDOクラスとそのスキーマ定義にアクセスできなければなりません。これらのファイルは、サービス公開を担当する開発チームが生成したbcProfileName
_Common.jar
ファイルにパッケージされています。
アプリケーションでSDOクラスとそのスキーマ定義を使用できるようにするには、サービス・プロバイダ・チームからbcProfileName
_Common.jar
ファイルを入手し、このJARファイルをローカル・プロジェクト・フォルダに配置します。たとえば、JARファイルをプロジェクトのdeploy
フォルダにコピーできます。次にJDeveloperを使用してJARファイルを、作成したSDOクライアント・ライブラリとともにプロジェクトのクラスパスに追加できます。SDOクラスJARファイルの生成手順は、「Oracle WebLogic ServerへのWebサービスのデプロイ方法」を参照してください。
始める前に:
クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
SDOクライアント・ライブラリをクラスパスに追加する手順:
サービス・エンドポイント・プロバイダがADFビジネス・コンポーネントの場合は、サービス・ファクトリがEJBコンテナ内で実行中のステートレス・セッションBeanにバインドされた、EJBオブジェクト・プロキシを戻します。JNDIコンテキスト情報を提供して、コンシューミング・アプリケーションが公開済サービスを検索できるようにする必要があります。
公開済ADFビジネス・コンポーネント・サービスの登録用に提供する検索情報は、Fusion Webのコンシューミング・アプリケーションのconnections.xml
ファイル内(アプリケーションに相対的な.adf/META-INF
フォルダ内)にあります。ADF接続アーキテクチャはこのファイルを使用してサービス・エンドポイント・プロバイダの詳細をカプセル化します。
公開済データがコンシューミング・アプリケーションでローカルに(同じJVM内で)実行されているのか、コンシューミング・アプリケーションとはな別なサーバーでリモートに実行されているのかによって、提供するJNDI検索情報は異なります。通常、ADFビジネス・コンポーネント・サービスはコンシューミング・アプリケーションとは異なっており、したがってリモートに実行されています。
公開済サービスをクライアント・アプリケーションに登録するには、次の例に示すように、connections.xml
ファイルを更新します。ADFビジネス・コンポーネント・サービスがコンシューミング・アプリケーションでローカルに実行されている場合(JDeveloper内での実行時のように)、サービス・ファクトリはJNDI名さえあればサービスを検索できます。
注意:
スタンドアロンOracle WebLogic Serverにコール元アプリケーションをデプロイする場合は、connections.xml
ファイルを編集するかわりにOracle Enterprise Managerを使用してJNDIコンテキスト・プロパティを構成します。手順は、Oracle Enterprise Managerのオンライン・ドキュメントを参照してください。
<References xmlns="http://xmlns.oracle.com/adf/jndi"> <Reference name="{www.globalcompany.com}ServiceAppModuleService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>ADFBC</Contents> </StringRefAddr> <StringRefAddr addrType="jndiName"> <Contents>ServiceAppModuleServiceBean#oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaName"> <Contents>ServiceAppModuleService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/summit/model/amservice/common/serviceinterface/</Contents> </StringRefAddr> </RefAddresses> </Reference> ... </References>
ADFビジネス・コンポーネント・サービスがコール元クライアントに対してリモートに実行すると、リモートJNDIコンテキスト情報をconnections.xml
ファイルに追加する必要があります。connections.xml
ファイルにあるこれらのJNDIコンテキスト・プロパティを編集できます(次のサンプルを参照)。
jndiFactoryInitial
はweblogic.jndi.WLInitialContextFactory
に設定する必要があります。
jndiProviderURL
はJNDIプロバイダのURLで、JNDIサーバーの場所を示します。URLはt3://
<hostname>
:
<server port>
という構成でなければなりません。
たとえば、t3://localhost:8888
のようなURLを指定します。ここでt3
はOracle WebLogicプロトコルで、localhost
はリモートOracle WebLogic Serverインスタンスが実行するホスト名、8888
はポート番号です。
jndiSecurityPrincipal
は、リモートJNDIへのアクセス権のあるプリンシパル(ユーザー名)を指定します。
スタンドアロンOracle WebLogic Serverにデプロイすると、ユーザー名をファイルから読み取ることができます。
jndiSecurityCredentials
は、セキュリティ・プリンシパルに使用する資格証明(パスワード)を指定します。
サービスをテスト環境内のスタンドアロンOracle WebLogic Serverにデプロイする際は、JNDIプロバイダ用の資格証明をプレーン・テキストで指定できます。たとえば、Oracle WebLogic ServerのJNDIプロバイダにアクセスするための十分な権限を持つ、デフォルト管理者のユーザー名/パスワード資格証明である、weblogic
/weblogic1
を指定できます。
サービスを本番環境にデプロイする場合は、プレーン・テキストのパスワードを削除して、セキュリティの脆弱性を回避する必要があります。次の例に示すように、connections.xml
ファイルには、パスワードを設定せずに<SecureRefAddr addrType="jndiSecurityCredentials"/>
を含む必要があります。スタンドアロンOracle WebLogic Server用のサービス・パスワードを構成するには、Oracleの資格証明ストアに暗号化されたパスワードを保存するOracle Enterprise Managerを使用する必要があります。
<References xmlns="http://xmlns.oracle.com/adf/jndi"> <Reference name="{www.globalcompany.com}ServiceAppModuleService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>ADFBC</Contents> </StringRefAddr> <StringRefAddr addrType="jndiName"> <Contents>ServiceAppModuleServiceBean#oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="jndiFactoryInitial"> <Contents>weblogic.jndi.WLInitialContextFactory</Contents> </StringRefAddr> <StringRefAddr addrType="jndiProviderURL"> <Contents>t3://localhost:8888</Contents> </StringRefAddr> <StringRefAddr addrType="jndiSecurityPrincipal"> <Contents>a_username</Contents> </StringRefAddr> <SecureRefAddr addrType="jndiSecurityCredentials"/> <StringRefAddr addrType="serviceSchemaName"> <Contents>ServiceAppModuleService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/summit/model/amservice/common/serviceinterface/</Contents> </StringRefAddr> </RefAddresses> </Reference> ... </References>
サービス・エンドポイント・プロバイダがSOAPの場合、サービス・ファクトリは動的なJAX-WSクライアント・プロキシを作成します。WSDL URLとポート名を提供して、コンシューミング・アプリケーションが公開済サービスを検索できるようにする必要があります。さらに、SOAPクライアント用には、SOAPヘッダーの一部として、OWSMクライアント・セキュリティ・ポリシーを添付できます。
公開済ADFビジネス・コンポーネント・サービスの登録用に提供する検索情報は、Fusion Webのコンシューミング・アプリケーションのconnections.xml
ファイル内(アプリケーションに相対的な.adf/META-INF
フォルダ内)にあります。ADF接続アーキテクチャはこのファイルを使用してサービス・エンドポイント・プロバイダの詳細をカプセル化します。
注意:
スタンドアロンOracle WebLogic Serverにコール元アプリケーションをデプロイする場合は、connections.xml
ファイルを編集するかわりにOracle Enterprise Managerを使用してJNDIコンテキスト・プロパティを構成します。手順は、Oracle Enterprise Managerのオンライン・ドキュメントを参照してください。
SOAPプロトコル用にクライアント・アプリケーションに公開済サービスを登録するには、アプリケーションがアイデンティティ伝播とアイデンティティ切替えのどちらを使用しているかによって、次の例に従ってconnections.xml
ファイルを更新します。アイデンティティ伝播と切替えは、各プロセスでアイデンティティを伝播するという点では同様です。Fusion Webアプリケーションでは、アイデンティティ伝播によって現在コードを実行中のアイデンティティが伝播されます。一方、アイデンティティ切替えでは、現在コードを実行中のものとは異なるアプリケーション・アイデンティティを伝播します。
公開済サービスをクライアント・アプリケーションに登録し、ユーザー・アイデンティティが資格証明キーに基づいて切り替わるようにするには、次の例に示すように、connections.xml
ファイル内でクライアント側のポリシー、oracle/wss11_username_token_with_message_protection_client_policy
を指定します。
注意:
connections.xml
ファイルは、OWSMセキュリティ・ポリシー・クライアントのオーバーライドをサポートしています。セキュリティ・ポリシーがoracle/wss11_username_token_with_message_protection_client_policy
の場合、csf-key
プロパティにオーバーライドして、コンシューミング・アプリケーションの資格証明を指定できます。
<Reference name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.apps.sample.hrService.HrService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>SOAP</Contents> </StringRefAddr> <StringRefAddr addrType="webServiceConnectionName"> <Contents>HrServiceConnection</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaName"> <Contents>HrService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/apps/sample/hrService/</Contents> </StringRefAddr> </RefAddresses> </Reference> <Reference name="HrServiceConnection" className="oracle.adf.model.connection.webservice.impl.WebServiceConnectionImpl" xmlns=""> <Factory className="oracle.adf.model.connection.webservice.api.WebServiceConnectionFactory"/> <RefAddresses> <XmlRefAddr addrType="WebServiceConnection"> <Contents> <wsconnection description="http://rws65094fwks:7202/MySampleSvc/HrService?WSDL" service="{http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <model name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService" xmlns="http://oracle.com/ws/model"> <service name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <port name="HrServiceSoapHttpPort" binding="{http://xmlns.oracle.com/apps/sample/hrService/}HrServiceSoapHttp" portType="http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <call-properties xmlns="http://oracle.com/adf"> <call-property id="csf-key" xmlns=""> <name>csf-key</name> <value>meuser.credentials</value> </call-property> </call-properties> <policy-references xmlns="http://oracle.com/adf"> <policy-reference category="security" uri="oracle/wss11_username_token_with_message_protection_client_policy" enabled="true" id="oracle/wss11_username_token_with_message_protection_client_policy" xmlns=""/> </policy-references> <soapaddressUrl="http://rws65094fwks:7202/MySampleSvc/HrService" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/> </port> </service> </model> </wsconnection> </Contents> </XmlRefAddr> </RefAddresses> </Reference>
公開済サービスをクライアント・アプリケーションに登録し、ユーザー・アイデンティティをコール元に伝播させるには、次の例に示すように、connections.xml
ファイル内で、クライアント側のポリシー、oracle/wss11_saml_token_with_message_protection_client_policy
を指定します。
<Reference name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.apps.sample.hrService.HrService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>SOAP</Contents> </StringRefAddr> <StringRefAddr addrType="webServiceConnectionName"> <Contents>HrServiceConnection</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaName"> <Contents>HrService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/apps/sample/hrService/</Contents> </StringRefAddr> </RefAddresses> </Reference> <Reference name="HrServiceConnection" className="oracle.adf.model.connection.webservice.impl.WebServiceConnectionImpl" xmlns=""> <Factory className="oracle.adf.model.connection.webservice.api.WebServiceConnectionFactory"/> <RefAddresses> <XmlRefAddr addrType="WebServiceConnection"> <Contents> <wsconnection description="http://rws65094fwks:7202/MySampleSvc/HrService?WSDL" service="{http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <model name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService" xmlns="http://oracle.com/ws/model"> <service name="{http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <port name="HrServiceSoapHttpPort" binding="{http://xmlns.oracle.com/apps/sample/hrService/}HrServiceSoapHttp" portType="http://xmlns.oracle.com/apps/sample/hrService/}HrService"> <policy-references xmlns="http://oracle.com/adf"> <policy-reference category="security" uri="oracle/wss11_saml_token_with_message_protection_client_policy" enabled="true" id="oracle/wss11_saml_token_with_message_protection_client_policy" xmlns=""/> </policy-references> <soap addressUrl="http://rws65094fwks:7202/MySampleSvc/HrService" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/> </port> </service> </model> </wsconnection> </Contents> </XmlRefAddr> </RefAddresses> </Reference>
サービス・エンドポイント・プロバイダがファブリックの場合は、サービス・ファクトリによってSOAファブリック・コンポジット・プロキシが戻され、ファブリックのSDOバインディングを使用してファブリック・コンポジット内で実行中のサービスがコールされます。ファブリック・コンポジット名を提供して、コンシューミング・アプリケーションが公開済サービスを検索できるようにする必要があります。
公開済ADFビジネス・コンポーネント・サービスの登録用に提供する検索情報は、Fusion Webのコンシューミング・アプリケーションのconnections.xml
ファイル内(アプリケーションに相対的な.adf/META-INF
フォルダ内)にあります。ADF接続アーキテクチャはこのファイルを使用してサービス・エンドポイント・プロバイダの詳細をカプセル化します。
注意:
スタンドアロンOracle WebLogic Serverにコール元アプリケーションをデプロイする場合は、connections.xml
ファイルを編集するかわりにOracle Enterprise Managerを使用してJNDIコンテキスト・プロパティを構成します。手順は、Oracle Enterprise Managerのオンライン・ドキュメントを参照してください。
公開済サービスをファブリック・プロトコルのクライアント・アプリケーションに登録するには、次の例に示すように、connections.xml
ファイルを更新します。ここで、fabricAddress
は公開済サービスのファブリック・コンポジット名です。
<References xmlns="http://xmlns.oracle.com/adf/jndi"> <Reference name="{www.globalcompany.com}ServiceAppModuleService" className="oracle.jbo.client.svc.Service" xmlns=""> <Factory className="oracle.jbo.client.svc.ServiceFactory"/> <RefAddresses> <StringRefAddr addrType="serviceInterfaceName"> <Contents>oracle.summit.model.amservice.common. serviceinterface.ServiceAppModuleService</Contents> </StringRefAddr> <StringRefAddr addrType="serviceEndpointProvider"> <Contents>Fabric</Contents> </StringRefAddr> <StringRefAddr addrType="fabricAddress"> <Contents>fabric_ServiceAppModuleService</Contents> <StringRefAddr addrType="serviceSchemaName"> <Contents>ServiceAppModuleService.xsd</Contents> </StringRefAddr> <StringRefAddr addrType="serviceSchemaLocation"> <Contents>oracle/summit/model/amservice/common/serviceinterface/</Contents> </StringRefAddr> </RefAddresses> </Reference> ... </References>
「サービスバック・ビジネス・コンポーネント・ランタイムの構成方法」に説明するように、Oracle ADFモデル・テスターを起動する前に、プロジェクトがランタイム要件を満たす必要があります。Oracle ADFモデル・テスターでは、リモートWebサービスから作成したビュー・オブジェクトが表示され、サービスと対話して標準的なCRUD操作を実行できます。
実行するアプリケーション・モジュールはローカルに問い合せたデータとリモートに問い合せたデータに一緒にアクセスできるので、サービスバック・ビュー・オブジェクトとデータベースから派生したビュー・オブジェクトが同じテスターに表示されます。Oracle ADFモデル・テスターで、サービスバック・ビュー・オブジェクトを選択したときにエンドポイントが使用できない場合は、ランタイム例外が発生します。
Oracle ADFモデル・テスターの実行方法の詳細は、「構成を使用したOracle ADFモデル・テスターの実行方法」を参照してください。
ADFビジネス・コンポーネント・サービス・インタフェースでは、サービス・プロキシを戻して、起動した操作が公開済サービスで指定したトランスポート・プロトコルを使用していることを確認する必要があります。
始める前に:
クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
コンシューミング・アプリケーションが、クラスパス上に正しいライブラリを持っていることを確認してください。「アプリケーション」ウィンドウでプロジェクトをダブルクリックし、「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、次のライブラリが表示されることを確認します。
Java EE 1.5
Oracle XML Parserバージョン2
BC4Jサービス・クライアント
JAX-WSクライアント
サービスの共通JARファイル
次の例に示すように、操作を起動する際、次のタスクを実行します。
import commonj.sdo.DataObject; import commonj.sdo.helper.DataFactory; import commonj.sdo.helper.XMLHelper; import hr.common.Dept; import hr.common.serviceinterface.HRAppService; import oracle.jbo.client.svc.ServiceFactory; ... { HRAppService proxy = (HRAppService) ServiceFactory.getServiceProxy(HRAppService.NAME); Dept dept = (Dept) ServiceFactory.getDataFactory(proxy).create("http://example.com/hr/common/" "Dept"); dept.setDname("ENGINEERING"); ... dept = proxy.createDept(dept); String xml = ServiceFactory.getXMLHelper(proxy).save((DataObject) dept, "http://example.com/hr/common/", "dept"); out.print(xml); }
ADFサービス・インタフェース・フレームワークは、一連の共通データ・オブジェクト(oracle.jbo.common.service.types.FindCriteria
、oracle.jbo.common.service.types.FindControl
、oracle.jbo.common.service.types.ProcessControl
など)を定義します。これらのデータ・オブジェクトは、標準のfindXxx()
メソッドおよびprocessXxx()
メソッドの各コールで使用されます。これらのデータ・オブジェクトは、コンシューミング・アプリケーションで作成して、標準サービス・メソッドに渡すことができます。次の例に示すように、データ・ファクトリ・クラスのcreate()
メソッドをコールして、findXxx()
またはprocessXxx()
メソッドに渡す前に、これらのデータ・オブジェクトを作成する必要がある場合があります。
FindCriteria fc = (FindCriteria) ServiceFactory.getDataFactory(proxy).create ("http://xmlns.oracle.com/adf/svc/types/", "FindCriteria");
表15-2で説明するように、ADFサービス・インタフェース・フレームワークは、getDftlObjAttrHints()
、getServiceLastUpdateTime()
、and getEntityList()
など、サービス・ビュー・インスタンスに対してオプションで有効にできるいくつかの組込みSOAPサービス・メソッドを定義します。これらのメソッドは、主に、コンシューミング・アプリケーションによるサービス・エンドポイントとのプログラムによる対話をサポートし、データ・コントロールによって設計時にはサポートされません。
ADFランタイムはデータ・ソース情報をサービスバック・エンティティ・オブジェクトXML定義から入手し、必要に応じてサービス・インタフェース・メソッドとの対話を自動化します。サービスバック・エンティティ・オブジェクトを使用することで、すべての共通Webサービスのデータ・アクセス・タスクに対して、サービス・プロキシおよびサービス・データ・オブジェクトを直接プログラミングする必要がなくなります。ADFサービス・ファクトリはサービスを検索し、connections.xml
で指定したサービス・インタフェースを使用して、サービス・メソッドを起動します。
アプリケーションがADFビジネス・コンポーネントWebサービスにアクセスする際、各リモート・コールはステートレスで、リモート・サービスは、サービス対応のアプリケーション・モジュールのサービス・インタフェースを使用するビジネス・コンポーネントと同じトランザクションには関与しません。
ほとんどの場合、リモート・サービスへのコールは情報提供を目的としたもので、リモート・オブジェクトは変更されません。ただし、リモート・サービスを使用して変更を行う必要がある場合は、次の点に注意してください。
リモート・サービスにスローされた例外によって、ローカル・トランザクションが失敗します。
データ変更を伴うリモート・サービス・コールが成功した後、なんらかの理由でローカル・トランザクションが失敗した場合、エラー処理コードを使用して、リモート・サービスに対して復元トランザクションを行い、過去の変更を「取り消す」必要があります。
参照情報にアクセスするために使用するWebサービスもあります。また、データを変更するためにコールするサービスもあります。サービスが社内の自分自身のチームまたは別のチームによって記述されていた場合、このデータ変更が自社のデータベース内で発生する可能性があります。Webサービスが自社のファイアウォールの外部にある場合は、変更対象のデータベースは、当然、別の会社によって管理されます。いずれの場合でも、起動するWebサービスによって実行されるデータ変更は、サービス対応のアプリケーション・モジュールの現在の作業ユニットとは無関係な独自のトランザクションによって実行されるということを理解しておくことが重要です。たとえば、データを変更するWebサービスを起動した後、rollback()
をコールしてアプリケーション・モジュールの現在の作業ユニット内で保留中の変更を取り消しても、該当するプロセス内でコールしたWebサービスで実行した変更に対しては、ロールバックの影響はありません。対応するWebサービス・メソッドを起動して、補正用の変更を実行し、アプリケーション・モジュールのトランザクションのロールバックを無効にする必要がある場合があります。
実行時、ADFはADFビジネス・コンポーネントWebサービスとの対話を処理します。ただし、サービスバック・ビジネス・コンポーネントには、次のような設計時の制約があり、これによってアプリケーションの実行時の動作が制限されることがある点を認識しておく必要があります。
作成するビュー・オブジェクトは、サービスバック・エンティティ・オブジェクトを、セカンダリ・エンティティ・オブジェクト慣用名として参照できません。
作成するビュー・オブジェクトは、関連する複数のエンティティ・オブジェクトのいずれかがサービスバック・エンティティ・オブジェクトの場合、これらのエンティティ・オブジェクトからフラット化された結合を生成できません。
サービスバック・エンティティ・オブジェクトから作成するサービスバック・ビュー・オブジェクトは、セカンダリ・エンティ慣用名を参照しません。
設計時におけるこれらの制約の適用の詳細は、「サービスバック・ビジネス・コンポーネントのデータ・モデルの更新方法」を参照してください。
ADFビジネス・コンポーネントを使用すると、代替方法としてサービス・データ・オブジェクト(SDO)が多相サブタイプ・ビュー・オブジェクト・インスタンスをアプリケーション・モジュールで起動できます。
ADFモデル・プロジェクトは、共通ベース・ビュー・オブジェクトから導出された1つ以上のサブタイプ・ビュー・オブジェクトを定義するベース・ビュー・オブジェクトを含むことができます。ビジネス・コンポーネント開発者は、ベース・ビュー・オブジェクト・インスタンスの多相オブジェクトの慣用名を公開する場合、ADFデータ・モデルにサブタイプを追加します。ただし、開発者がアプリケーション・モジュール・ビュー・インスタンスからSDOサービス・インタフェースを作成する場合、多相サブタイプ・ビュー・オブジェクトのサブタイプSDOは、SDOサービス・インタフェースで直接参照されません。
ベース・ビュー・オブジェクトとサブタイプ・ビュー・オブジェクトを定義するADFモデル・プロジェクトからSDOインタフェースを生成した後、生成されたXMLスキーマ(.xsd
)は、ベース・ビュー・オブジェクトに対しては厳密に型指定されますが、多相サブタイプに対しては異なります。このため、多相サブタイプ・ビュー・オブジェクトにアクセスする必要があるWebサービス・クライアントは、他の手法を使用して、SDOインタフェースの公開済操作を起動します。
注意:
この項の例では、SummitADF_Examples
アプリケーション・ワークスペースのカスタム・プロジェクトPolymorphicVO_WSClient
を参照します。クライアント・プロジェクトは、同じワークスペースのモデル・プロジェクトのoracle.summit.model.polymorphicvo
パッケージ内に作成されたSDOサービス・インタフェースにアクセスします。
JDeveloperでは、Webサービス・クライアント・プロジェクトに追加したリモート・サービス対応アプリケーション・モジュールWebサービスへのプロキシとして機能するJavaクラスを生成できます。これを実現するには、Webサービス・クライアントおよびプロキシの作成ウィザードを使用して、デプロイ済サービスにWSDL URLを入力します。ウィザードは、プロキシ・クラスを使用するクライアント・ファイルを作成して、WebサービスにアクセスするためのJavaメソッド・コールを実行できるようにします。
始める前に:
SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。
JAX-WS Webサービス・クライアントとプロキシ・クラスを作成することによって、JDeveloperがJavaアプリケーションにおけるWebサービスへのアクセスをどのようにサポートするかを理解しておくと役に立ちます。詳細は、『Oracle JDeveloperによるアプリケーションの開発』のJAX-WS Webサービスとクライアントの作成に関する項を参照してください。
他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。
次のタスクを完了する必要があります。
「多相ビュー・オブジェクトの定義」の説明に従って、目的のサブタイプ・ビュー・オブジェクトを作成し、サブタイプを使用してアプリケーション・モジュール・ビュー・インスタンスで多相慣用名を構成します。
「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従って、アプリケーション・モジュールのサービス・インタフェースを有効にします。
サービス・メソッドを起動するために使用するWebサービス・プロキシ・クラスを含むクライアント・プロジェクトを作成します。
ヒント: JDeveloperでJavaクライアント・プロジェクトを未作成の場合、カスタム・プロジェクトを作成してWebサービス・プロキシ・クラスを含めます(『Oracle JDeveloperによるアプリケーションの開発』のアプリケーションとプロジェクトの作成に関する項を参照)。
JDeveloperでWebサービスを実行して、WSDLドキュメントの場所を指定するために使用するサービス・エンドポイントURLを取得します。
ヒント: 「Integrated WebLogic Serverを使用したWebサービスのテスト方法」の説明に従って、Integrated WebLogic Serverでサービスを実行し、「ログ」ウィンドウからサービス・エンドポイントURLを取得します。
サービス・クライアントとプロキシ・ファイルを生成する手順:
JDeveloperで、Webサービス・スキーマから生成されたクラスを使用して、JAXB (Java Architecture for XML Binding)を介してWebサービスにアクセスするJavaクライアントを作成できます。JAXBパッケージ、プロキシ・クラスおよびインタフェースを生成するために、クライアント開発者は、ADFビジネス・コンポーネント・サービス・スキーマ(WSDL)に対して、JAXBバインディング・コンパイラを実行します。開発者は、プロキシ・クラス関連の作業で、サービスXMLの知識を要求しません。
生成されたプロキシ・クラスを使用すると、開発者は、クライアント・プロジェクトのJavaクラス・ファイルで実行するメソッド・コールで多相コレクションにアクセスし、操作できます。そのようなファイルのサンプルは、生成されたSOAPサービス・クライアントJavaクラス・ファイルです。生成されたクライアント・ファイルは、WSDLドキュメントURLとともに入力したデプロイ済ADF Webサービスに対して命名されます。たとえば、デプロイするADF Webサービスの名前がADFModuleService
の場合、SOAPサービス・クライアントJavaクラスはAppModuleServiceSoapHttpPortClient.java
と命名されます。
始める前に:
多相コレクションがリモート・サービスとしてアクセスできない理由を理解しておくと役に立ちます。詳細は、「コンシューミング・アプリケーションでの多相コレクションへのアクセス」を参照してください。
次のタスクを完了する必要があります。
サービス対応アプリケーション・モジュールWebサービス用のJavaプロキシ・クラスを含むJavaクライアント・プロジェクトを作成します。詳細は、「サービス対応アプリケーション・モジュールからWebサービス・クライアント・プロキシ・クラスを生成する方法」を参照してください。
「アプリケーション」ウィンドウで、クライアント・プロジェクトを展開し、SOAPサービス顧客ファイルを見つけます。図15-17に示すように、AppModuleServiceSoapHttpPortClient.java
ファイルはクライアント・プロジェクトのcom.oracle.xmlns
パッケージにあります。
図15-20 JAXB生成済SOAPサービス・クライアント・ファイル
さらに、ベースおよびサブタイプ・ビュー・オブジェクトの公開操作を呼び出すためのSOAPサービス顧客ファイルの編集に進むことができます。サブタイプ・ビュー・オブジェクトにファクトリ・オブジェクトを作成する例を次に示します。
package com.oracle.xmlns.apps.hr.service; ... import oracle.summit.model.polymorphicvo.views.common.ObjectFactory; import oracle.summit.model.polymorphicvo.views.common.SEmpViewSDO; import oracle.summit.model.polymorphicvo.views.common.SalespersonViewExSDO; ... public class AppModuleServiceSoapHttpPortClient { public static void main(String[] args) { AppModuleService_Service appModuleService_Service = new AppModuleService_Service(); AppModuleService appModuleService = appModuleService_Service.getAppModuleServiceSoapHttpPort(); ... // Add your code to call the desired methods. try { SEmpViewSDO emp = testCreate(appModuleService); testFind(appModuleService); testDelete(appModuleService, emp); testFind(appModuleService); } catch (ServiceException e) { } } ... // 1. Create an employee of subtype Salesperson private static SEmpViewSDO testCreate(AppModuleService deptService) throws ServiceException { oracle.summit.model.polymorphicvo.views.common.ObjectFactory factory = new oracle.summit.model.polymorphicvo.views.common.ObjectFactory(); System.out.println("\n*** Testing createEmp ***\n"); SalespersonViewExSDO salesperson = factory.createSalespersonViewExSDO(); // 2. Set the attrs of the base SEmpView view object salesperson.setId(8001); salesperson.setFirstName(factory.createSEmpViewSDOFirstName("Lynn")); salesperson.setLastName("Munsinger"); salesperson.setEmail(factory.createSEmpViewSDOEmail ("lmunsing@summit.com")); salesperson.setTitleId(factory.createSEmpViewSDOTitleId (new BigDecimal(2))); salesperson.setSalary(factory.createSEmpViewSDOSalary (new BigDecimal(2000))); // 3. Set the attrs of the subtype SalespersonView view object salesperson.setCommissionPct (factory.createSalespersonViewExSDOCommissionPct (new BigDecimal(20))); salesperson.setDeptId(factory.createSEmpViewSDODeptId(31)); return printEmp(deptService.createSEmpView1(salesperson)); } // 4. Delete the employee of type Salesperson private static void testDelete(AppModuleService deptService, SEmpViewSDO emp) throws ServiceException { System.out.println("\n*** Testing deleteEmp ***\n"); deptService.deleteSEmpView1(emp); } // 5. Print private static SEmpViewSDO printEmp(SEmpViewSDO emp) { System.out.print(emp.getId() + "\t" + emp.getEmail().getValue() + "\t" + emp.getTitle().getValue() + "\t" + "\t" + emp.getSalary().getValue()); if (emp instanceof SalespersonViewExSDO) { System.out.print("\t" + ((SalespersonViewExSDO) emp).getCommissionPct().getValue()); } System.out.println(); return emp; } // 6. Find employees by department private static void testFind(AppModuleService deptService) throws ServiceException { com.oracle.xmlns.adf.svc.types.ObjectFactory factory = new com.oracle.xmlns.adf.svc.types.ObjectFactory(); System.out.println("\n*** Testing findEmpsByDept ***\n"); FindCriteria fc = factory.createFindCriteria(); fc.setFetchStart(0); fc.setFetchSize(-1); List<SEmpViewSDO> empList = deptService.findSEmpView1ByDept(fc, "SALES", null); for (SEmpViewSDO emp : empList) { printEmp(emp); } } }
JDeveloperでAppModuleServiceSoapHttpPortClient.java
クライアントを実行すると、「ログ」ウィンドウに次の出力が生成されます。createEmp
メソッドは、営業部門に従業員を、EmpView
コレクションのSalesperson
サブタイプとして作成します。属性値20
は、新しい多相ビュー行のCommission
属性です。findEmpsByDept
メソッドは、EmpView
ベース・ビュー行とSalespersonView
サブタイプ行の混合を表示します。残りのメソッドは、EmpView
コレクションから作成済販売員を削除して、結果を出力します。
*** Testing createEmp *** 8001 lmunsing@summit.com Sales Representative 2000 20 *** Testing findEmpsByDept *** 3 mnagayam@summit.com VP, Operations 1400 11 cmagee@summit.com Sales Representative 1400 10 13 ysedeghi@summit.com Sales Representative 1515 10 14 mnguyen@summit.com Sales Representative 1525 15 15 adumas@summit.com Sales Representative 1450 17.5 23 rpatel@summit.com Stock Clerk 795 8001 lmunsing@summit.com Sales Representative 2000 20 *** Testing deleteEmp *** *** Testing findEmpsByDept *** 3 mnagayam@summit.com VP, Operations 400 11 cmagee@summit.com Sales Representative 1400 10 13 ysedeghi@summit.com Sales Representative 1515 10 14 mnguyen@summit.com Sales Representative 1525 15 15 adumas@summit.com Sales Representative 1450 17.5 23 rpatel@summit.com Stock Clerk 795
JAXBバインディング・コンパイラは、サービス・インタフェースWSDLによって公開される各種SDOビュー・インスタンスのためのアプリケーション・モジュール・サービスとオブジェクト・ファクトリ・クラスのためのJavaプロキシ・クラスを生成します。多相ビュー・オブジェクトは、ベース・ビュー・オブジェクトのタイプ階層で定義されるため、厳密に型指定されたプロキシ・クラスも持ちます。図15-21に示すように、SalespersonViewSDO.java
プロキシ・クラスは、ベース・ビュー・オブジェクトSEmpView
のプロキシ・クラス SEmpViewSDO.java
とともに表示されます。
図15-21 JAXB生成済SOAPサービス・クライアント・プロキシ・クラス
次の例に示すように、EmployeeView
ビュー・オブジェクトにサブタイプSalespersonView
ビュー・オブジェクトが定義されている場合、生成されるWebサービス・クライアントには、ベース・プロキシ・クラス(SEmpViewSDO
)を拡張してcommissionPct
属性のアクセッサ・メソッドを定義するプロキシ・クラスSalespersonViewSDO.java
が含まれます。
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "SalespersonViewExSDO", propOrder = { "commissionPct" }) public class SalespersonViewExSDO extends SEmpViewSDO { @XmlElementRef(name = "CommissionPct", namespace = "/oracle/summit/model/polymorphicvo/views/common/", type = JAXBElement.class, required = false) protected JAXBElement<BigDecimal> commissionPct; /** * Gets the value of the commissionPct property. * * @return * possible object is * {@link JAXBElement }{@code <}{@link BigDecimal }{@code >} * */ public JAXBElement<BigDecimal> getCommissionPct() { return commissionPct; } /** * Sets the value of the commissionPct property. * * @param value * allowed object is * {@link JAXBElement }{@code <}{@link BigDecimal }{@code >} * */ public void setCommissionPct(JAXBElement<BigDecimal> value) { this.commissionPct = value; } }
オプションで、ADFビジネス・コンポーネント・サービス・インタフェースの生成済サービス・ファクトリ・クラスが定義する組込みメソッドを有効化して、サービス・ビュー・インスタンスを作成できます。たとえば、多相ビュー・オブジェクトの場合、createSalespersonView()
を有効化して、多相ビュー・オブジェクトのインスタンスを作成できます。ファクトリ作成メソッドを使用してビュー・インスタンスの属性を定義する場合、ビュー・オブジェクトの必須属性のメソッド・シグネチャは、オプションで定義できる属性とは異なります。
たとえば、SalepersonViewSDO.java
がビュー・オブジェクトの必須属性のセッターを定義する場合、クライアント・コードは必須属性にJavaプリミティブ値を使用できます。ただし、オプション属性のセッターは、XML要素がなく、ただの空の値でないことを示す特殊な型を使用する必要があります。ファクトリ・オブジェクト・メソッドは、オプションのビュー・オブジェクト属性の特殊な型をサポートします。次の例は、setFirstName
のメソッド・シグネチャがfactory.createSEmpViewSDOFirstName
を起動し、その一方で必須属性のメソッド・シグネチャ(setId
やsetLastName
など)が整数および文字列値を取得することを示しています。
private static SEmpViewSDO testCreate(AppModuleService deptService) throws
ServiceException
{
oracle.summit.model.polymorphicvo.views.common.ObjectFactory factory = new
oracle.summit.model.polymorphicvo.views.common.ObjectFactory();
System.out.println("\n*** Testing createEmp ***\n");
SalespersonViewExSDO salesperson = factory.createSalespersonViewExSDO();
salesperson.setId(8001);
salesperson.setFirstName(factory.createSEmpViewSDOFirstName("Lynn"));
salesperson.setLastName("Munsinger");
salesperson.setEmail
(factory.createSEmpViewSDOEmail("lmunsing@summit.com"));
salesperson.setTitleId
(factory.createSEmpViewSDOTitleId(new BigDecimal(2)));
salesperson.setSalary
(factory.createSEmpViewSDOSalary(new BigDecimal(2000)));
salesperson.setCommissionPct
(factory.createSalespersonViewExSDOCommissionPct(new BigDecimal(20)));
salesperson.setDeptId(factory.createSEmpViewSDODeptId(31));
return printEmp(deptService.createSEmpView1(salesperson));
}
ADFビジネス・コンポーネントでは、SOAPリクエストとしてまたはクライアント・コードでプログラム的に起動される検索メソッドの動作をSOAPクライアントで制御できるようにするFindCriteria
オブジェクトに対して、階層フィルタ・モデルが定義されます。
フィルタ—>グループ—>アイテム
フィルタは、すべての実行時条件を含み、ADF内のビュー基準に対応します。ビュー基準は、定義されたフィルタに一致する行に返されるデータを制限します。実行時に、表示オブジェクトに対するデータ・フィルタを提供するために、フィルタはSQL WHERE句に変換されます。フィルタ内で、グループは、SDOの1つ以上の属性に対する実行時フィルタ条件のセットを含みます。
注意:
検索メソッド問合せに参加する属性は、バッキング表示オブジェクトにより問合せ可能に定義する必要があります。アイテムは、1つのフィルタ条件を特定の属性に定義します。
FindCriteriaオブジェクトのXSDダイアグラムは、検索メソッドの引数が作成される方法を詳細に説明します。
結合(And、Or、Not、AndNot、OrNot)を指定して、複数のアイテムをグループで定義すると、定義フィルタ条件が互いに関係して評価されます。たとえば、AND結合を使用すると、結合した条件のどちらにも一致する問合せ結果が得られます。OR結合を使用すると、結合した条件の少なくとも一方に一致する問合せ結果が得られます。結合が省略されると、Andの動作であると判断されます。
次のブロック・ダイアグラムは、FindCriteriaオブジェクトの包含モデルを別の方法で示します。
FindCriteriaに、フィルタitem
を指定するには、クライアントで次を定義する必要があります。
Attribute
は、フィルタ条件でフィルタ処理される属性名で、大/小文字を区別します。
Operator
は、フィルタ条件に適用されます。演算子は、属性タイプに適しており、oracle.jbo.common.JboCompOper
によって定義されます。例外については、後述の「注意」を参照してください。
Value
は、属性フィルタ基準を指定し、非先導型の%
ワイルドカードを含むことができます。
注意:
SOAPサービス・クライアントでは、oracle.jbo.common.JboCompOper
で定義されるすべての演算子を使用して条件を指定できます。ただし、LIKE (かわりにCONTAINSを使用)、INおよびNOTINは除外されます。演算子INおよびNOTINには、実行時にサポートされているため、プログラム的に適用されます。演算子CONTAINSALLおよびCONTAINSDELIMITEDIDは、複数選択の属性でサポートされています。
加えて、クライアントは、次のFindCriteria要素を指定して、結果セットのレスポンスを形式化します。
FetchStart
(必須)は、ゼロから始まる列索引を指定します。デフォルトは0 (最初の行)です。
FetchSize
(必須)は、受信する行の最大数を指定します。
SortOrder
(オプション)には、昇順または降順で結果セットをソートするディレクティブが含まれます。
FindAttribute
(オプション)は、フィルタ基準が満たされた場合に取得する属性のサブセットを指定します。何も満たされない場合は、すべての属性がフェッチされます。
ExcludeAttribute
(オプション)は、True
に設定される場合のブール・フラッグで、FindAttribute
で指定される属性は返されません。
子オブジェクトの属性が条件的に評価される必要があるまたはペイロードで返される場合(あるいはその両方)、childFindCriteria
構造は、FindCriteria構造内に追加されます。childFindCriteria
の要素は、FindCriteria構造で使用されるものと同様で、加えて、childAttrName
は、フィルタ基準に適用する子オブジェクトを指定します。単一の子オブジェクトのブロック・ダイアグラムを次に示します。
SDOの検索リクエスト・ペイロードを作成するには、検索メソッド・フィルタ・モデルの包含階層を理解する必要があります。ペイロード作成ブロックは、検索メソッドXSDで定義された要素から導出されます。包含階層の詳細は、「コンシューミング・アプリケーションでの検索メソッド・フィルタ・モデルの使用」を参照してください。
Country属性値が、USまたはIEである場所を、50まで検索します。Country、State、ProvinceおよびCity属性のみを返します。結果セットを降順のCountryでソートします。翻訳された値で返さないようにします。
次のリクエストは、この説明に一致するフィルタ済子オブジェクトに対する結果セットを返します。
結果セットの各行(資格を満たすオブジェクト・インスタンス)に対し、EffectiveStartDateが設定されている場合または日付が指定された後に、FloorNumber、Building、City、State、Province、CountryおよびEffectiveStartDate属性を含むLocationProfileを含めます。
標準検索メソッドAPIは、問合せ動作を制御します。APIを使用するには、検索メソッド・フィルタ・モデルの包含階層を理解する必要があります。包含階層の詳細は、「コンシューミング・アプリケーションでの検索メソッド・フィルタ・モデルの使用」を参照してください。
次のサンプルでは、FindCriteria
オブジェクトをプログラム的に作成する手順を示します。
新しいFindCriteria
(フィルタ)を作成します。
新しいViewCriteriaItem
(アイテム)を作成します。
新しいViewCriteriaRow
(グループ)を作成します。
作成したアイテムおよびグループをFindCriteria
に追加します。
//1. Create FindCriteria final FindCriteria findCriteria = (FindCriteria)DataFactory.INSTANCE.create(FindCriteria.class); findCriteria.setFetchStart(0); findCriteria.setFetchSize(-1); findCriteria.setExcludeAttribute(false); //2. Create ViewCriteriaItem final ViewCriteriaItem viewCriteriaItem = (ViewCriteriaItem)DataFactory.INSTANCE.create(ViewCriteriaItem.class); viewCriteriaItem.setConjunction("AND"); //Can also be OR viewCriteriaItem.setUpperCaseCompare(true); viewCriteriaItem.setAttribute("EmpName"); viewCriteriaItem.setOperator("LIKE"); //LIKE used for WILDCARD comparison final List<Object> item_values = new ArrayList<Object>(5); item_values.add(viewCriteriaItem); viewCriteriaItem.setValue(item_values); //3. Create ViewCriteriaRow. //4. Further add ViewCriteriaItem into ViewCriteriaRow and ViewCriteriaRow into FindCriteria. final ViewCriteriaRow viewCriteriaRow = (ViewCriteriaRow)DataFactory.INSTANCE.create(ViewCriteriaRow.class); viewCriteriaRow.setConjunction("AND"); viewCriteriaRow.setUpperCaseCompare(true); final List<Object> item = new ArrayList<Object>(5); item.add(viewCriteriaItem); viewCriteriaRow.setItem(item); findCriteria.getFilter().getGroup().add(viewCriteriaRow);
部分属性リストのリストを使用して問合せをする場合
デフォルトで、検索操作は、すべての詳細を含むすべての属性を返します。一部の属性のみを必要とする場合、検索メソッドのFindCriteria
パラメータに部分属性を設定する必要があります。次の場合に、これを実行します。
SDOがLOBを含む場合で、これは取得および転送するのに非常に費用がかかります。
SDOが翻訳など不要な詳細を含む場合。詳細の問合せもまた費用がかかります。
注意: 標準getXXX
関数は、FindCriteria
を使用しないため、この関数は常にすべてを返します。返される属性を絞り込むには、findXXX
を使用します。
次の例では、部分属性を設定して、Dept
からDname
、Loc
のみを含め、Emp
からEmpno
を除外する方法を示します。
FindCriteria fc = (FindCriteria)datafactory.create(FindCriteria.class); List l = new ArrayList(); l.add("Dname"); l.add("Loc"); l.add("Emp"); fc.setFindAttribute(l); List cfcl = new ArrayList(); ChildFindCriteria cfc = (ChildFindCriteria)datafactory.create(ChildFindCriteria.class); cfc.setChildAttrName("Emp"); List cl = new ArrayList(); cl.add("Empno"); cfc.setFindAttribute(cl); cfc.setExcludeAttribute(true); cfcl.add(cfc); fc.setChildFindCriteria(cfcl); DeptResult res = svc.findDept(fc, null);
次の例では、部分属性を設定して、PurchaseOrder
からPurchaseOrderLine
を除外する方法を示します。
FindCriteria fc = (FindCriteria)datafactory.create(FindCriteria.class); List l = new ArrayList(); fc.setExcludeAttribute(true); l.add("PurchaseOrderLine"); fc.setFindAttribute(l); PchaseOrderResult res = svc.findPurchaseOrder(fc, null);
ビュー基準を使用して結果をフィルタ処理する場合
検索APIにより、WHERE句を問合せに指定できます。WHERE句は、SDOの任意のレベルで設定できます。
次の例では、10より数が大きい部門番号で、名前が"A"で始まる子従業員のみを取得する方法を示します。
FindCriteria fc = (FindCriteria)datafactory.create(FindCriteria.class); //create the view criteria item List value = new ArrayList(); value.add(new Integer(10)); ViewCriteriaItem vci = (ViewCriteriaItem)datafactory.create(ViewCriteriaItem.class); vci.setValue(value); vci.setAttribute("Deptno"); List<ViewCriteriaItem> items = new ArrayList(1); items.add(vci); //create view criteria row ViewCriteriaRow vcr = (ViewCriteriaRow) datafactory.create(ViewCriteriaRow.class); vcr.setItem(items); //create the view criteria List group = new ArrayList(); group.add(vcr); ViewCriteria vc = (ViewCriteria)datafactory.create(ViewCriteria.class); vc.setGroup(group); //set filter fc.setFilter(vc); List cfcl = new ArrayList(); //create the child find criteria ChildFindCriteria cfc = (ChildFindCriteria)datafactory.create(ChildFindCriteria.class); cfc.setChildAttrName("Emp"); //create the child view criteira ViewCriteria cvc = (ViewCriteria)datafactory.create(ViewCriteria.class); cfc.setFilter(cvc); //create the view criteria item List cvalue = new ArrayList(); cvalue.add("A%"); ViewCriteriaItem cvci = (ViewCriteriaItem)datafactory.create(ViewCriteriaItem.class); cvci.setValue(value); cvci.setAttribute("Dname"); cvci.setOperator("LIKE"); List<ViewCriteriaItem> citems = new ArrayList(1); citems.add(cvci); //create child view criteria row ViewCriteriaRow cvcr = (ViewCriteriaRow) datafactory.create(ViewCriteriaRow.class); cvcr.setItem(citems); List cgroup = new ArrayList(); cgroup.add(cvcr); cvc.setGroup(cgroup); DeptResult dres = svc.findDept(fc, null);
特定の基準を満たす親と子を問い合せることもできます。たとえば、次の例では、給与が$10,000を超える従業員がいる部門を取得します。
//create the view criteria item on the employees List nvalue = new ArrayList(); nvalue.add(new BigDecimal(10000)); ViewCriteriaItem nvci = (ViewCriteriaItem)datafactory.create(ViewCriteriaItem.class); nvci.setValue(nvalue); nvci.setAttribute("Salary"); nvci.setOperation(">"); List<ViewCriteriaItem> nitems = new ArrayList(1); nitems.add(nvci); //create view criteria row ViewCriteriaRow nvcr = (ViewCriteriaRow) datafactory.create(ViewCriteriaRow.class); nvcr.setItem(nitems); //create the nested view criteria List ngroup = new ArrayList(); ngroup.add(nvcr); ViewCriteria nvc = (ViewCriteria)datafactory.create(ViewCriteria.class); nvc.setGroup(ngroup); //create the view criteria item on the department ViewCriteriaItem vci = (ViewCriteriaItem)datafactory.create(ViewCriteriaItem.class); vci.setAttribute("Emp"); vci.setNested(nvc); List<ViewCriteriaItem> items = new ArrayList(1); items.add(vci); //create view criteria row ViewCriteriaRow vcr = (ViewCriteriaRow) datafactory.create(ViewCriteriaRow.class); vcr.setItem(items); //create view criteria on department ViewCriteria vc = (ViewCriteria)datafactory.create(ViewCriteria.class); List group = new ArrayList(); group.add(vcr); vc.setGroup(group); //set filter FindCriteria fc = (FindCriteria)datafactory.create(FindCriteria.class); fc.setFilter(vc); DeptResult dres = svc.findDept(fc, null);
結果をページングする場合
問合せで返されるデータが大量であることを事前に知っている場合、複数のサービスを起動し、setFetchStart
およびsetFetchSize
を使用して取得するデータの量を制御する必要があります。
次の例では、2番目の従業員および従業員の部門のみを取得する方法を示します。
FindCriteria fc = (FindCriteria)datafactory.create(FindCriteria.class); List cfcl = new ArrayList(); ChildFindCriteria cfc = (ChildFindCriteria)datafactory.create(ChildFindCriteria.class); cfc.setChildAttrName("Emp"); cfc.setFetchStart(1); cfc.setFetchSize(1); cfcl.add(cfc); fc.setChildFindCriteria(cfcl); DeptResult dres = svc.findDept(fc, null);