15 アプリケーション・モジュールによるSOAP Webサービスの作成

この章では、ADFアプリケーション・モジュールの公開方法と、SOAPサービス・インタフェース接続を定義してFusion Webアプリケーションで外部Webサービスとして使用できるようにする方法を説明します。また、公開されたアプリケーション・モジュールを外部サービスとしてFusion Webアプリケーションに組み込む方法についても説明します。

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

サービス対応アプリケーション・モジュールについて

サービス対応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サービスの概要に関する項参照してください。

  • RMIクライアントの認可を有効にするために使用されるbinding_permission_authorization_policyを含め、Oracle Web Services Manager (OWSM)によりサポートされる事前定義済の認可ポリシーの詳細については。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の付録「事前定義済ポリシー」を参照してください。

  • ローカル・サービス・サポートには、「アプリケーション・モジュールのクライアント・インタフェースのプログラム的操作」で説明しているApplicationModuleインタフェースとViewObjectインタフェース・サポートを使用します。

  • oracle.jboパッケージに関連するAPIのドキュメントについては、次のJavadocリファレンス・ドキュメントを参照してください。

サービス対応アプリケーション・モジュールの公開

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デプロイメント・プロファイルを作成して、ターゲット・アプリケーション・サーバーにデプロイする必要があります。

ノート:

SDOパラメータを使用して直接メソッドを実装するのではない点が重要です。SDOフレームワークを使用して、実行時にのみビュー行のタイプをラップします。

アプリケーション・モジュール・サービス・インタフェースの有効化の方法

JDeveloperでアプリケーション・モジュールを編集して、最上位のビュー・オブジェクトを公開し、サポートしているサービス操作を定義するWebサービス・インタフェースを作成します。サービスを有効化でき、サービス・クライアントがアクセス可能にできる最上位のビュー・オブジェクトは、次のとおりです。

  • スタンドアロン・ビュー・オブジェクトのビュー・インスタンス(階層関係に参加しません)

  • マスター詳細関連ビュー・オブジェクトのマスター・ビュー・インスタンス(子ビュー・インスタンスを含みません)

  • 親ビュー・オブジェクトを拡張するビュー・オブジェクトのビュー・インスタンス(多相ビュー・オブジェクトを定義するためのサブタイプ識別子属性を含む必要はありません)

サービス・インタフェースに自動的に参加しないビュー・オブジェクトは、次のとおりです。

標準的なサービス操作の目的は、ビュー・オブジェクトのデータ処理操作を公開することです。標準のサービス操作を起動することで、基になるフレームワーク・オブジェクトで定義したあらゆるビジネス・ロジック(たとえばビジネス・ルールの評価など)が、適用されます。

表15-1は、サービス・ビュー・インスタンスがサポートしている標準操作のリストです。

表15-1 標準ビュー・インスタンス・データ処理操作

操作 メソッド名 操作の説明

Create

create<VOName>

1つのADFビジネス・コンポーネント・ビュー行を作成します。

Update

update<VOName>

1つのADFビジネス・コンポーネント・ビュー行を更新します。

Delete

delete<VOName>

1つのADFビジネス・コンポーネント・ビュー行を削除します。

Merge

merge<VOName>

ADFビジネス・コンポーネント・ビュー行があれば更新し、なければ新しく作成します。

GetByKey

get<VOName>

主キーによって、単一のADFビジネス・コンポーネント・ビュー行を取得します。

Find (ビュー・オブジェクト問合せ文に適用されるビュー基準による)

find<VOName>

選択したビュー・オブジェクトの問合せ文に適用されるSDOベースのビュー基準を使用して、ADFビジネス・コンポーネントのビュー行のリストを検索して戻します。

問合せでは、問合せの実行に必要として定義されたバインド変数は指定してはなりません。サービス・インタフェースは実行時には必須バインド変数を公開しません。このシナリオ用の検索メソッドの作成の詳細は、「必須バインド変数によってフィルタされる宣言的検索操作の公開方法」を参照してください。

Find (ビュー基準による)

find<VOName><VCName>

必要なバインド変数の名前付きビュー基準と値により、ADFビジネス・コンポーネントのビュー行のリストを検索して戻します。これは必須バインド変数に依存しているADFビジネス・コンポーネント・ビュー行のフィルタには適した方法です。

Process

process<VOName>

ADFビジネス・コンポーネント・ビュー行リストに対する作成、更新、削除、またはマージ操作を実行します。指定した操作が特定のリスト内のすべてのオブジェクトに対して適用されます。

ProcessChangeSummary

processCS<VOName>

ADFビジネス・コンポーネント・ビュー行リストに対する作成、更新、または削除操作を実行します。ChangeSummaryオブジェクトでの指定内容に応じて、異なるオブジェクトに対して異なる操作が適用されます。

また、複数の組込みメソッドをオプションでアプリケーション・モジュール(AppModuleService.java)のクライアント・サービス・インタフェースに追加できます。表15-2に、有効にするサービス・ビュー・インスタンスのランタイム・サポートを提供する組込みメソッドのリストを示します。

表15-2 組込みサービス・インタフェース・メソッド

操作 メソッド名と非同期メソッド名 メソッドの説明

オブジェクトと属性のコントロール・ヒント操作の生成

getDfltObjAttr Hints()

getDfltObjAttr HintsAsync()

特定のロケールに基づくオブジェクトについて、オブジェクトと属性の表示名ラベルを含むベースUIヒントを返します。メソッドは、サービスでオブジェクトの名前を受け取り、ベース・ヒントのローカリゼーションを駆動するヒントおよびロケール名(ISO 639-1形式)を取得します。

このメソッドを、Webサービス・コンシューミング・アプリケーションで使用して、サービス・ビュー・インスタンスとその属性の適切なラベルでユーザー・インタフェースを生成できます。表示名UIヒントの指定の詳細は、「サービス・ビュー・インスタンスと属性の表示名の設定方法」を参照してください。

最終更新時間操作の生成

getServiceLast UpdateTime()

getServiceLast UpdateTimeAsync Response()

SOAPサービス・エンドポイントのサービス・スキーマ・ファイルの最終変更時刻を返します。

このメソッドは、オブジェクトがいつ更新されたかを判断するためにサービス・ビュー・インスタンス・スキーマ・ファイル(XSD)をキャッシュするWebサービス・コンシューミング・アプリケーションで使用できます。

エンティティ・リスト操作の生成

getEntityList()

getEntityListAsync()

サービス・ビュー・インスタンス名と、SOAPサービス・エンドポイントの各サービス・ビュー・オブジェクトが「作成」、「更新」、「マージ」および「削除」操作をサポートするかどうかを示すフラグのリストを返します。

このメソッドは、カスタム・オブジェクト・サービスを使用して使用可能な操作を判断するWebサービス・コンシューミング・アプリケーションで使用できます。カスタム・オブジェクト・サービスは、設計時にADFビジネス・コンポーネントWebサービスを使用して作成されず、このドキュメントでは説明しません。

始める前に:

SDOフレームワークによって、サービス対応ADFアプリケーション・モジュールがどのようにサポートされ、Webサービス・クライアントのデータ行アクセスやサービス操作がどのように有効化されるかについて、理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

サービス対応アプリケーション・モジュールは、標準Webサービス(@WebServiceの注釈の付いたJavaクラスまたはJavaインタフェース)がすでに含まれているプロジェクトには作成しないでください。JDeveloperのデプロイメント・プロファイルでは、同じプロジェクトに属する標準WebサービスとADFビジネス・サービスのデプロイはサポートされません。標準Webサービスと同じプロジェクトに属するADFビジネス・サービスのWebサービスをデプロイしようとすると、Oracle WebLogic Server例外エラーが発生してデプロイメントが失敗します。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

Webサービス・インタフェースを作成するには:

  1. 「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。

  2. 概要エディタで、「サービス・インタフェース」ナビゲーション・タブをクリックし、サービス・インタフェースのサポートの有効化ボタンをクリックします。

    「サービス・インタフェースの作成」ウィザードを使用して、該当するオプションを構成します。

  3. 「サービス・インタフェースの作成」ウィザードの「サービス・インタフェース」ページで、Webサービスの名前とターゲット・ネームスペースを入力します。

    ターゲット・ネームスペースはサービスのURIで、同じURIを入力することで、類似のサービスをグループ化するために割り当てることができます。デフォルトのターゲット・ネームスペースは、「プリファレンス」ダイアログで指定したパッケージ名と組み合せたアプリケーション・モジュールのパッケージ名です。

    ヒント:

    URIを成形するJDeveloperプリファレンスを定義し、サービスの一意のターゲット・ネームスペースを定義できます。ネームスペースURI成形プリファレンスの詳細は、「ADF Webサービス・インタフェース生成用プリファレンスの設定方法」を参照してください。

  4. アプリケーション・モジュールのメソッドを非同期サービス・メソッドとして公開し、Webサービスで同期と非同期の両方の操作を有効にするには、「非同期Webサービス・メソッドの生成」を選択します。

    デフォルトでは、Webサービスは同期サービス・メソッドをサポートしています。これによってクライアント・アプリケーションを強制的に起動して待機させ、レスポンスが返されるまで作業を続行できません。レスポンスが即座に返る場合、このWebサービス呼出しの方法が一般的です。しかし、リクエスト処理が遅延する場合もあるため、クライアント・アプリケーションは先に処理を続行し、後でレスポンスを処理するほうが効率的なことも少なくありません。

  5. 以前に定義したカスタマイズ・ロールに基づいてロール形成が定義されていないかぎり、Service Categoriesリストは空白になります。組織でサービスを分類していないかぎり、「選択済」は空白のままにしてください。

    この機能はサービスWSDLファイルに影響がなく、Webサービス操作に関係しません。

  6. 「サービス組込みメソッド」ページで、オプションで「オブジェクトと属性のコントロール・ヒント操作の生成」を選択して、ビュー・インスタンスに定義された静的コントロール・ヒント(UIヒント)とその属性を返すメソッドを生成します。

    このオプションを有効にすると、ウィザードがgetDfltObjAttrHints()メソッドをクライアント・サービス・インタフェース(AppModuleService.java)に追加します。Webサービス・コンシューミング・アプリケーションは、このメソッドを起動して、データベース・ラウンドトリップを必要とせずにサーバー上のUIヒントを解決できます。メソッドはサービス・ビュー・オブジェクト名とロケール名を受け取り、特定のロケールに基づくオブジェクトについて、オブジェクトと属性の表示名ラベルを含むベースUIヒントを返します。ロケール名が指定されていない場合、メソッドはデフォルト・ロケールを使用します。

  7. オプションで、「最終更新時間操作の生成」を選択して、サービス・スキーマ・ファイルの最終変更時刻を返すメソッドを生成します。

    このオプションを有効にすると、ウィザードがgetServiceLastUpdateTime()メソッドをクライアント・サービス・インタフェース(AppModuleService.java)に追加します。カスタマイズが行われる前に、このメソッドは最終更新スキーマ・ファイルのファイル・タイムスタンプを返します。スキーマが実行時にカスタマイズされると、最終更新タイムスタンプが更新され、この最新のタイムスタンプが返されます。この機能は、主に、サービスXSDをキャッシュするWebサービス・コンシューミング・アプリケーションで役立ちます。

  8. オプションで、「エンティティ・リスト操作の生成」を選択して、サービス・ビュー・インスタンスのリストを返すメソッドを生成します。

    このオプションを有効にすると、ウィザードがgetEntityList()メソッドをクライアント・サービス・インタフェース(AppModuleService.java)に追加します。メソッドは、サービス・ビュー・インスタンス名、XSDタイプ、およびサービス・ビューが「作成」、「更新」、「マージ」および「削除」操作をサポートするかどうかを示すフラグのリストを返します。この機能は、主に、カスタマイズを必要とするWebサービス・コンシューミング・アプリケーションで役立ちます。

  9. 「サービス・カスタム・メソッド」ページで、サービス・インタフェースに公開するカスタム・メソッドを追加し、各メソッドのパラメータと戻り値のデータ型を定義します。

    有効にするカスタム・サービス・メソッドのパラメータとvoid以外の戻り値は、サービス・インタフェースでサポートされているデータ型(Javaプリミティブ・タイプなど)またはそのようなデータ型のリスト(oracle.jbo.server.ViewRowImpljava.util.List<ViewRowImpl>oracle.jbo.AttributeListjava.util.List<AttributeList>java.util.List<PrimitiveType>など)である必要があります。

    ViewRowImplおよびAttributeListの両方のデータ型は、Webサービス・クライアントに対して同一の行構造で公開されますが、実行時には基本的な違いがあります。サポートされているデータ型の詳細は、「ADF Webサービス・インタフェース上のメソッド・シグネチャに関する必知事項」を参照してください。

    ViewRowImplまたはAttributeListデータ型を使用して、各パラメータと戻り値に対して、サービス・インタフェース内で使用可能なカスタム・メソッドを選択後、行構造に対応するビュー・オブジェクト・インスタンスの名前を選択する必要があります。

    1. 「選択済」リストで、returnまたはparametersを展開して、項目を選択します。

    2. Java要素データ型を「要素Javaタイプ」に入力します。

    3. Java要素型がViewRowImplまたはAttributeListの場合は、「要素のビュー・オブジェクト」に行構造を識別するビュー・オブジェクト・インスタンス名を入力します。

      たとえば、CustomerInfoビュー・オブジェクト・インスタンスの単一行を定義する場合、次のようなカスタム・メソッド・シグネチャが必要になります。

      public ViewRowImpl findCustomerInfo(int id)
      

      次にサービス・インタフェース内での表示用にfindCustomerInfo()カスタム・メソッドを選択した後、その戻り値をツリー内で選択し、「ビュー・オブジェクト」プロパティを、実行時に行構造を使用するビュー・インスタンスの名前であるCustomerInfoに設定します。

  10. カスタム・メソッドの警告のサービス情報メッセージやプロセス処理メソッドの警告を公開するには、「戻りサービス・データ・オブジェクトに警告を含める」を選択します。

    たとえば、従業員給与の合計を返すメソッドで合計が望ましい範囲を超えている場合に、情報メッセージを表示するとします。

    「戻りサービス・データ・オブジェクトに警告を含める」が選択されていない場合、サービス・レスポンスとともに情報メッセージは返されません。

    このオプションは、メソッドがビュー行やビュー行のリストを返さない場合にのみ有効になります。メソッドがビュー行を返す場合、メソッドで警告がサポートされるかどうかは、「個別のビュー・オブジェクトのサービス対応化の方法」で説明しているように、基礎となるビュー・オブジェクトによって決定されます。

    情報メッセージ(および警告)は、戻りオブジェクトの一部として報告されます。JDeveloperにより、戻りオブジェクトとして適切なラッパーが生成され、このラッパーに実際のメソッド戻り値と情報メッセージが含まれています。

  11. 「サービス・ビュー・インスタンス」ページで、サービス・インタフェースで公開する、アプリケーション・モジュール内の最上位ビュー・インスタンスを選択します。

    最上位のビュー・レベル・インスタンスのビュー・オブジェクト・サブタイプは、自動的にサービス対応になります。

    このページで、公開したメソッドでサポートされる、使用可能なデータ処理操作も有効にできます(図15-1を参照)。

    図15-1 ビュー・インスタンスとCRUD操作の選択

    この図は周囲のテキストで説明しています
  12. 「基本操作」タブで、現在選択されているビュー・インスタンスのデータ処理操作を選択し、「メソッド名」フィールドで、選択したサービスの操作の名称を、サービス・インタフェースで公開する名前に変更します。

    標準的なサービス操作の目的は、ビュー・オブジェクトのデータ処理操作を公開することです。サービス操作を起動することで、基になるフレームワーク・オブジェクトで定義したあらゆるビジネス・ロジック(たとえばビジネス・ルールの評価など)が、適用されます。サービス・ビュー・インスタンスでサポートされている操作の詳細は、表15-1を参照してください。

    選択可能な検索メソッド操作の場合、検索メソッドはビュー・オブジェクトの問合せ文で必須バインド変数を参照してはなりません。必須バインド変数は、有効なバインド変数値がなければ問合せの実行ができないようにするものです。サービス・インタフェースは実行時には必須バインド変数を公開しません。このシナリオ用の検索操作の定義の詳細は、「必須バインド変数によってフィルタされる宣言的検索操作の公開方法」を参照してください。

  13. 宣言的検索操作を公開するには、「ビュー基準の検索操作」タブを選択し、「ビュー基準の追加」アイコンをクリックします。

    カスタム検索操作を定義して、事前に定義された問合せの実行をサービスにサポートさせることができます。名前付きビュー基準の定義の詳細は、「名前付きビュー基準の処理」を参照してください。

    注意:

    サービス・インタフェースの検索操作は、プロジェクトで定義された特定のビュー基準に基づいています。したがって、ビュー基準のバインド変数が対応する検索操作メソッドのパラメータと一致しなければなりません。検索操作を定義しサービス・インタフェースを生成した後、バインド変数の数や順番を変更すると、対応するメソッドが実行時に実行されなくなります。したがって基にあるビュー基準を変更したら、サービス・インタフェースを生成しなおす必要があります。

    1. 「ビュー基準検索操作の構成」ダイアログで、検索操作用の名前付きビュー基準を選択します。

      このダイアログには、参照先のビュー・オブジェクトが公開しているビュー基準のリストが表示されます。たとえば、OrdersViewはオーダーIDを指定するバインド変数OrdIdを使用して、OrdersViewCriteriaを定義しています(図15-2を参照)。

      図15-2 名前付きビュー基準に基づく専用検索メソッド

      この図は周囲のテキストで説明しています
    2. ビュー基準でバインド変数が使用されている場合、XML名をダブルクリックして、XML定義内でそのサービスが表示される名前をカスタマイズできます。

  14. 「次」をクリックして、サービス・ビュー・インスタンスによって公開されるカスタム・メソッドを確認します。

  15. 「終了」をクリックします。

アプリケーション・モジュール・サービス・インタフェース作成時の処理

JDeveloperはサービス・インタフェース・クラスを生成し、選択したすべてのビュー・インスタンス・オプションを有効にします(図15-3を参照)。

サービス対応アプリケーション・モジュール用に生成されたファイルは変更しないでください。生成されたファイルにより、サービス・インタフェースに必要なメソッドが実装されます。この例外となるのは、サービス実装クラスにJava注釈を追加する必要があるユースケースです。たとえば、サービス・インタフェース実装クラスに注釈を追加することにより、「SOAPクライアントによるアクセス用にADF Webサービスを保護する方法」で説明しているように、セキュリティ・ポリシーを追加できます。

図15-3 アプリケーション・モジュールの概要エディタの「サービス・インタフェース」ページ

図15-3の説明が続きます
「図15-3 アプリケーション・モジュールの概要エディタの「サービス・インタフェース」ページ」の説明

次の種類のファイルが生成され、「アプリケーション」ウィンドウの「プロジェクト」パネルで、アプリケーション・モジュールの「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サービス・インタフェースは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サービス・スキーマ

Webサービス・スキーマ・ファイルはWebサービス・スキーマを示すXMLスキーマ・ファイルです(図15-5を参照)。

図15-5 Webサービス・スキーマ・ファイル

図15-5の説明が続きます
「図15-5 Webサービス・スキーマ・ファイル」の説明
Webサービス定義ファイルで生成されるWSDL

Webサービス定義ファイルは、Web Service Definition Language (WSDL)仕様に準拠したXML構造化ドキュメント・ファイルで、生成されたWebサービスをエンドポイント、すなわちポートの集合として記述します。ポートは、ネットワーク・アドレスを再利用可能なバインドに関連付けることで定義されます。Webサービスに接続したクライアント・アプリケーションはWSDLを読み取り、サーバー上で提供されている機能を判断します。WSDLはサービス自体のエンドポイントも指定しており、デプロイ済のサービスの検索およびテストに使用できます。

図15-6は、WSDLビジュアル・エディタ内でServiceAppModuleアプリケーション・モジュール用に生成されたWebサービス用のWSDLを示しています。「ソース」タブを選択すると、WSDLをXMLドキュメントとして表示できます。

図15-6 WSDLドキュメント

図15-6の説明が続きます
「図15-6 WSDLドキュメント」の説明
サービス実行クラスにより指定されるステートレス・セッションBean

サービス実装クラスとは、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ファイルで定義される参照

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サービス・インタフェースは、ベース・ビュー・オブジェクトに対しては厳密に型指定されますが、多相サブタイプに対しては異なります。たとえば、SalespersonViewExSEmpViewを拡張し、属性CommissionPctを追加してサブタイプを定義すると想定します。サービス対応ビュー・インスタンス用のサービス・インタフェースを生成する場合、図15-7に示すように、「アプリケーション」ウィンドウに、サービス・インタフェースとサービス・オブジェクトが表示されます。

図15-7 多相サブタイプ用に生成されたサービス・オブジェクト

図15-7の説明が続きます
「図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用のインポート定義を表す方法を示しています。

図15-8 Web サービス・スキーマによる多相ビュー・オブジェクトの慣用名のインポート

図15-8の説明が続きます
「図15-8 Web サービス・スキーマによる多相ビュー・オブジェクトの慣用名のインポート」の説明

ADF Webサービス・インタフェース上のメソッド・シグネチャに関する必知事項

アプリケーション・モジュールに対して、クライアント・インタフェースとサービス・インタフェースという2種類のインタフェースを定義できます。クライアント・インタフェースは、ADFモデルがUIクライアント用に使用します。サービス・インタフェースはアプリケーションの統合用で、外部のWebサービスまたはその他のアプリケーション・サービスによって使用されます(プログラミングによって、またはサービス対応エンティティ機能を使用して自動的に)。

アプリケーション・モジュールではインタフェースをまったくサポートしないことも、クライアント・インタフェースまたはサービス・インタフェースのいずれかだけをサポートすることも、両方を組み合せてサポートすることもできます。ただし、それぞれのインタフェース用に定義するカスタム・メソッドのパラメータや戻り値としてサポートされているデータ型は、2種類のインタフェースで異なっている点に注意してください。クライアント・インタフェースでサポートされている型の詳細は、「クライアント・インタフェースのメソッド・シグネチャに関する必知事項」を参照してください。

サービス・インタフェースは、クライアント・インタフェースよりも限定的なカスタム・メソッド・パラメータと戻り値をサポートしています(次に限定されている)。

  • Javaプリミティブ・タイプとそのオブジェクト・ラッパー型(intIntegerLongなど)

  • 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>が定義されている場合は、アプリケーションは自動的に次を行います。

  1. 主キー、代替キーのいずれかまたは両方で、対応するビュー・オブジェクト・インスタンス内の行を検索

  2. 行が検出されない場合は、新しい行を作成

  3. 検出された行または新規行に属性の変更を適用

メソッド・シグネチャでAttributeListのデータ型が定義されている場合は自動動作は行われず、カスタム・メソッドで実行されるアクションおよび変更されるデータは、カスタム・メソッドのコードに限定されます。

行ファインダとADF Webサービス操作に関する必知事項

ビュー・オブジェクト行検索を作成すると、公開されるサービス・ビュー・インスタンスのサービス操作は、行検索により定義されるキー以外の属性を使用した行の参照をサポートします。たとえば、サービスで行検索を起動して、従業員ID (行キー属性)のかわりに従業員の電子メール・アドレスを使用して従業員を検索できます。行検索がビュー・オブジェクトの非キー属性で定義されていて、エンド・ユーザーがこの属性の値をWebサービス・ペイロードで指定する場合、サービスは自動的に行検索を起動して一致する行を特定します。電子メール・アドレスが行検索の唯一の必須の値である場合は、サービスの更新操作により、エンド・ユーザーは電子メール・アドレスでのみ識別される従業員のレコードを更新できます。サービス・ビュー・インスタンスで使用するための行検索の定義の詳細は、「行検索の使用」を参照してください。

個別のビュー・オブジェクトのサービス対応化の方法

アプリケーション・モジュール用の概要エディタを使用してWebサービス・インタフェースを有効にすることで、JDeveloperは親のビュー・インスタンス選択をService Data Object (SDO)コンポーネントとして自動的に有効化します。各ビュー・インスタンス用に生成されたSDOコンポーネントは同じネームスペースを参照し、警告のサポートの有無など、同じオプション設定で構成されます。概要エディタの「Java」ページを使用して、既存のサービス対応ビュー・オブジェクトのSDO定義をカスタマイズできます。「Java」ページを使用して、サービス・インタフェースにまだ追加されていなかったビュー・オブジェクトをサービス対応にすることもできます。たとえば、マスター/ディテール関係でマスターとなる親ビュー・オブジェクトを選択しても、子ビュー・オブジェクトは自動的にサービス対応となりません。子ビュー・オブジェクトの概要エディタで「Java」ページを使用して、サービス・インタフェースに個別に追加できます。

ビュー・オブジェクトの概要エディタで「Java」ページを使用して、ビュー・オブジェクトのSDO名とネームスペースを構成するか、子ビュー・オブジェクトを個別に選択してサービス対応にします。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。

  2. 「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従って、アプリケーション・モジュールのサービス・インタフェースを有効にします。

  3. オプションで、JDeveloperプリファレンスを設定して、生成されるSDOクラス名のデフォルト接尾辞の指定、サービス共通のインタフェースとクラスが入るサブパッケージの変更、および生成されるSDOスキーマとWebサービスのデフォルトのネームスペース接頭辞の設定を行います。「ADF Webサービス・インタフェース生成用プリファレンスの設定方法」を参照してください。

ビュー・オブジェクトのSDO名とネームスペースを設定するには:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「Java」ナビゲーション・タブをクリックし、「Javaオプションの編集」ボタンをクリックします。
  3. 「Javaオプションの選択」ダイアログの「サービス・データ・オブジェクト」セクションで、「サービス・データ・オブジェクト・クラスの生成」を選択します。サービス・オブジェクト名と、サービス・データ・オブジェクトのターゲット・ネームスペースの値を入力します。

    ターゲット・ネームスペースは、SDOコンポーネントのURIです。同じURIを入力して類似のSDOコンポーネントをグループ化する場合に割り当てることができます。

    SDOコンポーネントのパッケージ名を基に、ピリオドを「/」に置き換えたデフォルトのSDOネームスペースが作成されます。「プリファレンス」ダイアログの「サービス」ページで、ネームスペースの接頭辞を定義している場合は、実行時に、その接頭辞がネームスペースの冒頭に追加されます。たとえば、図15-9はパッケージ名に基づくデフォルト・ネームスペースを示しています。

    図15-9 サービス・データ・オブジェクト名とネームスペース・オプション

    図15-9の説明が続きます
    「図15-9 サービス・データ・オブジェクト名とネームスペース・オプション」の説明
  4. サービス・インタフェース・オブジェクトのビュー行に関連する警告を抽出できるようにする場合は、「警告のサポート」を選択します。

    たとえば、ビュー・オブジェクトに、Salary属性に対して定義された範囲バリデータがあり、このバリデータの失敗処理が情報警告として指定されているとします。

    「警告のサポート」が選択されていない場合、サービス・レスポンスとともに情報メッセージは返されません。

    警告が有効になっており、基礎となるADFビジネス・コンポーネント・オブジェクトから標準のサービス操作またはカスタム操作のいずれかに警告が生成された場合は、レスポンス・オブジェクトによって警告情報が取得されます。「SDO結果クラスおよびインタフェースにより実装されるコンテナ・オブジェクト」で説明しているように、サービス・オブジェクト結果クラスに対して生成されたメソッドを使用して、ビュー行からメッセージを抽出できます。

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

サービス対応ビュー・オブジェクトのSDOプロパティのカスタマイズ方法

ビュー・オブジェクトの概要エディタを使用して、サービス対応ビュー・オブジェクトのSDOコンポーネント定義をカスタマイズできます。デフォルトでは、サービス対応ビュー・オブジェクトはSDOプロパティとして公開されます。ビュー・オブジェクト定義をカスタマイズすることで、サービス・インタフェースから個別のSDOプロパティを除外できます。数値を定義するSDOプロパティの場合は、2つのプロパティを関連付けて、サービス・インタフェースに単一の複合型として表示させることができます。たとえば、通貨または測定単位を定義する1つのプロパティを、数値を表示する別なプロパティに関連付けることができます。現在サポートされているのは、AmountType(通貨コード)およびMeasureType(測定単位)の複合サービス型だけです。

生成されたSDOコンポーネントでの個別SDOプロパティの除外

アプリケーション・モジュール用の概要エディタを使用してWebサービス・インタフェースを有効にすることで、JDeveloperは親のビュー・インスタンス選択をSDOコンポーネントとして自動的に有効化します。さらに、子ビュー・オブジェクトを個別に選択してサービス対応とし、SDOコンポーネントを生成できます。デフォルトでは、生成されたSDOコンポーネントは、基本ビュー・オブジェクト定義のすべての属性をSDOプロパティとして公開します。サービス・インタフェースにSDOプロパティとして戻させたくない属性は、非表示にできます。

概要エディタの「属性」ページを使用して、サービス・インタフェースから除外するビュー・オブジェクト属性を選択します。 次に、ビュー・オブジェクトの概要エディタの「詳細」タブを使用して、選択した属性をSDOコンポーネントで非表示にします。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。

  2. 「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。

サービス対応ビュー・オブジェクトからSDOプロパティを除外するには:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。
  3. 「属性」ページで、除外するプロパティに対応する属性を選択し、「詳細」タブをクリックして、「SDOプロパティ」の選択を解除します。
複合データ型を使用した関連する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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「エンティティ・ベースのビュー・オブジェクトの作成方法」および「カスタムSQLモード・ビュー・オブジェクトの作成方法」の説明に従って、目的のビュー・オブジェクトを作成します。

  2. 「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。

サービス対応ビュー・オブジェクト内のSDOプロパティを関連付ける手順:

  1. 「アプリケーション」ウィンドウで、ビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。
  3. 「属性」ページで、別のSDOプロパティに関連付けるプロパティに対応する属性を選択します。

    選択する属性は、数値型を定義する必要があります。たとえば、通貨コードを、顧客が支払った金額を表示する属性と関連付けるには、Ordersサービス対応ビュー・オブジェクトのOrderTotal属性を選択します。

  4. 属性を選択したら、「詳細」タブをクリックして、「XSDタイプ」ドロップダウン・リストから目的のサービス・タイプを選択します。

    「XSDタイプ」ドロップダウンが有効でない場合は、概要リストに戻って数値型の属性を選択します。値が数値型ではない属性を、使用可能な複合サービス・タイプに関連付けることはできません。

    SDOフレームワークは、複合サービス・タイプ、AmountTypeおよびMeasureTypeをサポートしています。関連付けるプロパティが通貨情報を指定する場合は、AmountTypeを選択します。関連するプロパティが測定単位を指定する場合は、MeasureTypeを選択します。

  5. currencyCodeまたはunitCodeドロップダウン・リストで、ビュー・オブジェクト属性を選択して複合型を定義します。

    ダイアログが切り替わり、XSDタイプの選択に応じたドロップダウン・リストが表示されます。通貨コードまたは測定単位を決定するために使用される属性を選択します。

サービス対応マスター/ディテール・ビュー・オブジェクトにおけるネスト処理のサポート方法

データ・モデルで親と子のビュー・オブジェクト間のマスター/ディテール関係を定義した場合、マスター・ビュー・オブジェクトに対して有効化するサービス操作が、ディテール・ビュー・オブジェクトでは自動的に実行されない場合があります。デフォルトでは、ディテール・ビュー・オブジェクトに対するポスト操作は、マスター・ビュー・オブジェクトのプライマリ関連元エンティティ・オブジェクトがディテール・ビュー・オブジェクトのプライマリ関連先エンティティ・オブジェクトで構成されている場合にのみサポートされます。このマスター/ディテール関係はコンポジット・アソシエーションとして知られ、「コンポジット・アソシエーションに関する必知事項」で説明するように、関連元エンティティ・オブジェクトにネストされた論理的部分として関連先エンティティ・オブジェクトが含まれる場合にJDeveloperで作成されます。

親とともに子の詳細をポストする、作成、マージ、更新および処理メソッドをサポートするには、次のいずれかのシナリオに従ってビュー・リンクを作成し、マスター/ディテール関係を作成する必要があります。

  • ビュー・リンクがコンポジット・アソシエーションを使用しており、ディテール・ビュー・オブジェクトに対するポスト操作がデフォルトでサポートされる場合。

  • ビュー・リンクがアソシエーションに基づいており、アソシエーションにリンク先アクセッサが生成されており、アソシエーションにカスタム・プロパティSERVICE_PROCESS_CHILDREN=trueが定義されている場合。

  • ビュー・リンクはアソシエーションに基づいていないが、カスタム・プロパティSERVICE_PROCESS_CHILDREN=trueが定義されている場合。

カスタム・プロパティは、ビュー・リンクが定義された任意のビュー・オブジェクトで、コンポジット・アソシエーションを使用せずにネストされた処理をサポートできる便利な方法です。概要エディタでSERVICE_PROCESS_CHILDRENを、ビュー・リンクまたはビュー・リンクのアソシエーション(存在する場合)のカスタム・プロパティとして定義できます。

親と一緒に子の詳細も入手する取得および検索メソッドをサポートするには、マスターおよびディテール・ビュー・オブジェクト間のビュー・リンクでリンク先アクセッサを生成しておく必要があります。リンク先アクセッサでにより、マスターから詳細なビュー・オブジェクトまでの階層が通過できます。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

ビュー・リンクまたはエンティティ・アソシエーションを使用したマスター・ディテール関係の定義方法を理解しておくと、役立つ場合があります。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 該当するビュー・オブジェクトを作成し、「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従い、マスター/ディテール階層の子ビュー・オブジェクトをサービス対応にします。

  2. ビュー・リンクがアソシエーションに基づいていない場合は、概要エディタでビュー・リンクを開き、「関係」ページを表示して、そのビュー・リンクのリンク先アクセッサがあることを確認します。アクセッサを生成し、「関係」ページに表示させるには、「アクセッサの編集」ボタンをクリックし、「ビュー・リンク」ダイアログ内でリンク先アクセッサに対してビュー・オブジェクトでアクセッサを作成を選択します。

    ビュー・リンクがアソシエーションに基づいている場合は、アソシエーションのリンク先のエンティティ・オブジェクトに対して、リンク先アクセッサが存在している必要があります。リンク先アクセッサを作成するには、アソシエーションの概要エディタの「関連」ページを使用します。

マスター/ディテール階層でのネスト処理のサポート手順:

  1. マスター/ディテール階層のビュー・リンクがアソシエーションに基づいていない場合は、「アプリケーション」ウィンドウで、ビュー・リンクをダブルクリックします。ビューがアソシエーションに基づいている場合は、「アプリケーション」ウィンドウ内でアソシエーションをダブルクリックします。

    概要エディタの「関係」ページで、ビュー・リンクの作成方法を確認できます。「属性」セクションで、リンク元とリンク先の属性名を指定します。リンクがアソシエーションに基づいている場合は、属性ハイパーリンクにアソシエーション名が含まれます。それ以外の場合は、ハイパーリンクに基本エンティティ・オブジェクトの名前が含まれます。

  2. 概要エディタで、「一般」ナビゲーション・タブをクリックします。

    ビュー・リンクの概要エディタとアソシエーションに、同様の選択内容が表示されます。

  3. 「一般」ページの「カスタム・プロパティ」セクションを開き、「カスタム・プロパティの追加」アイコンをクリックして、プロパティにSERVICE_PROCESS_CHILDRENを、プロパティ値にtrueを入力します(図15-10を参照)。

    図15-10 ネスト処理をサポートするカスタム・プロパティ

    この図は周囲のテキストで説明しています

SDOクラス作成時の処理

SDOクラスを作成すると、次のファイルが生成され、「アプリケーション」ウィンドウ内の所有ビュー・オブジェクトの下に表示されます。

  • サービス・データ・オブジェクト・インタフェース

  • サービス・データ・オブジェクト・クラス

  • サービス・データ・スキーマ・ファイル

  • サービス・データ・オブジェクト結果クラスとインタフェースは、「Javaオプションの選択」ダイアログで「警告のサポート」を有効化すると生成されます。

サービス対応ビュー・オブジェクト用に生成されたファイルは変更しないでください。生成されたファイルにより、ビュー・オブジェクトのSDOインタフェースに必要なメソッドが実装されます。

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クラスはビュー・オブジェクト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
  {
  ...
  }
SDOスキーマ・ファイルで生成されるビュー・オブジェクト・スキーマ

図15-16に示すようなビュー・オブジェクトSDOスキーマ・ファイルは、SDOスキーマを示すXMLスキーマ・ファイルです。

図15-11 生成されたSDOスキーマ

図15-11の説明が続きます
「図15-11 生成されたSDOスキーマ」の説明
SDO結果クラスおよびインタフェースにより実装されるコンテナ・オブジェクト

ビュー・オブジェクト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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「アプリケーション・モジュールの作成方法」の説明に従って、該当するアプリケーション・モジュールを作成します。

  2. 「名前付きビュー基準を宣言的に作成する方法」の説明に従って、ビュー基準を作成します。「ビュー基準の編集」ダイアログで、基準アイテムをバインド変数として設定し、「検証」フィールドを「必須」に設定します。このような選択によって、有効な値がなければ問合せが実行されなくなります。

必須バインド変数のあるビュー基準に対して検索操作を公開するには:

  1. 「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。
  2. 概要エディタで、「サービス・インタフェース」ナビゲーション・タブをクリックして、「サービス・インタフェースの属性を編集します。」アイコンをクリックします。

    サービス・インタフェースを定義済の場合は、かわりに「サービス・カスタム・メソッドの編集」を選択することもできます。

  3. 「サービス・インタフェースの編集」で、ナビゲーション・リストから「サービス・ビュー・インスタンス」を選択し、名前付きのビュー基準でフィルタするビュー・オブジェクトを「選択済」リストに追加します。
  4. 検索操作を公開するには、ビュー・インスタンスを選択し、「ビュー基準の検索操作」タブをクリックし、「ビュー基準の追加」ボタンをクリックします。
  5. 「ビュー基準検索操作の構成」ダイアログで、検索操作用の名前付きビュー基準を選択します。

    ダイアログには、選択したビュー基準のバインド標準が表示されます。

  6. サービスのXML定義で表示されるバインド変数名をカスタマイズする場合は、「検索操作パラメータ」セクションでXML名をダブルクリックして名前を編集します。
  7. 「OK」をクリックします。

必須バインド変数でフィルタするカスタム検索メソッドの公開方法

ビュー基準に依存する宣言的検索操作を公開するかわりに、データ・モデル・プロジェクトのアプリケーション・モジュール実装クラス内でサービス・メソッドを定義できます。この目的で作成するクラスでは、ビジネス・サービス機能を、実装する単一メソッドにカプセル化できます。カスタム・アプリケーション・モジュールの目的の詳細は、「サービス・メソッドによるアプリケーション・モジュールのカスタマイズ」を参照してください。

次の例は、AppModuleNameImpl.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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「アプリケーション・モジュールのカスタム・クラスの生成方法」の説明に従い、カスタム・アプリケーション・モジュール・クラスを作成します。

  2. 「実行時に名前付きバインド変数を含むWHERE句を追加する方法」の説明に従い、問合せ結果をプログラム的にフィルタし、必要なバインド変数を設定するための、カスタム検索メソッドを作成します。

必須バインド変数を設定する検索メソッドの公開手順:

  1. 「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。
  2. 概要エディタで、「サービス・インタフェース」ナビゲーション・タブをクリックして、「サービス・インタフェースの属性を編集します。」アイコンをクリックします。

    サービス・インタフェースをすでに定義している場合は、「サービス・カスタム・メソッドの編集」アイコンをクリックしてもかまいません。

  3. 「サービス・インタフェースの編集」ダイアログで、ナビゲーション・リストから「サービス・ビュー・インスタンス」を選択し、定義した検索メソッドを「選択済」リストに追加します。
  4. 「OK」をクリックします。

非同期ADF Webサービス・メソッドの生成方法

デフォルトでは、Webサービスは同期サービス・メソッドをサポートしています。これによってクライアント・アプリケーションを強制的に起動して待機させ、レスポンスが返されるまで作業を続行できません。レスポンスが即座に返る場合、このWebサービス呼出しの方法が一般的です。しかし、リクエスト処理が遅延する場合もあるため、クライアント・アプリケーションは先に処理を続行し、後でレスポンスを処理するほうが効率的なことも少なくありません。

始める前に:

SDOフレームワークによって、サービス対応ビュー・オブジェクトがどのようにサポートされ、Webサービス・クライアントのデータ行アクセスやサービス操作がどのように有効化されるかについて、理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

また、非同期のリクエストとレスポンスを使用したWebサービスの起動について理解しておくと役立つ場合があります。詳細は、『Oracle Infrastructure Webサービスの開発』の「非同期Webサービスの開発」、非同期Webサービスの概要に関する項を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  • 非同期Webサービスをデプロイする前に、リクエストおよびレスポンスを格納するためのキューを構成する必要があります。リクエストおよびレスポンス・キューの構成の詳細は、『Oracle Infrastructure Webサービスの開発』の「非同期Webサービスの開発」、リクエストおよびレスポンス・キューの作成に関する項を参照してください。

非同期Webサービス・メソッドの公開手順:

  1. 「アプリケーション」ウィンドウで、アプリケーション・モジュールをダブルクリックします。
  2. 概要エディタで、「サービス・インタフェース」ナビゲーション・タブをクリックして、「サービス・インタフェースの属性を編集します。」アイコンをクリックします。
  3. 「サービス・インタフェース」ページの「サービス・インタフェースの編集」ダイアログで、「非同期Webサービス・メソッドの生成」を選択します。
  4. 「OK」をクリックします。

非同期ADF Webサービス・メソッドの生成時の処理

JDeveloperはWebサービスのサービス・インタフェースを生成し、非同期サービス操作を有効にします。次の例に示すように、クラスの注釈@AsyncWebServiceEmpServiceサービス・インタフェースを非同期と宣言し、インタフェース内の各同期メソッドに対して、サービスが同じメソッド名に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. クライアントが非同期操作をコールします。(図中のステップ1。)

  2. 非同期サービスはリクエストを受信し、リクエストを実際には処理せずに、HTTP確認をクライアントに戻します。(図中のステップ2。)

  3. 最終的には非同期操作が完了し、サーバー側のモジュールがレスポンスをクライアント側に送信します。(図中のステップ3。)

    クライアント側でレスポンスを受信するには、クライアントにサーブレットまたはWebサービスなど、なんらかのHTTPリスナーが必要です。

  4. クライアント側で生成されたWebサービス(コールバック・サービス)が、非同期レスポンスを受信します。(図中のステップ4。)

    ステップ3ではサーバー側のモジュールが、コールバック・サービスに対してクライアントのように機能するので、コールバック・クライアントと呼ばれます。

図15-12 非同期コール・シーケンス

この図は周囲のテキストで説明しています

ADF Webサービス・インタフェース生成用プリファレンスの設定方法

JDeveloperで生成されたサービスに対しては、追加のコントロールが可能です。JDeveloperプリファレンスを設定して、次のタスクを実行できます。

  • 生成されたSDOクラスの名前のデフォルトの接尾辞の指定

  • サービス・インタフェースとクラスが存在するデフォルト・サブパッケージの変更

  • デフォルトのネームスペース接頭辞の設定およびURIから除外するパッケージの名前の指定による、生成されたSDOスキーマおよびWebサービス・ターゲット・ネームスペースのURIの成形。

SDOクラス名接尾辞を設定するには:

  1. メイン・メニューで、「ツール」「プリファレンス」を選択します。

  2. 「プリファレンス」ダイアログで、「ADFビジネス・コンポーネント」を開き、「クラス・ネーミング」を選択します。

  3. 「ビュー・オブジェクト」接尾辞リストに、たとえばSDOのような、SDOの接尾辞を入力します。

生成されたサービス・インタフェースにデフォルト・サブパッケージを設定するには:

  1. メイン・メニューで、「ツール」「プリファレンス」を選択します。

  2. 「プリファレンス」ダイアログで、「ADFビジネス・コンポーネント」 を展開し、「パッケージ」を選択します。

  3. 「クラスに対する関連パッケージの指定」リストで、デフォルト・パッケージ名を指定します。

    • サービス・インタフェース・パッケージ名を設定するには、「クライアント・インタフェース」に値を入力します。(「サービス・インタフェース」に、クライアント・インタフェースに指定したのと同じパッケージ名が表示されます)。デフォルト・パッケージ名はcommonです。

    • 「サービス・インタフェース」「サービス・インタフェース・サブパッケージ」に値を入力します。デフォルトのサブパッケージ名はserviceinterfaceです。

    たとえば「サービス・インタフェース」common「サービス・インタフェース・サブパッケージ」serviceinterface(デフォルト)を入力すると、データ・モデル・パッケージoracle.summit.model.amservice内のデータ・モデル・コンポーネントのサービス・インタフェースが、サブパッケージoracle.summit.model.amservice.common.serviceinterfaceに配置されます。

生成されたSDOスキーマおよびサービス・インタフェース・ターゲット・ネームスペースのURIを成形するには:

  1. メイン・メニューで、「ツール」「プリファレンス」を選択します。
  2. 「プリファレンス」ダイアログで、「ADFビジネス・コンポーネント」を展開し、「サービス」を選択します。
  3. 「デフォルト・ネームスペース接頭辞」の値を入力し、生成されるSDOスキーマとWebサービスの冒頭に追加されるようにします。

    たとえば、「ビュー・オブジェクトの作成」ウィザードのJavaページの「サービス・データ・オブジェクト・クラスの生成」を有効にすると、ネームスペース接頭辞www.globalcompany.example.comがSDOのパッケージ名に追加され、ターゲット・ネームスペースwww.globalcompany.example.com/oracle/summit/model/amservice/common/が作成されます。

  4. 「除外するパッケージ」のパッケージ名のセミコロン区切りリストを入力して、デフォルトのターゲット・ネームスペースのURIを成形します。

    たとえば、ネームスペース接頭辞www.globalcompany.example.comを入力し、SDOのパッケージ名がglobalcompany.summit.model.amservice/の場合、生成されるターゲット・ネームスペースはパッケージ名globalcompanyを間違って複製します。この状況では、パッケージ名globalcompanyを除外して、ターゲット・ネームスペースのURIをwww.globalcompany.example.com/summit/model/amservice/common/として成形できます。

    複数のパッケージ名をセミコロン区切りリストで除外できます。a;a.b<namespace-prefix>/c/dを生成します。サブパッケージ名の場合は、完全修飾パッケージ名を指定してください。たとえば、パッケージ名a.b.c.dでパッケージcを除外するには、a.b.cと入力します。この場合、デフォルトのターゲット・ネームスペースは<namespace-prefix>/a/b/d/を生成します。

サービス・ビュー・インスタンスと属性の表示名の設定方法

表示名は、ユーザー・インタフェースをプログラムで生成し、サービス・ビュー・インスタンスとその属性を正しい識別ラベルとともに表示するために、Webサービス・コンシューミング・アプリケーションをサポートするラベルです。コンシューミング・アプリケーションで実行時にこれらの表示名にアクセスできるようにするには、「サービス・インタフェースの作成」ウィザードを使用して、組込みメソッドgetDfltObjAttrHints()をリモート・クライアント・サービス・インタフェースに追加します。このメソッドでは、コンシューミング・アプリケーションの開発者が、サービス・ビュー・インスタンスとその属性に関連付けられた「表示名」UIヒントをプログラムで取得できます。ビュー・オブジェクトの「プロパティ」ウィンドウでUIヒントを定義します。ここでは、各ビュー・インスタンス名と属性名の単一ラベルおよび複数ラベルを定義できます。たとえば、図15-13に示すように、OrdersVOビュー・オブジェクトのUIヒントをラベルOrderおよびOrdersで定義できます。

図15-13 ビュー・オブジェクトの表示名UIヒント

図15-13の説明が続きます
「図15-13 ビュー・オブジェクトの表示名UIヒント」の説明

始める前に:

次のタスクを完了する必要があります。

ビュー・インスタンスのUIヒント・ラベルとその属性を設定するには:

  1. 「アプリケーション」ウィンドウで、SDOのビュー・インスタンスを定義するアプリケーション・モジュールをダブルクリックします。
  2. 「データ・モデル」リストで、ビュー・インスタンス名を選択し、リストの下にある「ビュー定義」リンクをクリックします。
  3. ビュー・オブジェクトの概要エディタで、「一般」ナビゲーション・タブをクリックします。
  4. メイン・メニューで、「表示」「プロパティ・インスペクタ」の順に選択します。
  5. 「プロパティ・インスペクタ」で、ビュー・オブジェクト・インスタンスのラベルを設定するには、「UIヒント」を展開し、「表示名」「表示名(複数)」のラベルを入力します。
  6. ビュー・オブジェクトの概要エディタで、「属性」ナビゲーション・タブをクリックし、ラベルを付ける属性を選択します。
  7. 「プロパティ・インスペクタ」で、ビュー・オブジェクト属性のラベルを設定するには、「UIヒント」を展開し、「ラベル」「表示名(複数)」のラベルを入力します。

SOAPクライアントによるアクセス用にADF Webサービスを保護する方法

実行時、Webサービス・クライアントはSOAPプロトコルを使用して、アプリケーション・モジュールのサービス対応メソッドを起動します。Oracle Web Service Manager (OWSM)セキュリティ・ポリシーの構成によって、サービスの認証と許可を有効化できます。選択するセキュリティ・ポリシーでは、SOAPクライアント・コールによってSOAPヘッダーの一部として資格証明(SAMLトークン)を提供する必要があります。たとえば受信するSOAPリクエストなどに対するメッセージ保護(整合性および機密保護)を有効化するその他のポリシーも構成できます。

SOAPクライアント用にWebサービスを保護するには:

  1. OWSM認証ポリシーを構成します。

  2. 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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

認証と許可を構成するには:

  1. 「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、「serviceinterface」ノードを開いて、サービス実装クラス(AppModuleServiceImpl.javaノード)をダブルクリックします。

    SummitADF_Examplesワークスペースのoracle.summit.model.amserviceパッケージ内のServiceAppModuleアプリケーション・モジュールから生成されたWebサービスでは、サービス実装クラスはServiceAppModuleServiceImpl.javaです。

  2. サービスが常にSOAPを使用してのみ起動される(RMIは使用しない)場合は、次の手順に従ってOWSM許可ポリシーを使用する必要があります。

    1. サービス実装クラスのソースで、カーソルを@PortableWebService注釈上に配置します。

      たとえば、ServiceAppModuleServiceImpl.javaでは、サービスの注釈が次のように表示されます。

      ...
      @PortableWebService(
        targetNamespace="/oracle/summit/model/amservice/common/",
        serviceName="ServiceAppModuleService",
        portName="ServiceAppModuleServiceSoapHttpPort",
        endpointInterface=
         "oracle.summit.model...common.serviceinterface.ServiceAppModuleService")
      
    2. 「プロパティ」ウィンドウで、「ポリシー」 セクションを開き、「複数ポリシー」フィールドの横にあるボタンをクリックします。

    3. 「プロパティの編集: 複数ポリシー」ダイアログで、目的のセキュリティ・ポリシーを選択し、「OK」をクリックします。

      OWSMでサポートされるセキュリティ・ポリシーの詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』セキュリティ・ポリシー - 認証のみに関する項を参照してください。

    4. ソース・ファイルに戻り、注釈@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")
      })
      
  3. サービスがSOAPとRMIを使用して起動される場合は、次の手順に従って、ServicePermissionCheckInterceptorのみを使用してください(OWSM許可ポリシーを使用する必要はありません)。

    ソース・エディタで@Interceptors注釈にカーソルを置き、ServicePermissionCheckInterceptor.classを追加して、実行時の権限チェックを有効にします。

    ...
    @Interceptors({ ServiceContextInterceptor.class,
                    ServicePermissionCheckInterceptor.class })
    @Stateless(name=
                "oracle.summit.model.amservice.common.ServiceAppModuleServiceBean",
               mappedName="ServiceAppModuleServiceBean")
    
  4. サービス実装クラス・ファイルを保存します。

RMIクライアントによるアクセス用にADF Webサービスを保護する方法

ADF WebサービスはEJBとして実装され、Oracle WebLogic Server上でOracle Web ServiceのPortableWebServiceとしてデプロイされるので、クライアント・アプリケーションは、RMIプロトコルを使用してアプリケーション・モジュールのサービス対応メソッドを起動できます。

RMIクライアント用にWebサービスを保護するには:

  1. JNDIコンテキスト・プロパティを構成して認証を有効にします。

  2. 権限チェックを有効にして、許可ポリシーを構成します。

始める前に:

OWSMでサポートされる事前定義済許可ポリシーについて理解しておくと役立つ場合があります。詳細は、『Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』セキュリティ・ポリシー - 認証のみに関する項を参照してください。

RMIクライアント認証の有効化

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コンテキスト・プロパティを構成します。

  • jndiFactoryInitialweblogic.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コンテキスト・プロパティを構成するには:

  1. 「アプリケーション・リソース」パネルで、「ディスクリプタ」および「ADF META-INF」ノードを開き、「connections.xml」ファイルをダブルクリックします。
  2. ソース・エディタの場合は、JNDIコンテキスト・プロパティを使用してプリンシパルと資格証明を指定します。

    JDeveloperの統合WebLogic Serverでサービスをテストする場合は、次の例に示すように、jndiProviderURLプロパティを指定するだけでかまいません。

    <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="jndiFactoryInitial">
              <Contents>weblogic.jndi.WLInitialContextFactory</Contents>
           </StringRefAddr>
           <StringRefAddr addrType="jndiProviderURL">
               <Contents>t3://a_hostname:7101</Contents>
           </StringRefAddr>
           ...
         </RefAddresses>
      </Reference>
      ...
    </References>
    

    Oracle WebLogic Serverでのテスト用にサービスをデプロイする場合は、connections.xmlファイルを使用してJNDIプロバイダの資格証明を指定できます。次の例に示すように、Oracle WebLogic ServerのJNDIプロバイダにアクセスするための十分な権限を持つ、デフォルト管理者のユーザー名/パスワード資格証明である、weblogic/weblogic1を指定できます。

    <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="jndiFactoryInitial">
              <Contents>weblogic.jndi.WLInitialContextFactory</Contents>
           </StringRefAddr>
           <StringRefAddr addrType="jndiProviderURL">
               <Contents>t3://localhost:8888</Contents>
           </StringRefAddr>
           <StringRefAddr addrType="jndiSecurityPrincipal">
               <Contents>weblogic</Contents>
           </StringRefAddr>
           <SecureRefAddr addrType="jndiSecurityCredentials">
               <Contents>weblogic1</Contents>
           </SecureRefAddr>
           ...
         </RefAddresses>
      </Reference>
      ...
    </References>
    

    本番Oracle WebLogic Serverにサービスをデプロイする場合は、connections.xmlファイルを使用してユーザー名を指定できます。次の例に示すように、パスワードの指定は行わないでください。

    <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="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/">
           ...
         </RefAddresses>
      </Reference>
      ...
    </References>
    
  3. ファイルを保存します。
RMIクライアントの認可の構成

権限チェックを有効化し、十分な権限を持つユーザーのみに、サービス・インタフェース上のサービス・メソッド起動を許可できます。権限チェックを有効にするために、ADFサービス・インタフェース・フレームワークはServicePermissionCheckInterceptorという名前のEJBインターセプタを提供しています。このEJBインターセプタにより、実行時に権限チェックが確実に実行されます。現在、インターセプタはOWSMが許可ポリシーbinding_permission_authorization_policyに対して実装するものと同じロジックでコード化されています。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「RMIクライアント認証の有効化」の説明に従って、クライアント・アプリケーション(サービスを起動するアプリケーション)のconnections.xmlファイルで、サービスの認証ポリシーを構成します。

  2. 「サービスへのアクセスをテスト・ユーザーに許可する方法」の説明に従って、ユーザーにサービスへのアクセスを許可します。

権限ベースの許可ポリシーを構成するには:

  1. 「アプリケーション」ウィンドウで、Webサービス・プロジェクトの「META-INF」ノードを開き、「ejb-jar.xml」ノードをダブルクリックします。
  2. ソース・エディタで、アプリケーションのロール評価のためのEJBに必要な、次のJpsInterceptor定義を追加します。
    <?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>
    
  3. 「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、「serviceinterface」ノードを開いて、サービス実装クラス(AppModuleServiceImpl.javaノード)をダブルクリックします。
  4. ソース・エディタで注釈セクションの最後にカーソルを配置し、ServicePermissionCheckInterceptorという名前の注釈を追加して、実行時の権限チェックを有効にします。
    ...
    @Stateless(name="oracle.summit.model.amservice.common.
                                            ServiceAppModuleServiceBean")
    @Remote(ServiceAppModuleService.class)
    @PortableWebService(targetNamespace="http://www.globalcompany.com/
                           ServiceAppModuleService",
                           serviceName="ServiceAppModuleService",
                           portName="ServiceAppModuleServiceSoapHttpPort",
                           endpointInterface="oracle.summit.model.amservice.
                                common.serviceinteface.ServiceAppModuleService")
    @CallByReference
    @Interceptors({ServiceContextInterceptor.class,
                            ServicePermissionCheckInterceptor.class})
    
  5. ファイルを保存します。

サービスへのアクセスをテスト・ユーザーに許可する方法

サービスの認可ポリシーを構成後、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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「SOAPクライアントによるアクセス用にADF Webサービスを保護する方法」または「RMIクライアントによるアクセス用にADF Webサービスを保護する方法」の説明に従って、サービスの認証および許可ポリシーを構成します。

  2. jazn-data.xmlデプロイメント・ディスクリプタを作成して、OPSSセキュリティ・プロバイダ構成ファイルをプロジェクトに追加します。デプロイメント・ディスクリプタの詳細は、『Oracle JDeveloperによるアプリケーションの開発』「アプリケーションのデプロイ」を参照してください。

    JDeveloper内の「新規ギャラリ」を開いて「一般」を展開し、「デプロイメント・ディスクリプタ」「Oracleデプロイメント・ディスクリプタ」を選択して、「OK」をクリックします。

  3. 「アプリケーション・ロールの作成」の説明に従って、付与対象のアプリケーション・ロールを作成します。

  4. JDeveloperで統合WebLogic Serverを使用してWebサービスをテストするために、「テスト・ユーザーの作成」の説明に従って、アプリケーション・ロールにテスト・ユーザーを追加できます。

jazn-data.xmlファイルでアプリケーション・ロールへのWebサービス権限を付与するには:

  1. メイン・メニューから、「アプリケーション」→「保護」→「リソース権限」または「アプリケーション」→「保護」→「資格付与」を選択します。

    複数の権限を資格セットとしてアプリケーション・ロールに付与したり、リソースに対して個々の権限を付与できます。資格付与を作成するには、特定のエンド・ユーザー職務を保護する複数の権限を集約する場合です。資格付与の詳細は、「リソース権限を資格付与として集約する方法」を参照してください。

  2. jazn-data.xmlファイルのエディタ・ウィンドウで「ソース」タブをクリックします。
  3. jazn-data.xmlファイルのソースで、<policy-store>要素を展開し、アプリケーション用に定義済のすべてのADFセキュリティ・ポリシーを表示します。

    現在、このリリースではアプリケーション・セキュリティ・ポリシー作成用のエディタが提供されていません。jazn-data.xmlファイルのソースで、ポリシーを手動で作成する必要があります。

  4. <jazn-policy>要素内に、該当するアプリケーション・ロールを指定した<grantee>を定義する<grant>要素と、OWSM権限クラスの完全修飾クラス名(oracle.wsm.security.WSFunctionPermission)、サービス・メソッドを一意に識別する権限ターゲット名、およびアプリケーション・ロール・プリンシパルに付与する起動メソッド・アクションを指定した<permission>を作成します。

    完成したソースは次のようになります。

    <grant>
      <grantee>
        <principals>
          <principal>
             <class>oracle.security.jps.service.policystore.ApplicationRole</class>
             <name>customers</name>
          </principal>
         </principals>
      </grantee>
      <permissions>
         <permission>
           <class>oracle.wsm.security.WSFunctionPermission</class>
          <name>www.globalcompany.example.com/
                                     ServiceAppModuleService#CreateAccount</name>
           <actions>invoke</actions>
         </permission>
       </permissions>
    </grant>
    

    <principal>要素は、アプリケーション・ロール・クラス名oracle.security.jps.service.policystore.ApplicationRoleおよび作成済のアプリケーション・ロール名によって定義されます。たとえば、アプリケーション・ロールcustomersを作成済で、そのロールのメンバーに起動サービス・メソッドの権限を付与する場合は、customersと入力します。

    <permission>要素は、OWSMクラス名oracle.wsm.security.WSFunctionPermissionおよび権限ターゲット名によって定義されます。権限ターゲット名は、/serviceInterfaceNameおよび#serviceMethodName(またはワイルドカード文字)をサービス・ターゲット・ネームスペースに付加して作成します。

    ヒント:

    ターゲット・ネームスペースとサービス名は、サービスのWSDL定義ファイルで検索できます。「アプリケーション」ウィンドウでserviceinterfaceノードの下のWSDLファイルをダブルクリックし、nameおよびtargetNamespace定義を表示します。

    たとえば、Summit ADFサンプル・アプリケーションのWSDL定義ファイルでは、次の名前とネームスペースが定義されている場合があります。

    <wsdl:definitions
         name="ServiceAppModuleService"
         targetNamespace="www.globalcompany.example.com"
    

    サービス・インタフェース上で、これらのSummitADF_Examplesワークスペース名とネームスペースを使用して、認可されたユーザーにCreateOrderサービス・メソッドの起動権限を付与する場合は、次のようなターゲット名を入力します。

    www.globalcompany.example.com/ServiceAppModuleService#CreateOrder
    

    あるいはワイルドカード*を使用してターゲット名を入力し、1つの権限でサービス・インタフェースのすべての操作を許可することもできます。

    www.globalcompany.example.com/ServiceAppModuleService#*
    

    入力可能なアクションは権限クラスによって定義されています。この場合、oracle.wsm.security.WSFunctionPermissionは単一のアクションであるinvokeを定義します。

  5. jazn-data.xmlファイルに変更を保存します。

SOAPクライアント用バイナリ添付サポートの有効化の方法

ADFサービス・インタフェースは、Message Transmission Optimization Mechanism (MTOM)を使用して、BlobDomain/ClobDomain属性のViewRowに対して機能するサービス・メソッドでのバイナリ・データ送信処理をサポートしています。これによって、保険金請求書類に画像が必要な場合など、バイナリ・データにXMLメッセージを添付できます。サービス対応アプリケーション・モジュールのSDOデータ・オブジェクトは、BlobDomain/ClobDomainjavax.activation.DataHandlerにマップします。SOAPプロトコルを使用してWebサービスをコールする際、SDOデータ・オブジェクトのマーシャリング/アンマーシャリング中に、これらのDataHandlerプロパティを添付データとして渡すことができます。

SOAPプロトコルのMTOMサポートを有効化するには、@MTOMという注釈をサービス実装クラス(たとえばServiceAppModuleServiceImpl.java)に追加し、また、BlobDomain/ClobDomain属性を持つビュー行に対してメソッドが機能する必要があります。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

バイナリ・データ添付の送信サポートを有効化するには:

  1. 「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、serviceinterfaceノードを開いて、サービス実装クラス(AppModuleServiceImpl.javaファイル)をダブルクリックします。

    SummitADF_Examplesワークスペースのoracle.summit.model.amserviceパッケージ内のServiceAppModuleアプリケーション・モジュールから生成されたWebサービスでは、サービス実装クラスはServiceAppModuleServiceImpl.javaです。

  2. サービス実装クラスのソースで、カーソルを注釈セクション上の任意の場所に配置します。

    たとえば、ServiceAppModuleServiceImpl.javaでは、サービスの注釈セクションは次のようになります。

    ...
    @Stateless(name="oracle.summit.model....common.ServiceAppModuleServiceBean",
        mappedName="ServiceAppModuleServiceBean")
    @Remote(ServiceAppModuleService.class)
    @PortableWebService(targetNamespace="www.globalcompany.example.com",
        serviceName="ServiceAppModuleService",
        portName="ServiceAppModuleServiceSoapHttpPort",
        endpointInterface=
           "oracle.summit.model...common.serviceinterface.ServiceAppModuleService")
    ...
    
  3. 「プロパティ」ウィンドウで、「Webサービス」セクションを開き、「MTOMの有効化」を選択します。

    JDeveloperが注釈@MTOMを、ファイルの注釈セクションに追加します。

    ...
    @Stateless(name="oracle.summit.model....common.ServiceAppModuleServiceBean",
        mappedName="ServiceAppModuleServiceBean")
    @Remote(ServiceAppModuleService.class)
    @PortableWebService(targetNamespace="www.globalcompany.example.com",
        serviceName="ServiceAppModuleService",
        portName="ServiceAppModuleServiceSoapHttpPort",
        endpointInterface=
           "oracle.summit.model...common.serviceinterface.ServiceAppModuleService")
    @MTOM
    ...
    

ClobDomainタイプ属性の文字エンコーディングの指定方法

データベースで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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

ビュー・オブジェクトの個々のClobDomain属性の文字エンコーディングを構成するには:

  1. 「アプリケーション」ウィンドウで、ClobDomain属性が含まれているビュー・オブジェクトをダブルクリックします。

  2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。

  3. 「属性」ページで、「タイプ」列にClobと表示されている属性を選択します。

  4. 「カスタム・プロパティ」タブをクリックし、「追加」アイコンをクリックし、ドロップダウン・リストから「変換不能プロパティ」を選択して、「プロパティ」名フィールドに次の事前定義済カスタム・プロパティの1つを入力します。

    SERVICE_USE_SERVER_DEFAULT_CHARSET - JVMの文字エンコーディングをデータの変換に使用する場合。「値」trueと入力します。

    SERVICE_CLOB_CONVERSION_CHARSET - データの文字エンコーディングに対応する既知の文字エンコーディングを指定する場合。「値」に目的の文字エンコーディングを入力します。たとえば、UTF-16と入力します。値を指定しない場合は、デフォルトのUTF-8が使用されます。

ビュー・オブジェクトのすべてのClobDomain属性の文字エンコーディングを構成するには:

  1. 「アプリケーション」ウィンドウで、ClobDomain属性が含まれているビュー・オブジェクトをダブルクリックします。
  2. 概要エディタで、「一般」ナビゲーション・タブをクリックします。
  3. 「一般」ページで、「カスタム・プロパティ」セクションを展開し、「追加」アイコンをクリックし、ドロップダウン・リストから「変換不能プロパティ」を選択して、「プロパティ」名フィールドに次の事前定義済カスタム・プロパティの1つを入力します。

    SERVICE_USE_SERVER_DEFAULT_CHARSET - JVMの文字エンコーディングをデータの変換に使用する場合。「値」trueと入力します。

    SERVICE_CLOB_CONVERSION_CHARSET - データの文字エンコーディングに対応する既知の文字エンコーディングを指定する場合。「値」に目的の文字エンコーディングを入力します。たとえば、UTF-16と入力します。値を指定しない場合は、デフォルトのUTF-8が使用されます。

Integrated WebLogic Serverを使用したWebサービスのテスト方法

Integrated WebLogic Serverを使用して、JDeveloperでWebサービスを実行できます。Oracle WebLogic ServerにWebサービスをデプロイして、サービスをテストすることもできます。

Integrated WebLogic Serverを使用して実行とテストするには:

  1. 「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、「serviceinterface」ノードを開いて、サービス実装クラス(AppModuleServiceImpl.javaファイル)を選択します。

    SummitADF_Examplesワークスペースのoracle.summit.model.amserviceパッケージ内のServiceAppModuleアプリケーション・モジュールから生成されたWebサービスでは、サービス実装クラスはServiceAppModuleServiceImpl.javaです。

  2. サービス実装クラス・ファイルを右クリックし、「実行」または「デバッグ」を選択します。

    アプリケーションを初めて実行し、新しいドメインを統合WebLogic Serverで開始する際に、「デフォルト・ドメインの作成」ダイアログが表示されます。ダイアログを使用して新しいドメインの管理者パスワードを定義します。入力するパスワードは8文字以上で、数字が含まれている必要があります。

    JDeveloperがサーバー・インスタンスを初期化し、アプリケーションをデプロイしてWebサービスを開始します。この間、これらプロセスからの出力が「ログ」ウィンドウの「実行中」タブに表示されます。Webサービスの開始後、ターゲットURLも「ログ」ウィンドウに表示されます。

    ヒント:

    「ログ」ウィンドウでターゲットURLリンクをクリックすると、HTTPアナライザを起動できます。これは、JDeveloperと統合されたWebLogic Serverでテストを実行する場合のショートカットとして便利です。HTTPアナライザの詳細は、『Oracle JDeveloperによるアプリケーションの開発』「Javaプロジェクトの監査とモニタリング」を参照してください。

  3. 「ログ」ウィンドウからターゲットURL (http://で始まる)をコピーします。

    「ログ」ウィンドウにはたとえば次が表示されます。

    http://<ipaddress>/ADFServiceDemo-ADFModel-context-root

    統合WebLogic Serverにより、サービス・エンドポイントのURLが表示されます。そのため、サービス名を追加する必要はありません。

  4. Webブラウザを起動し、「ログ」ウィンドウからコピーしたターゲットURLをブラウザのアドレス・フィールドにペーストして、HTTPリクエストを送信します。
  5. テスト・ページで、起動する操作を「操作」ドロップダウン・リストから選択し、パラメータ・フィールドにサンプル・データを入力します。
  6. 準備ができたら、「起動」を押して操作を発行し、「テスト結果」ページで操作結果を確認します。

    「テスト結果」ページには、操作で戻された情報のXML Soap形式が表示されます。

カスタム・サービス・メソッドのタイムアウトの防止方法

Webサービスをテストすると、一部のカスタム・メソッドがJava Transaction API (JTA)で設定されたタイムアウト制限を超えていることに気付く場合があります。JTAタイムアウト設定では、サービス・メソッドの実行制限時間をデフォルトでは30秒以内に設定しています。Oracle WebLogic Server管理コンソールを使用して、JTAタイムアウト設定を延長できます。それでもタイムアウト例外を受信する場合や、サービス・インタフェースのカスタム・メソッドの実行に長時間かかることが予想される場合は、ステートレス・セッションBean用のEJBトランザクション属性を指定して、EJBがJTAトランザクションでこれらのメソッドを実行しないようにします。

たとえば、afterCommit()メソッドをコールして、ビュー・オブジェクトまたはエンティティ・オブジェクトからJDBC SQL文を実行すると、次のようなSQLExceptionが発生することがあります:

java.sql.SQLException: The transaction is no longer active - status: 'Committed'. No further JDBC access is allowed within this transaction

afterCommit()メソッドの事例でカスタム操作を実行するには、サービス対応メソッド・アノテーションTransactionAttributeNOT_SUPPORTEDとして構成する必要があります。カスタム・メソッドでタイムアウトが発生しないようにするには、「プロパティ」ウィンドウでそのメソッドに対して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トランザクションで実行されないようにするには:

  1. 「アプリケーション」ウィンドウでアプリケーション・モジュールを開き、「serviceinterface」ノードを開いて、サービス実装クラス(AppModuleServiceImpl.javaファイル)をダブルクリックします。

    SummitADF_Examplesワークスペースのoracle.summit.model.amserviceパッケージ内のServiceAppModuleアプリケーション・モジュールから生成されたWebサービスでは、サービス実装クラスはServiceAppModuleServiceImpl.javaです。

  2. ソース・エディタで、タイムアウトさせたくないカスタム・メソッドを検索して、そのメソッド上にカーソルを置きます。
  3. 「プロパティ」ウィンドウで「ステートレス・セッションBean」を開き、「TransactionAttribute」ドロップダウン・リストから「TransactionAttributeType.NOT_SUPPORTED」を選択します。

    前に示したサービス・メソッドの例で、NOT_SUPPORTED注釈のupdateCustomerInterests()に示されているように、JDeveloperによって、カスタム・サービス・メソッドが注釈付きで更新されます。

  4. サービス実装クラスを保存します。
  5. 「アプリケーション」ウィンドウで、アプリケーション・モジュール実装クラス(AppModuleImpl.java)のファイルをダブルクリックします。

    この実装クラスはサービス・インタフェースで公開されるカスタム・メソッドを定義します。SummitADF_Examplesワークスペースでは、アプリケーション・モジュール実装クラスはoracle.summit.model.amservice.ServiceAppModuleImpl.javaです。

  6. ソース・エディタで、TransactionAttributeプロパティを設定したサービス・メソッドを実装するカスタム・メソッドに、トランザクションのコミットとロールバックを行うカスタム・コードを追加します。

    前に示したサービス・メソッドの実装例で示されているように、updateCustomerInterests()という名前のサービス・メソッドにTransactionAttributeプロパティを構成した場合、アプリケーション・モジュールの実装クラスを開き、カスタム・メソッドupdateCustomerInterests()を検索して、am.getDBTransaction().commit()およびrollback()をメソッドのtryおよびcatch文に追加します。

  7. アプリケーション・モジュール実装クラスを保存します。

Oracle WebLogic ServerへのWebサービスのデプロイ方法

たとえば、サービスのテストの第2段階を実行するために、Oracle WebLogic ServerにWebサービスをデプロイすることができます。

始める前に:

SDOフレームワークによるサービス対応ADFビュー・オブジェクトのサポート方法と、Webサービス・クライアントによるデータ行のアクセスやサービス操作の許可方法を理解しておくと便利です。詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. プロジェクトに標準Webサービス(@WebService注釈付きのJavaクラスまたはJavaインタフェース)が含まれている場合は、ビジネス・コンポーネントのWebサービスをデプロイする前に、該当Javaクラスから@WebService注釈を削除する必要があります。標準Webサービスと同じプロジェクトに属するビジネス・コンポーネントのWebサービスをデプロイしようとすると、Oracle WebLogic Server例外エラーが発生してデプロイメントが失敗します。そのため、標準Webサービスは、ADFビジネス・コンポーネント・サービスとは別のプロジェクトに作成する必要があります。

  2. 非同期Webサービスを作成した場合は、サービスのデプロイ前に、リクエストおよびレスポンスを格納するためのキューを構成する必要があります。リクエストおよびレスポンス・キューの構成の詳細は、『Oracle Infrastructure Webサービスの開発』の「非同期Webサービスの開発」、リクエストおよびレスポンス・キューの作成に関する項を参照してください。

  3. 「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> 
    
  4. 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へのデプロイ手順:

  1. Oracle WebLogic Serverにアプリケーション・サーバーの接続を作成する手順:

    1. メイン・メニューで、「ウィンドウ」「アプリケーション・サーバー」を選択します。

    2. 「アプリケーション・サーバー」ウィンドウで、「アプリケーション・サーバー」ノードを右クリックし、「新規アプリケーション・サーバー」を選択して、「アプリケーション・サーバー接続の作成」ウィザードを完了します。

  2. サービス・デプロイメント・プロファイルの作成:

    1. 「アプリケーション」ウィンドウで、Webサービスが含まれているプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。

    2. 「プロジェクト・プロパティ」ダイアログの「デプロイメント」ページを開き、 「新規」をクリックします。

    3. 「デプロイメント・プロファイルの作成」ダイアログで、アーカイブ・タイプとして「ビジネス・コンポーネント・サービス・インタフェース」を選択します(図15-14を参照)。

      図15-14 ビジネス・コンポーネント・サービス・デプロイメント・プロファイルの作成用ダイアログ

      この図は周囲のテキストで説明しています
  3. メイン・メニューで、作成したデプロイメント・プロファイルに対して、「アプリケーション」→「デプロイ」を選択し、作成したデプロイメント・プロファイルを選択します。

  4. 「デプロイ」ウィザードの「デプロイメント・アクション」ページで、「アプリケーション・サーバーへのデプロイ」を選択し、「次へ」をクリックします。

  5. 「サーバーの選択」ページで、アプリケーション・サーバー接続を選択します。

  6. 「OK」をクリックします。

サービス対応アプリケーション・モジュールによるリモート・データのアクセス

ADFアプリケーション・モジュールは、サービス・データ・オブジェクト(SDO)を公開します。SDOを利用するためのサービスバック・エンティティ・オブジェクトを作成して、ビジネス・サービスをSOAPサービスに公開できます。

ADFビジネス・コンポーネント・アプリケーションはWebサービス用の組込みサポート、およびビュー・オブジェクト・データをサービス・データ・オブジェクト(SDO)として公開するための組込みサポートを提供しています。ローカル・データ・モデル・プロジェクト内で作成するエンティティ・オブジェクトは、サービス対応アプリケーション・モジュールがそのサービス・インタフェースで公開するSDOサービスを利用できます。ローカル・オブジェクト内でサービスバック・エンティティ・オブジェクトを作成することで、すべての共通Webサービス・データ・アクセス・タスクに対して、サービス・プロキシとSDOをプログラミングによって直接扱う必要がなくなります。

「エンティティ・オブジェクトの作成」ウィザードを使用すると、「サービス対応エンティティ・オブジェクトとビュー・オブジェクトの使用方法」で説明しているように、エンティティ・オブジェクトの作成時にローカル・データベースとADFビジネス・コンポーネントWebサービスを簡単に選択できます。このようにすると、サービス対応アプリケーション・モジュールにより、データベースでローカルに使用できないデータにアクセスするための代替の方法が提供されます。

サービスバック・エンティティ・オブジェクトを作成すると、ビュー・オブジェクト、ビュー・リンクおよびビュー基準を作成して、実行時にデータをフィルタできるようになります。また、あたかもデータベース表からローカルに提供されたデータにアクセスして作業しているかのように、これらのビュー・データをデータ・モデルで活用することもできます。

次の各項では、サービス対応ADFアプリケーション・モジュールを使用して、データ・モデル・プロジェクトを強化する方法を説明します。

サービス対応エンティティ・オブジェクトとビュー・オブジェクトの使用方法

次のいずれかの状況が発生した場合に、アプリケーション設計戦略の一環として、サービスバック・コンポーネントを使用できます。

  • クライアント・データ・モデル・プロジェクトで、別なビジネス・プロセスに含まれているサービス対応アプリケーションを使用する必要がある場合。

  • クライアント・データ・モデル・プロジェクトで、プラガブルな外部サービスを使用する必要がある場合。

最初の場合は、サービスの両側を提供します。2番目の場合は、外部サービスが不明なことがあるので、次を行う必要があります。

  1. サービスのFusion実装は必要ないかもしれませんが、サービス対応アプリケーション・モジュールのサービス・インタフェースがプラガブル機能のサポート単位になっており、サービスバック・エンティティ・オブジェクトおよびビュー・オブジェクト作成方法としてサポートされているので、「標準的な」プラガブル・サービスに求める形状をサービス・インタフェースに記述してアプリケーション・モジュールを作成します。

  2. 「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従ってサービス対応アプリケーション・モジュールを生成した後、サービスバック・エンティティ・オブジェクトとビュー・オブジェクトを作成する必要があります。

  3. 最後にステップ2で作成した「標準的」なサービス対応アプリケーション・モジュールと同じサービス・インタフェースをサポートするEJBセッションBean(またはSCAコンポジット)を作成し、このサービス・インタフェースに基づくサービス対応ビジネス・コンポーネントを含むクライアント・プロジェクトのconnections.xmlファイルが、この「プラグイン」バージョンを使用するように構成します。

アプリケーション・モジュールをWebサービスとして公開する方法の詳細は、「サービス対応アプリケーション・モジュールの公開」を参照してください。

SDOサービスにバックアップされたエンティティ・オブジェクトの作成

エンティティ・オブジェクトの作成ウィザードで、アプリケーション・サーバー上ですでに稼働しているデプロイ済サービスを記述したWSDLドキュメントのURLを入力して、サービスバック・エンティティ・オブジェクトを作成します。WSDLは、UDDIレジストリ、またはURLエンドポイントが使用できない場合はダウンロードしたWSDLドキュメント内にあります。このウィザードはWSDLサービス記述を使用して、使用可能なサービス・ビュー・インスタンスのリストを表示します。ウィザードで、表示されたビュー・インスタンスの中から選択して、エンティティ・オブジェクトのデータ・ソースを指定します。ウィザードの実行時、WSDLドキュメントを検索するためにサービス・エンドポイントへのアクセスが可能でなければなりません。

サービスバック・エンティティ・オブジェクトの作成に使用できるのは、保護されていない(HTTP)サービス・エンドポイントのみです。保護された(HTTPS)サービス・エンドポイントにアクセスしようとすると、エンティティ・オブジェクトの作成ウィザードでエラー・メッセージが表示されます。

始める前に:

クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. デプロイ済のサービスを記述するWSDLドキュメントのURLを入手します。セキュリティ保護されていないHTTP URLにアクセスできない場合、サービスのWSDLファイルをダウンロードし、ダウンロードしたWSDLを使用してローカル・ファイル・システムからサービスを取得します。

  2. 「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従い、Webサービスとしてアプリケーション・モジュールを公開します。

  3. 「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従い、特定のビュー・オブジェクトをサービス対応にします。

  4. 「複合データ型を使用した関連するSDOプロパティの関連付け」の説明に従って、サービス対応ビュー・オブジェクトの属性に対して複合型(通貨コードまたは測定単位を含む)を必要に応じて定義します。

データ・ソースとしてサービス・ビュー・インスタンスを使用するエンティティ・オブジェクトを作成するには:

  1. 「アプリケーション」ウィンドウで、エンティティ・オブジェクトを作成するプロジェクトを右クリックし、「新規」「エンティティ・オブジェクト」の順に選択します。

  2. エンティティ・オブジェクトの作成ウィザードの「名前」ページで、次の操作を実行してエンティティ・オブジェクトを作成します。

    1. エンティティ・オブジェクトが作成されるパッケージ名を入力し、エンティティ・オブジェクト名を入力します。

    2. 「サービス・インタフェース」を、エンティティ・オブジェクト作成用のデータ・ソースとして選択します。

    3. 公開済サービスのURLのWSDLドキュメントを入力するか、「参照」をクリックして「UDDIレジストリ」を選択し、「Webサービスの検索」ウィザードを使用してUDDIレジストリでWebサービスを検索します。URLエンドポイントにアクセスできない場合、WSDLファイルをローカル・ファイル・システムにコピーし、「参照」をクリックして「ファイル・システム」を選択し、ファイルに移動します。

      JDeveloperはサービス・エンドポイントに接続して、WSDLサービス記述からサービス・ビュー・インスタンスのリストにデータを移入しようとします。エンドポイントが使用できな場合は、リストは空のままです。

    4. 「サービス・ビュー・インスタンス」ドロップダウンから、データ・ソースとして適切なサービス・ビュー・インスタンスを選択します(図15-15を参照)。

      図15-15 エンティティ・オブジェクトの作成ウィザードにおけるデータ・ソースとしてのサービス・インタフェース

      図15-15の説明が続きます
      「図15-15 エンティティ・オブジェクトの作成ウィザードにおけるデータ・ソースとしてのサービス・インタフェース」の説明
  3. 「次へ」をクリックして、エンティティ・オブジェクトの属性設定を変更してから、ウィザードを終了します。

    たとえば「属性の設定」ページで、エンティティの変更時には常に変更が予想される属性について、「リフレッシュ」の「挿入後」および「リフレッシュ」の「更新後」オプションを有効化できます。通常、このような値には、行内のバージョン番号列や更新日付列などがあります。

  4. 「終了」をクリックします。

サービスバック・エンティティ・オブジェクト属性を持つ複合データ型の使用

サービスバック・エンティティ・オブジェクトを作成すると、ベース・サービス対応ビュー・オブジェクトのSDOプロパティにより定義されている属性が、JDeveloperによって自動的に公開されます。エンティティ・オブジェクトに複合型の属性が含まれる場合、エンティティ・オブジェクトから複合型の関連属性を選択する必要があります。たとえば、サービスバック・エンティティ・オブジェクトでOrderTotal属性およびCurrencyCode属性を定義し、対象の国での通貨コードを指定すると仮定します。この場合、関連属性CurrencyCodeを、サービス対応ビュー・オブジェクトにより指定されるSDOプロパティのタイプにマップする必要があります。複合型でサポートされているサービス・タイプは次のとおりです。

  • AmountTypeサービス・タイプは、通貨コードを定義する任意のプロパティ用です。

  • MeasureTypeサービス・タイプは、測定単位を定義する任意のプロパティ用です。

概要エディタの「属性」ページを使用して、複合型として定義されたエンティティ・オブジェクトを選択します。概要エディタの「属性」ページから表示される「詳細」ダイアログを使用して、選択した属性の複合型を適切な型の関連属性にマップします。

始める前に:

クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。

複合型とSDOプロパティに関する知識が役立つ場合があります。詳細は、「複合データ型を使用した関連するSDOプロパティの関連付け」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従い、Webサービスとしてアプリケーション・モジュールを公開します。

  2. 「個別のビュー・オブジェクトのサービス対応化の方法」の説明に従って、該当するビュー・オブジェクトをサービス対応にします。

  3. 「複合データ型を使用した関連するSDOプロパティの関連付け」の説明に従って、サービス対応ビュー・オブジェクトの個々の属性に対して複合型を指定します。

  4. 「SDOサービスにバックアップされたエンティティ・オブジェクトの作成」の説明に従って、サービス対応ビュー・オブジェクトからサービスバック・エンティティ・オブジェクトを作成します。

サービスバック・エンティティ・オブジェクトで複合型を使用して属性を関連付けるには:

  1. 「アプリケーション」ウィンドウで、サービスバック・エンティティ・オブジェクトをダブルクリックします。
  2. 概要エディタで、「属性」ナビゲーション・タブをクリックします。
  3. 「属性」ページで、サービス対応ビュー・オブジェクトで複合型として定義された属性をベースとする属性を選択します。

    選択した属性は、サービス対応ビュー・オブジェクトのSDOプロパティにより数値型として定義されます。

  4. 属性を選択し、「詳細」タブをクリックして、「サービス」セクションで、「currencyCode」または「unitCode」ドロップダウン・リストから、複合型に関連付けるエンティティ・オブジェクト属性を選択します。

    ドロップダウン・リストには、エンティティ・オブジェクトにより定義されているすべてのString属性が表示されます。複合型定義に関連属性としてマッピングするために適した属性を選択します。たとえば、通貨コードを、顧客が支払った金額を表示するOrderTotal属性と関連付けるには、Ordersサービスバック・エンティティ・オブジェクトのCurrencyCode属性を選択します。

    SDOフレームワークは、関連サービス属性値currencyCodeおよびunitCodeをサポートしています。エディタにcurrencyCodeが表示される場合には、関連付ける属性は通貨情報を指定する必要があります。エディタにunitCodeが表示される場合には、関連付ける属性は測定単位を指定する必要があります。

SDOサービスにバックアップされたビュー・オブジェクトの作成

プロジェクトにサービスバック・エンティティ・オブジェクトを追加したら、サービスバック・ビュー・オブジェクトを作成して、ユーザー・インタフェースで使用するWebサービス・データの問合せが行え、オプションでフィルタもできます。サービスバック・ビュー・オブジェクトは、そのエンティティを単独で使用すると、SDOサービスでバックアップされたエンティティ・オブジェクトを参照するビュー・オブジェクトです。既存のビュー・オブジェクトをサービスバックにできません。ビュー・オブジェクトを作成する際に、エンティティをサービスバック・エンティティ・オブジェクト用に使用する場合は、新しいビュー・オブジェクトが自動的にサービスバックになります。

始める前に:

クライアントFusion WebアプリケーションでADFビジネス・コンポーネント・サービスにアクセスする方法を理解しておくと役立つ場合があります。詳細は、「サービス対応アプリケーション・モジュールによるリモート・データのアクセス」を参照してください。

他のOracle ADF機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

サービスバック・エンティティ・オブジェクトからビュー・オブジェクトを作成するには:

  1. 「アプリケーション」ウィンドウで、サービスバック・エンティティ・オブジェクトを右クリックし、新規デフォルト・ビュー・オブジェクトを選択します。
  2. 「デフォルト・ビュー・オブジェクトの作成」ダイアログで、ビュー・オブジェクトを作成するパッケージ名を入力し、ビュー・オブジェクト名を入力します(図15-16を参照)。

    生成されたビュー・オブジェクトには、エンティティ・オブジェクトと同じ属性が含まれます。オプションで、概要エディタでビュー・オブジェクトを編集し、問合せをカスタマイズできます。Webサービスのデータをフィルタする場合は、ビュー・オブジェクトのビュー基準も定義できます。問合せ結果のフィルタの詳細は、「名前付きビュー基準の処理」を参照してください。

    図15-16 サービスバック・エンティティ・オブジェクトからのビュー・オブジェクトの作成

    この図は周囲のテキストで説明しています

サービスバック・ビジネス・コンポーネント作成時の処理

サービスバック・エンティティ・オブジェクトはアクセスの詳細、および必要に応じて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-17 「ビュー・リンクの作成」ウィザードで定義された1対多の関係

図15-17の説明が続きます
「図15-17 ビュー・リンクの作成ウィザードで定義された1対多の関係」の説明

作成するビュー・リンクでは、ローカルにアクセスしたデータベース表に問い合せるサービスバック・ビューとビュー・オブジェクト間の関係を定義できます。たとえば、サービスバック・マスター・ビュー・オブジェクトで、データベースから派生したディテール・ビュー・オブジェクトを実行する場合があります。表15-3に示す組合せで、ビュー・リンクを作成できます。

表15-3 サービスバック・ビュー・オブジェクトに関連する、サポートされているビュー・リンクの組合せ

ユースケース マスター・ビュー・オブジェクト・タイプ ビュー・リンク・ディテール・ビュー・オブジェクト・タイプ ビュー・リンク・カーディナリティ

リモート・ディテールのあるローカル・マスター行

問合せベース

サービスバック

1対多

ローカル・ディテールのあるリモート・マスター行

サービスバック

問合せベース

1対多

リモート参照情報のあるローカル・マスター行

問合せベース

サービスバック

多対1

ローカル参照情報のあるリモート・マスター行

サービスバック

問合せベース

多対1

該当するビュー階層を定義したら、「ビュー・リンクの作成」ウィザードを使用して、プロジェクトのアプリケーション・モジュールの概要エディタで、データ・モデルの新しいビュー・インスタンスを定義します(図15-18を参照)。更新したデータ・モデルによって、Fusion Webアプリケーションのユーザー・インタフェースのコンポーネントとのデータバインドを可能にするADFデータ・コントロールとして、ビュー・オブジェクトを公開できます。データ・モデルの更新の詳細は、「アプリケーション・モジュールへのマスター/ディテール・ビュー・オブジェクト・インスタンスの追加」を参照してください。

図15-18 サービス・ビュー・インスタンスが含まれたデータ・モデル

図15-18の説明が続きます
「図15-18 サービス・ビュー・インスタンスが含まれたデータ・モデル」の説明

サービスバック・ビジネス・コンポーネント・ランタイムの構成方法

アプリケーションを実行し、公開済のサービス対応ADFアプリケーションとの対話を行ってサービス操作を起動する前に、サービス・エンドポイント・プロバイダ・タイプおよびその他の構成情報を含む、公開済サービスの記述を行う必要があります。ADFビジネス・コンポーネントのServiceFactoryクラス (oracle.jbo.client.svc.ServiceFactory)はサービスのプロキシを戻し、サービス・プロキシを使用してサービス操作を起動します。サービス・ファクトリは、3つの異なるサービス・エンドポイント・プロバイダのプロキシを戻して、これらのトランスポート・プロトコルをサポートできます。

  • サービス・エンドポイント・プロバイダがADFビジネス・コンポーネントの場合は、トランスポート・プロトコルはEJB RMIです。

  • サービス・エンドポイント・プロバイダがSOA Fabricの場合は、トランスポート・プロトコルはSOA Fabric SDOバインディングです。

  • サービス・エンドポイント・プロバイダがSOAP (JAX-WSクライアント用)の場合は、トランスポート・プロトコルはSOAPです。

公開済のサービス操作を起動するようにコンシューミング・アプリケーションを構成するには:

  1. SDO生成クラスのbcProfileName_Common.jarファイルを、クライアント・プロジェクトのクラスパスに追加します。

  2. クライアント・プロジェクトの.adf/META-INFフォルダ内のconnections.xmlファイルを更新して、公開済ADFビジネス・コンポーネント・サービスを記述します。

    このファイルでの更新内容はアプリケーションで使用しているトランスポート・プロトコルがEJB RMIプロトコル、SOA Fabric SDOバインディング、またはSOAPプロトコル(JAX-WSクライアント用)のいずれかによって異なります。

クラスパスへのSDOクライアント・ライブラリの追加

アプリケーションで公開済サービスにアクセスできるようになるには、サービス・コンシューミング・プロジェクトから生成された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クライアント・ライブラリをクラスパスに追加するには:

  1. 「アプリケーション」ウィンドウで、SDOクラスが含まれているプロジェクトを右クリックして、「プロジェクト・プロパティ」を選択します。
  2. 「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「ライブラリの追加」をクリックします。
  3. 「ライブラリの追加」ダイアログで、「新規」をクリックして、SDOクライアント・ライブラリを作成します。
  4. 「ライブラリの作成」ダイアログで、「エントリの追加」をクリックしてクラスパス・エントリを追加します。
  5. 「パス・エントリの選択」ダイアログで、bcProfileName_Common.jarファイルが含まれたフォルダに移動して、そのファイルを選択し、「ライブラリの作成」ダイアログに表示します。

    「パス・エントリの選択」ダイアログでは、ファイル・システムまたはローカル・エリア・ネットワークを参照して、JARファイルを検索できます。サービス・プロバイダのアプリケーション・ワークスペースのdeployフォルダを参照してJARファイルを入手できない場合、ファイルを入手して自分のプロジェクト・フォルダにコピーする必要があります。たとえば、JARファイルをプロジェクトのdeployフォルダにコピーします。

  6. ダイアログで「OK」をクリックすると、SDOクライアント・ライブラリを選択した状態で「プロジェクト・プロパティ」ダイアログが表示されます。「OK」をクリックして、ライブラリをクラスパスに追加します。

    図15-19に、ServiceProvider_Common.jarという名前が選択された、SDOクライアント・ライブラリを示します。この場合は、ライブラリ名はJARファイル名と同じです。オプションで、「ライブラリの作成」ダイアログでライブラリ名を編集できます。

    図15-19 SDOクライアント・ライブラリ・クラスパス・エントリ

    図15-19の説明が続きます
    「図15-19 SDOクライアント・ライブラリ・クラスパス・エントリ」の説明
コンシューミング・アプリケーションのEJB RMIプロトコル用connections.xmlへの、ADFビジネス・コンポーネント・サービスの登録

サービス・エンドポイント・プロバイダが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コンテキスト・プロパティを編集できます(次のサンプルを参照)。

  • jndiFactoryInitialweblogic.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プロトコル用connections.xmlへの、ADFビジネス・コンポーネント・サービスの登録

サービス・エンドポイント・プロバイダが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>
コンシューミング・アプリケーションのファブリックSDOバインディング用connections.xmlへの、ADFビジネス・コンポーネント・サービスの登録

サービス・エンドポイント・プロバイダがファブリックの場合は、サービス・ファクトリによって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モデル・テスターを起動する前に、プロジェクトがランタイム要件を満たす必要があります。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ファイル

次の例に示すように、操作を起動する際、次のタスクを実行します。

  1. oracle.jbo.client.svc.ServiceFactoryクラスと公開済サービス・クラスをインポートします。
  2. サービス・ファクトリ・オブジェクト上でgetServiceProxy()をコールし、<serviceName>.NAMEの形式でサービス名を渡します。ADFサービス・ファクトリはこの方法で戻されたサービス・プロキシ・オブジェクトにSDOHelperContext IDを組み込み、最新のADFビジネス・コンポーネント・サービス・スキーマ・メタデータがSDOに提供されるようにします。

    サービス・オブジェクトのスキーマ(.xsdファイル)は通常MDSに保存されており、たとえばビジネス・コンポーネント属性の追加、既存の型の拡張、新しい型の定義などのために拡張されている場合があります。ローカル・ヘルパー・コンテキストにより、他のサービスのSDOメタデータに影響を及ぼすことなく、アプリケーションの再起動を行わなくても、各サービス・スキーマ定義のカスタマイズが可能です。

  3. データ・ファクトリ・オブジェクト上でcreate()をコールし、プロキシ・オブジェクトをgetServiceProxy()コールで入手します。
  4. プロキシ・オブジェクト上で操作を起動すると、データ・オブジェクトが戻されます。
  5. 戻されたデータ・オブジェクトをXMLとして保存します。
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.FindCriteriaoracle.jbo.common.service.types.FindControloracle.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サービス・インタフェースにアクセスします。

サービス対応アプリケーション・モジュールからWebサービス・クライアント・プロキシ・クラスを作成する方法

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機能を使用して追加できる機能を理解しておくことも役立ちます。詳細は、「サービス対応アプリケーション・モジュールの追加機能」を参照してください。

次のタスクを完了する必要があります。

  1. 「多相ビュー・オブジェクトの定義」の説明に従って、目的のサブタイプ・ビュー・オブジェクトを作成し、サブタイプを使用してアプリケーション・モジュール・ビュー・インスタンスで多相慣用名を構成します。

  2. 「アプリケーション・モジュール・サービス・インタフェースの有効化の方法」の説明に従って、アプリケーション・モジュールのサービス・インタフェースを有効にします。

  3. サービス・メソッドを起動するために使用するWebサービス・プロキシ・クラスを含むクライアント・プロジェクトを作成します。

    ヒント: JDeveloperでJavaクライアント・プロジェクトを未作成の場合、カスタム・プロジェクトを作成してWebサービス・プロキシ・クラスを含めます(『Oracle JDeveloperによるアプリケーションの開発』アプリケーションとプロジェクトの作成に関する項を参照)。

  4. JDeveloperでWebサービスを実行して、WSDLドキュメントの場所を指定するために使用するサービス・エンドポイントURLを取得します。

    ヒント: 「Integrated WebLogic Serverを使用したWebサービスのテスト方法」の説明に従って、Integrated WebLogic Serverでサービスを実行し、「ログ」ウィンドウからサービス・エンドポイントURLを取得します。

サービス・クライアントとプロキシ・ファイルを生成するには:

  1. 「アプリケーション」ウィンドウで、クライアント・プロキシ・クラスを含めるクライアント・プロジェクトを選択し、「ファイル」→「新規ギャラリ」を選択して、「カテゴリ」リストから、「ビジネス層」「Webサービス」を展開し、「Webサービス・クライアントおよびプロキシ」を選択します。
  2. Webサービス・クライアントおよびプロキシの作成ウィザードの「Webサービス記述を選択」ページで、「ログ」ウィンドウからコピーしたサービス・エンドポイントURLを「WSDLドキュメントURL」フィールドに貼り付け、URLの終わりに?WSDLを追加し、すべてのデフォルトを了承して、「終了」をクリックします。

    たとえば、デプロイするADF Webサービスの名前がADFModuleServiceの場合、?WSDLを追加したWSDLドキュメントURLは、次のようになります。

    http://<ipaddress>/ADFServiceDemo-ADFModel-context-root/AppModuleService?WSDL

生成したプロキシ・クラスを使用して多相ビュー・オブジェクトの操作を呼び出す方法

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と命名されます。

始める前に:

多相コレクションがリモート・サービスとしてアクセスできない理由を理解しておくと役に立ちます。詳細は、「コンシューミング・アプリケーションでの多相コレクションへのアクセス」を参照してください。

次のタスクを完了する必要があります。

図15-20 JAXB生成済SOAPサービス・クライアント・ファイル

この図は周囲のテキストで説明しています

さらに、ベースおよびサブタイプ・ビュー・オブジェクトの公開操作を呼び出すためのSOAPサービス顧客ファイルの編集に進むことができます。サブタイプ・ビュー・オブジェクトにファクトリ・オブジェクトを作成する例を次に示します。

  1. サブタイプ・ビュー・オブジェクトのファクトリ・メソッドを使用してコレクションを作成します。

    この例では、サービス・ファクトリ・オブジェクト上でcreateSalespersonViewExSDO()をコールすると、サブタイプSalespersonの従業員が作成されます。

  2. サービス・ファクトリ・オブジェクトのセッターをコールして、サブタイプのベース・ビュー・オブジェクトが定義する、必須およびオプションの属性を設定します。

    オプション属性の値は、特殊なタイプfactory.createViewAttrNameタイプとしてキャストする必要があります(「クライアント・アプリケーションでのサービス・メソッドの呼出しに関する必知事項」を参照)。

  3. サービス・ファクトリ・オブジェクトのセッターをコールして、サブタイプ・ビュー・オブジェクトが定義する、必須およびオプションの属性を設定します。

    この例では、Salespersonサブタイプは、営業部従業員の売上げ手数料に当たる単一の必須属性CommissionPctを定義します。

  4. コレクション上で他の操作を呼び出します。

    この例では、deleteSEmpView1()はEmployeeコレクション上の作成済Salesperson行を削除し、findSEmpView1ByDept()が部門ごとの従業員のリストを検索します。

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

SDOスキーマを使用してJavaプロキシ・クラスを作成する際に行われる処理

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を起動し、その一方で必須属性のメソッド・シグネチャ(setIdsetLastNameなど)が整数および文字列値を取得することを示しています。

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ダイアグラムは、検索メソッドの引数が作成される方法を詳細に説明します。

図15-22 FindCriteria XSDダイアグラム

図15-22の説明が続きます
「図15-22 FindCriteria XSDダイアグラム」の説明

結合(And、Or、Not、AndNot、OrNot)を指定して、複数のアイテムをグループで定義すると、定義フィルタ条件が互いに関係して評価されます。たとえば、AND結合を使用すると、結合した条件のどちらにも一致する問合せ結果が得られます。OR結合を使用すると、結合した条件の少なくとも一方に一致する問合せ結果が得られます。結合が省略されると、Andの動作であると判断されます。

次のブロック・ダイアグラムは、FindCriteriaオブジェクトの包含モデルを別の方法で示します。

図15-23 FindCriteria包含階層

図15-23の説明が続きます
「図15-23 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は、フィルタ基準に適用する子オブジェクトを指定します。単一の子オブジェクトのブロック・ダイアグラムを次に示します。

図15-24 子検索基準のFindCriteria包含階層

図15-24の説明が続きます
「図15-24 子検索基準のFindCriteria包含階層」の説明

SOAPリクエストを使用した検索メソッド動作の制御方法

SDOの検索リクエスト・ペイロードを作成するには、検索メソッド・フィルタ・モデルの包含階層を理解する必要があります。ペイロード作成ブロックは、検索メソッドXSDで定義された要素から導出されます。包含階層の詳細は、「コンシューミング・アプリケーションでの検索メソッド・フィルタ・モデルの使用」を参照してください。

FindCriteriaのSOAPリクエストを定義するには、次の手順を実行します。
  1. 結果セットの行数および開始する行を指定します(必須)。
  2. 親オブジェクトのフィルタ条件を定義し、1つ以上のビュー基準アイテムを指定します(必須)。
  3. 必要に応じ、結果のソート順序を指定します(オプション)。デフォルトは降順です。
  4. フィルタ条件が満たされた場合に取得する1つ以上の属性を指定します(オプション)。
  5. 存在する場合、子オブジェクトのフィルタ条件を指定します(オプション)。図15-25を参照してください。
次のリクエストは、親オブジェクトでのこの説明に一致する結果セットを返します。

Country属性値が、USまたはIEである場所を、50まで検索します。Country、State、ProvinceおよびCity属性のみを返します。結果セットを降順のCountryでソートします。翻訳された値で返さないようにします。

図15-25 親オブジェクトの検索リクエスト

図15-25の説明が続きます
「図15-25 親オブジェクトの検索リクエスト」の説明

次のリクエストは、この説明に一致するフィルタ済子オブジェクトに対する結果セットを返します。

結果セットの各行(資格を満たすオブジェクト・インスタンス)に対し、EffectiveStartDateが設定されている場合または日付が指定された後に、FloorNumber、Building、City、State、Province、CountryおよびEffectiveStartDate属性を含むLocationProfileを含めます。

図15-26 親および子オブジェクトの検索リクエスト

図15-26の説明が続きます
「図15-26 親および子オブジェクトの検索リクエスト」の説明

Javaクライアントを使用した検索メソッド動作の制御方法

標準検索メソッドAPIは、問合せ動作を制御します。APIを使用するには、検索メソッド・フィルタ・モデルの包含階層を理解する必要があります。包含階層の詳細は、「コンシューミング・アプリケーションでの検索メソッド・フィルタ・モデルの使用」を参照してください。

次のサンプルでは、FindCriteriaオブジェクトをプログラム的に作成する手順を示します。

  1. 新しいFindCriteria (フィルタ)を作成します。

  2. 新しいViewCriteriaItem (アイテム)を作成します。

  3. 新しいViewCriteriaRow (グループ)を作成します。

  4. 作成したアイテムおよびグループを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からDnameLocのみを含め、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);