| Oracle® Enterprise Pack for Eclipse Oracle Mobile Application Framework (OEPE Edition)でのモバイル・アプリケーションの開発 リリース2.0 E56275-01 |
|
![]() 前 |
![]() 次 |
この章では、サード・パーティのWebサービスをMAF AMXアプリケーション機能の実装に統合する方法について説明します。
この章には次の項が含まれます:
Webサービスでは、アプリケーションおよびその機能は、定義済のアプリケーション・プログラミング・インタフェースを使用してデータと情報を交換できます。Webサービスを使用すると、元のアプリケーションのプラットフォームや言語に関係なくビジネス機能を公開できます。これは、ビジネス機能が、他のアプリケーションで認識および使用可能な標準XMLコンストラクトで構成されるメッセージに抽象化されて公開されるためです。
MAFアプリケーションでWebサービスを使用するいくつかの最も代表的な理由は、次のとおりです。
Webサービスとしてはすぐに利用できるが、アプリケーション内で開発するには時間がかかる機能を追加するため
異なるアーキテクチャで実行されるアプリケーションへのアクセスを提供するため
MAFでは、SOAP Webサービスをサポートしており、サード・パーティのWebサービスをMAF AMXアプリケーション機能に統合できます。
MAFアプリケーションでWebサービスを使用すると、次のことが可能になります。
モバイル・アプリケーションのエンド・ユーザーが関心がある大規模な(エンタープライズ)データ・ストアのすべてのデータまたはデータのサブセットを提供する。
モバイル・デバイスのリソースにとって計算の負荷が大きい機能を提供する。これは、デバイスが実行する必要のある実際の作業量、またはデバイスでローカルに使用できるデータ・セットよりもはるかに大規模なデータ・セットが機能のベースになっているという事実が理由になっている可能性があります。
次のWebサービスの使用例は、データ・アクセス(使用例1)と、計算およびデータ駆動機能(使用例2と3)を示しています。
Webサービスを使用して、商談データのセットをエンタープライズ・データ・ストアからフェッチしてエンド・ユーザーがそのデータをデバイスで操作できるようにし、変更内容をエンタープライズ・データ・ストアにポストする。
一部のエンタープライズ・データに関するレポートの生成をリクエストし、そのレポートをフェッチする。
顧客施設への道順の地図イメージを取得する。
MAFを使用して開発されたアプリケーション機能でWebサービスを使用する場合、外部Webサービスのデータ・コントロールを作成するのが最も一般的な方法です。詳細は、第7.1項「バインディングとデータ・コントロールの概要」を参照してください。
Oracle Enterprise Pack for Eclipseでは、そのサービスのWeb Services Description Language (WSDL)ファイルのみを使用して、既存のSOAP Webサービスのデータ・コントロールを作成します。ローカル・ファイル・システムでWSDLファイルを参照するか、Universal Description, Discovery and Integration (UDDI)レジストリでWSDLファイルを検索するか、WSDL URLを直接入力することができます。
|
注意: ファイアウォールで保護されている環境で、ファイアウォール外にあるWebサービスを使用する場合は、Oracle Enterprise Pack for Eclipseで「Webブラウザとプロキシ」の設定を構成する必要があります。詳細は、第8.7項「ブラウザ・プロキシ情報の構成」を参照してください。 |
SOAP Webサービス・データ・コントロールを作成するには:
プロジェクト・エクスプローラで、アセンブリ・プロジェクトを右クリックして、Oracle Enterprise Pack for Eclipseのメイン・メニューから「ファイル」→「新」→「その他」を選択します。
「新」ダイアログで、「Oracle」を展開し、「モバイル・アプリケーション・フレームワーク」を展開して「データ・コントロール」を選択します。「次へ」をクリックします。
ウィザードのデータ・コントロール・ソース・ページで、「Webサービス」を選択します。
をクリックし、データ・コントロール・ソース・ダイアログでローカルWSDLを使用可能なWSDLのリストから選択するか、リモートWSDLを入力します。「次へ」をクリックします。
|
注意: MAFでは、SOAP 1.1および1.2の両方のバージョンで次のエンコーディング・スタイルをサポートしています。
|
Webサービス・データ・コントロールの作成後は、図8-2のように、Webサービスの操作およびその操作の戻り値が「データ・コントロール」ウィンドウに表示されます。
Webサービス・データ・コントロールは、「データ・コントロールの編集」をクリックすることで編集できます(図8-3を参照)。
他のデータ・コントロールと同様に、Webサービスの操作によって戻されたオブジェクトをドラッグ・アンド・ドロップして、MAF AMXページのユーザー・インタフェースを作成できます。詳細は、第5.3.2.3項「データ・コントロールのビューへの追加」を参照してください。Webサービスの操作から戻されたデータが表示されると、次のオブジェクト・タイプが処理されます。
コレクション
Webサービスの操作により戻された複合オブジェクト
Webサービスの操作により戻された、ネストされた複合オブジェクト
Webサービスの操作を使用して、標準データ型と複合データ型の両方を更新および削除できます。
図8-2で示されているように、各データ・コントロール・オブジェクトはアイコンで表されます。表8-1は、各アイコンが表すデータ・コントロール・オブジェクト、「データ・コントロール」パレットの階層内で表示される場所、そのアイコンを使用して作成できるコンポーネントを示しています。詳細は、第7.6項「「データ・コントロール」パレットでのデータバインドされたUIコンポーネントの作成」を参照してください。
表8-1 Webサービスの「データ・コントロール」パレットのアイコンおよびオブジェクト階層
| アイコン | 名前 | 説明 | 作成する対象 |
|---|---|---|---|
|
|
データ・コントロール |
データ・コントロールを表します。データ・コントロール自体を使用してUIコンポーネントを作成することはできませんが、その下に表示される子オブジェクトは、いずれも使用できます。通常、各Webサービスに対するデータ・コントロールは1つです。 |
他のオブジェクトのコンテナとして機能し、コンポーネント作成には使用されません。 |
|
|
コレクション |
サービスの操作から返されるデータ・コントロールを表現します。コレクションは、メソッド戻りオブジェクト、他のコレクション、または構造化属性の下の子としても表示されます。コレクションの下の子は、属性、他のコレクション、カスタム・メソッド、コレクションに対して実行できる組込み操作などです。 |
フォーム、表、グラフ、ツリー、レンジ・ナビゲーションの各コンポーネント、およびマスター/ディテール・コンポーネント。第6.5項「データ視覚化の指定」も参照してください。 |
|
|
属性 |
オブジェクト内の個別のデータ要素(行の属性など)を表します。属性は、自分の属するコレクションまたはメソッド戻りの下に、子として表示されます。 |
ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第6.2項「ページ・レイアウトの設計」も参照してください。 |
|
|
構造化属性 |
複合型でありコレクションではない、返されたオブジェクトを表します。たとえば、構造化属性は、現在のサービス・リクエストに割り当てられた単一のユーザーを表現します。 |
ラベル、テキスト・フィールド、日付、値リスト、および選択リストの各コンポーネント。第6.2項「ページ・レイアウトの設計」も参照してください。 |
|
|
メソッド |
データ・コントロールの操作またはその公開された構造のいずれかを表し、パラメータの受入れや、ビジネス・ロジックの実行を行ったり、オプションで単一の値、構造、またはそれらのコレクションを戻すことができます。 |
コマンド・コンポーネント。 パラメータを受け入れるメソッドの場合: コマンド・コンポーネントおよびパラメータ付きフォーム。また、第6.3項「UIコンポーネントの作成と使用方法」も参照してください。 |
|
|
メソッド戻り |
Webサービス・メソッドによって戻されたオブジェクトを表します。戻されたオブジェクトは、単一の値またはコレクションです。 メソッド戻りは、これを戻すメソッドの下に、子として表示されます。メソッドの戻りオブジェクトの下の子として表示されるオブジェクトは、該当コレクションの属性、親コレクションに関連するアクションを実行する他のメソッド、および親コレクション上で実行可能な操作です。 単一値のメソッド戻り値がドロップされると、メソッドはフレームワークにより自動的に起動されなくなります。メソッドを起動するために、対応するメソッドをボタンとしてドロップする必要があります。また、タスク・フローを使用している場合は、メソッド・アクティビティを作成できます。 |
コレクションと属性、および問合せフォームの場合と同じコンポーネント。 |
|
|
操作 |
親オブジェクトに対してアクションを実行する、組込みデータ・コントロール操作を表します。データ・コントロール操作は、コレクションの下の「操作」ノードにあります。1つ以上のパラメータが操作に必要な場合、それらのパラメータは操作の下の「パラメータ」ノードにリストされます。 現在行のナビゲーションと設定のために、 |
ボタン、リンクおよびメニューなどのユーザー・インタフェース・コマンド・コンポーネント。詳しくは、第6.3項「UIコンポーネントの作成と使用方法」を参照してください。 |
|
|
パラメータ |
メソッドまたはその下に表示される操作によって宣言されたパラメータ値を表します。パラメータは、メソッドまたは操作の下の「パラメータ」ノード内に表示されます。 配列および構造化パラメータは、データ・コントロールの下の更新可能な構造化属性およびコレクションとして公開され、UI上にADFフォームまたは更新可能な表としてドロップできます。UIを使用して配列または複合オブジェクト(標準のJava型ではない)のパラメータを作成できます。 |
ラベル、テキストおよび選択リストの各コンポーネント。詳細は、第6.3.15項「リスト・ビューおよびリスト・アイテム・コンポーネントの使用方法」を参照してください。 |
MAFでは、DataControls.dcxファイルでカスタム・プロバイダ・クラスを指定できます(例8-3を参照)。このカスタム・クラスはoracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProviderを拡張します。これは、SoapHeader[] getAdditionalSoapHeaders()メソッドの実装の指定に使用できます。
例8-1は、SOAPProviderを拡張して、例8-2に示すカスタム・ヘッダーを作成する方法を示しています。
例8-1 カスタムSOAPヘッダーの定義
package provider.ebs.soap;
import oracle.adfinternal.model.adapter.webservice.provider.soap.SOAPProvider;
import oracle.adfinternal.model.adapter.webservice.provider.soap.SoapHeader;
public class EBSSOAPProvider extends SOAPProvider {
public SoapHeader[] getAdditionalSoapHeaders() {
SoapHeader header[] = new SoapHeader[2];
SoapHeader token = null;
SoapHeader user = null;
SoapHeader pass = null;
header[0] = new SoapHeader("http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SOAHeader");
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Responsibility",
"SYSTEM_ADMINISTRATOR"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"RespApplication",
"SYSADMIN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"SecurityGroup",
"STANDARD"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"NLSLanguage",
"AMERICAN"));
header[0].addChild(new SoapHeader(
"http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/",
"Org_Id",
"0"));
header[1] = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Security");
token = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"UsernameToken");
user = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Username",
"sysadmin");
pass = new SoapHeader(
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"Password",
"sysadmin");
header[1].addChild(token);
token.addChild(user);
token.addChild(pass);
return header;
}
}
例8-2に新しいカスタム・ヘッダーを示します。
例8-2 SOAPヘッダー
<soap:Header xmlns:ns1="http://xmlns.oracle.com/apps/fnd/soaprovider/plsql/fnd_user_pkg/">
<ns1:SOAHeader>
<ns1:Responsibility>SYSTEM_ADMINISTRATOR</ns1:Responsibility>
<ns1:RespApplication>SYSADMIN</ns1:RespApplication>
<ns1:SecurityGroup>STANDARD</ns1:SecurityGroup>
<ns1:NLSLanguage>AMERICAN</ns1:NLSLanguage>
<ns1:Org_Id>0</ns1:Org_Id>
</ns1:SOAHeader>
<wsse:Security xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>sysadmin</wsse:Username>
<wsse:Password Type=
http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-username-token-profile-1.0#PasswordText">sysadmin</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
@return
例8-3は、SOAPProviderを登録したDataControls.dcxファイルのサンプル・エントリを示しています。
例8-3 DataControls.dcxファイルへのSOAPProviderの登録
<definition xmlns="http://xmlns.oracle.com/adfm/adapter/webservice"
name="SoapService" version="1.0"
provider="oracle.adf.model.adapter.webservice.SOAPMessageHandler"
wsdl="http://@SRG_WS_HOST@:@SRG_WS_PORT@/SoapService/SoapServicePort?wsdl" >
<service name="SoapService" namespace="http://model/"
connection="SoapService">
<port name="SoapServicePort">
<operation name="echoSoapHeader"/>
</port>
</service>
</definition>
|
注意: MAFを使用して動的SOAPヘッダーを指定することはできません。 |
Webサービスの接続情報は、アプリケーション内の他の接続とともにconnections.xmlファイルに保存されます。このファイルは、Webサービス・データ・コントロールの作成時に新規Webサービス・データ・コントロール・ウィザードによって.adf/META-INFディレクトリに生成されるため、明示的に作成する必要はありません(第8.2項「Webサービス・データ・コントロールの作成」を参照)。
接続設定を変更するには、connections.xmlファイルを編集します。
Webサービス・データ・コントロールを作成すると、URIのエンドポイントを変更できます。これは、アプリケーション機能をテスト環境から本番環境に移行する場合などに便利です。
エンドポイントを変更するには、connections.xmlファイルを編集します。
MAFでは保護されたWebサービスと保護されていないWebサービスの両方がサポートされます。詳細は、第21章「モバイル・アプリケーションの保護」を参照してください。
MAFアプリケーションから保護されたWebサービスにアクセスするには、アプリケーションに追加されたWebサービス・データ・コントロールの構成が必要な場合もあります。
該当するOracle Web Services Managerのポリシーが表示されるよう、SOAP Web サービス・データ・コントロールの作成時に確実にポートを選択してください。
SOAPベースのWebサービスでは次の事前定義済のセキュリティ・ポリシーがサポートされます。
oracle/wss_http_token_client_policy
oracle/wss_http_token_over_ssl_client_policy
oracle/http_basic_auth_over_ssl_client_policy
oracle/wss_username_token_client_policy
oracle/wss_username_token_over_ssl_client_policy
これらのポリシーとその使用法の説明については、『Oracle Fusion Middleware Oracle Web Services ManagerによるWebサービスの保護およびポリシーの管理』の「使用する事前定義済ポリシーの決定」と「事前定義済ポリシー」の各章を参照してください。
SOAP Webサービスが保護されている場合は、oracle/wss_http_token_over_ssl_client_policyまたはoracle/wss_http_token_client_policyのいずれかでWebサービス・データ・コントロールを構成することでアクセスが可能になります。これを行うには、図8-3に示す「データ・コントロール・ポリシーの編集」ダイアログを使用します。このダイアログは次の方法で開くことができます。
プロジェクト・エクスプローラで、アプリケーションのビュー・コントローラ・プロジェクト内にある.dcxファイルを選択します。
「構造」ウィンドウで、構成が必要なWebサービス・データ・コントロールを右クリックし、ポップアップ・メニューから「Webサービス・セキュリティの定義」を選択します。
|
注意: Oracle Enterprise Pack for Eclipseでは、Webサービス・ポリシーの定義は(アプリケーション・ワークスペースの |
保護されたWebサービスにおけるユーザーの資格証明は、Webサービス・リクエストの起動時にそのリクエストに動的に挿入されます。
MAFではOracle Web Services Manager (OWSM) Mobile Agentを使用してWebサービス・リクエストによってユーザーIDを伝播させます。
Webサービスを起動する前に、ユーザーは、保護されたMAFアプリケーション機能の呼出しまたはアクセス制御サービス(ACS)で制御されたアプリケーションの起動を試みるユーザーによってトリガーされた認証プロンプトに応答する必要があります。後者では、アプリケーションでACS URLを使用してデフォルトのログイン・サーバーを定義し、user.roles設定に依存する制約を持つ機能を少なくとも1つは備えておく必要があります。ユーザーの資格証明は、資格証明ストアに格納されます。この資格証明ストアは、認証プロバイダのサーバーURLおよびユーザーと関連付けられた資格証明の格納に使用される、デバイス・ネイティブかつローカルなリポジトリです。実行時に、MAFでは、すべての資格証明がその使用前にIDM Mobile資格証明ストアに格納されているものとみなします。
connections.xmlファイルには、Webサービスの接続参照のadfCredentialStoreKey属性に、ログイン・サーバー接続のadfCredentialStoreKeyの値を指定して、ログイン・サーバーをWebサービスのセキュリティに関連付ける必要があります(例8-4および例8-5を参照)。
|
注意: Oracle Enterprise Pack for Eclipseでは |
例8-4は、adfCredentialStoreKey="MyAuth"として参照されるWebサービス接続の定義を示しています。ここで、MyAuthとは、ログイン接続の参照名です。
例8-4 Webサービス接続の定義
<Reference name="URLConnection1"
className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="MyAuth"
xmlns="">
<Factory className="oracle.adf.model.connection.url.URLConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="URLConnection1">
<Contents>
<urlconnection name="URLConnection1"
url="http://myhost.us.example.com:7777/
SecureRESTWebService1/Echo">
<authentication style="challange">
<type>basic</type>
<realm>myrealm</realm>
</authentication>
</urlconnection>
</Contents>
</XmlRefAddr>
<SecureRefAddr addrType="username"/>
<SecureRefAddr addrType="password"/>
</RefAddresses>
</Reference>
例8-5は、ログイン接続の定義を示しています。ここでのMyAuthは、ログイン・サーバー接続における資格証明ストア・キーの値として使用されます。
例8-5 ログイン接続の定義
<Reference name="MyAuthName"
className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="MyAuth"
partial="false"
manageInOracleEnterpriseManager="true"
deployable="true"
xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://172.31.255.255:7777/
SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<logout url="http://172.31.255.255:7777/
/SecuredWeb1-ViewController-context-root/faces/view1.jsf"/>
<accessControl url="http://myhost.us.example.com:7777/
UserObjects/jersey/getUserObjects" />
<idleTimeout value="10"/>
<sessionTimeout value="36000"/>
<userObjectFilter>
<role name="testuser1_role1"/>
<role name="testuser2_role1"/>
<privilege name="testuser1_priv1"/>
<privilege name="testuser2_priv1"/>
<privilege name="testuser2_priv2"/>
</userObjectFilter>
</Contents>
</XmlRefAddr>
</RefAddresses>
</Reference>
認証の失敗によってWebサービス・リクエストが拒否された場合は、MAFにより適切な例外が戻され、適切なアクションが起動されます(第22.4項「ロギングの使用方法と構成」を参照)。既存の例外で状況を適切に示せない場合は、新しい例外が追加されます。
connections.xmlファイルは構成サービスの下でデプロイされ、管理されています。詳細は、第9章「MAFアプリケーションで使用するエンド・ポイントの構成」を参照してください。
FAR内のconnections.xmlファイルは、MAFアプリケーションのデプロイ時に集約されます。資格証明はデプロイメント固有のデータを表しており、FAR内に格納することは想定されていません。
MAFアプリケーションでは、JavaコードからWebサービス層を起動して、その結果をJavaメソッドで使用できます。
MAFでは、使用可能なGenericTypeBeanSerializationHandlerユーティリティ・クラスが提供され、POJO (JavaBeansオブジェクト)とMAFのGenericTypeオブジェクトとの間で次の変換ルールのセットに基づいて変換が実行されます。
POJOからGenericTypeオブジェクトに変換する場合:
プロパティの決定に標準JavaBeansの反映ルールが使用されます。
変換プロセスでは一時プロパティが無視されます。
読取り可能プロパティはGenericType属性に変換されます。
配列プロパティはGenericType内で繰返し属性として表されます。
マッピング・プロパティはGenericType内で個別の属性として表されます。
非プリミティブ・プロパティはネストされたGenericTypeオブジェクトとして表されます。
GenericTypeオブジェクトからPOJOに変換される場合:
プロパティの決定に標準JavaBeansの反映ルールが使用されます。
変換プロセスでは一時プロパティが無視されます。
書込み可能プロパティはGenericType属性に変換されます。
GenericType内の繰返し属性は配列オブジェクトに変換されます。
POJOにMapインタフェースが実装されている場合は、標準アクセッサを介して設定できないすべてのプロパティがMapのsetメソッドを介してPOJOに設定されます。
非プリミティブ属性はネストされたPOJOオブジェクトとして表されます。
このヘルパーAPIを使用する利点は、Webサービスから受け取ったレスポンスを取得して、1回のコールでJavaBeanに変換できることです。
たとえば、Webサービスは、ビジネス・ロジック全体で再利用する必要があるEmployeeオブジェクトを渡したり戻したりします。このオブジェクトには次のプロパティ・セットがあります。
String型のname
address (street、city、stateおよびzipcodeの各属性を持つ複合オブジェクト)
long型のid
float型のsalary
String型のphone(複数のphoneになる可能性もある)
String型のpassword(このpasswordはバックエンドのWebサービスに送信しないでください)
例8-6は、考えられるEmployeeオブジェクトのコードを示しています。
例8-6 Employeeオブジェクト
public class Employee {
protected String name;
protected Address address;
protected long id;
protected float salary;
protected String[] phone;
protected transient String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setPassword(String password) {
this.password = password;
}
public String[] getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
例8-7は、EmployeeクラスのAddressオブジェクトのコードとして考えられるものを示しています。
例8-7 Addressオブジェクト
public class Address {
protected String street;
protected String city;
protected String state;
protected String zipcode;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
変換ルールについては次に注意します。
passwordは一時的に定義されるため、変換アルゴリズムに対しては無視されます。
name、address、idおよびsalaryにはすべてgetメソッドおよびsetメソッドがあるため、それらはすべてGenericTypeとの間で変換が行われます。
プロパティ・タイプに基づき、oracle.adfmf.misc.ConverterクラスのcoerceToType(Object, Class)メソッドの定義に従って、プロパティをタイプ間で強制変換できます。
addressなどの複合オブジェクトは、変換アルゴリズムによって再帰的に処理することで、変換の方向により、子であるGenericTypeを構築するか、POJO複合オブジェクトを作成してデータを移入します。
phoneはStringオブジェクトの配列で、それぞれが一意の電話番号を表しており、またこの要素のカーディナリティは2以上のため、変換アルゴリズムによってGenericTypeオブジェクト内のphone属性におけるすべての組合せが検索され、それらが配列として表される他、Bean上ではsetPhoneメソッドが起動されます。GenericTypeBeanSerializationHandlerのtoGenericTypeメソッドでは各配列要素が取得され、個別のphone属性としてtoGenericTypeに追加されます。
次のように定義されている場合:
final String EMPLOYEE_VIRTUAL_BEAN_NAME = "EmployeeDC.Types.Employee"; Employee emp = getEmployee(); GenericType gt = null;
Employeeオブジェクトは、次のようにGenericTypeに変換されます。
gt = GenericTypeBeanSerializationHelper.toGenericType
(EMPLOYEE_VIRTUAL_BEAN_NAME, emp);
GenericTypeは次のようにEmployeeオブジェクトに変換されます。
emp = GenericTypeBeanSerializationHelper.fromGenericType
(Employee.class, gt, null);
正常に変換するには次の点を考慮します。
POJOでは通常、それらに関連付けられたGenericType構造に厳密に従います。
GenericType構造から外れた場合は、次のいずれかの方法に従います。
追加のBeanプロパティを一時的に宣言します。
操作パラメータとして使用されたときに欠落データをバッキング・サービスが処理できる場合は、POJOからオプション・プロパティを除外できます。
GenericTypeは、SOAPデータ・コントロールにのみ公開されます。仮想タイプには、toGenericTypeメソッドに渡される、関連付けられた仮想Bean名があります。Oracle Enterprise Pack for Eclipseの「データ・コントロール」ウィンドウで仮想タイプ上にカーソルを置くことによって仮想Bean名にアクセスできます。通常の名前フォーマットは、<DCName>.Types.<methodName>.<argName>です。
詳細は、Oracle Fusion Middleware Oracle Mobile Application FrameworkのJava APIリファレンスを参照してください。
MAFを使用すると、プログラムからWebサービス・オブジェクトのイテレータにアクセスして、そのオブジェクトの行を挿入および削除できます。これを行うには、oracle.adfmf.bindings.iterator.BasicIteratorクラスのcreateRowおよびdeleteRowメソッドを使用します。
例8-8は、行をWebサービス・オブジェクトに追加する方法を示しています。
例8-8 行の挿入
String keyFieldNames[] = {"EMPLID","ACAD_CAREER","INSTITUTION"};
String keyFieldValues[] = {"SR12030","UGRD","PSUNV"};
AmxAccessorIteratorBinding acIter =
(AmxAccessorIteratorBinding)((AdfmfJavaUtilities.getValueExpression
("#{bindings.KEYIterator}", Object.class))
.getValue(AdfmfJavaUtilities.getAdfELContext()));
BasicIterator iter = acIter.getIterator();
GenericType key = (GenericType)iter.getDataProvider();
key.setAttribute("FIELDNAME", keyFieldNames[0]);
key.setAttribute("FIELDVALUE", keyFieldValues[0]);
int totalRowCount = 0;
int currIndex = 0;
for (int i = 1; i < keyFieldNames.length; i++) {
totalRowCount = iter.getTotalRowCount();
currIndex = iter.getCurrentIndex();
System.out.println("Starting to add rows.. \n\t Total Row Count: " +
totalRowCount + "\n\t Current Row Index: " + currIndex);
// Create rows for key iterator
iter.createRow();
totalRowCount = iter.getTotalRowCount();
System.out.println("\t Total Row Count after creating row: " + totalRowCount);
if (iter.hasNext()) {
iter.next();
}
currIndex = iter.getCurrentIndex();
System.out.println("\t Current Row Index after setting current
index to newly added row: " + currIndex);
GenericType key1 = (GenericType)iter.getDataProvider();
key1.setAttribute("FIELDNAME", keyFieldNames[i]);
key1.setAttribute("FIELDVALUE", keyFieldValues[i]);
}
// Execute method
// Add call to execute the action binding to execute the action.
// If this is a web service call, the modified GenericType object
// will be sent to the server and the server will respond appropriately
|
注意: ブール入力パラメータの有無にかかわらず、 |
呼び出すWebサービスが自社ファイアウォールの外部にある場合は、HTTPプロキシ・サーバーを使用できるような適切な構成にJavaシステム・プロパティが設定されていることを確認する必要があります。
デフォルトでは、MAFはiOSとAndroidプラットフォームのシステム設定を使用してプロキシ情報を決定します。たとえば、iOSデバイスの設定ユーティリティを使用してプロキシ情報が設定されている場合、CVMは自動的にその情報を取り込みます。
|
注意: MAFアプリケーションごとに異なるプロキシを定義できます。 |
デバイスの設定からプロキシ情報を取得しない場合は、最初に-Dcom.oracle.net.httpProxySourceシステム・プロパティを追加する必要があります。このプロパティのデフォルト値はnativeで、プロキシ情報をデバイスの設定から取得することを意味します。これを無効にするには、userなど別の値を指定します(例: -Dcom.oracle.net.httpProxySource=user)。
CVMは2つの異なるメカニズムを使用してネットワーク接続を有効にします。
汎用接続フレームワーク(GCF)。このメカニズムを使用する場合、プロキシはシステム・プロパティの-Dcom.sun.cdc.io.http.proxy=<host>:<port>によって定義されます。
java.net API。このメカニズムを使用する場合、プロキシは標準のhttp.proxyHostとhttp.proxyPortによって定義されます。
どちらの場合でも、cvm.propertiesファイルにある3つのプロパティをすべて定義することをお薦めします。これらのプロパティは、次に類似しています。
java.commandline.argument=-Dcom.oracle.net.httpProxySource=user java.commandline.argument=-Dcom.sun.cdc.io.http.proxy=www-proxy.us.mycompany.com:80 java.commandline.argument=-Dhttp.proxyHost=www-proxy.us.mycompany.com java.commandline.argument=-Dhttp.proxyPort=80
|
注意: これらのプロパティはネットワーク・コールのCVM側のみに影響します。 |