RPC アダプター・ライブラリーのフィーチャー
- ホワイトリストとブラックリスト
ユーザーは、POJO サービス内の一連のメソッドをホワイトリストまたはブラックリストに登録することができます。
ホワイトリストとブラックリストへの登録は、POJO エレメント内のメソッド要素のフィルター属性を使用して行われます。
フィルターの値は、whitelisting と blacklisting になります。
フィルターを指定しない場合は、すべてのメソッドがリストされます。
AddressLookup クラスの getAddress メソッドは、以下の例のように POJO サービスを指定することによってホワイトリストに登録することができます。
AddressLookup
com.ibm.courier.AddressLookup
bean provides ...
getAddress
Gets address details
GET
この例は、AddressLookup クラスの getAddress のみが RPC アダプターを使用してアクセス可能であることを示しています。
次の例のように、同じメソッドをブラックリストに登録することもできます。
AddressLookup_BlackList
com.ibm.courier.AddressLookup
bean provides ...
getAddress
Gets address details
GET
前述の例では、AddressLookup クラスのすべてのメソッドが、getAddress を除き RPC アダプターを使用してアクセス可能であることを示しています。
POJO サービスのメソッド要素を指定していないか、メソッド要素のフィルター属性を指定していない場合、
デフォルトではすべてのメソッドがホワイトリストに登録されます。
- POJO メソッド内の HttpServletRequest オブジェクトへのアクセス
多くの場合、JavaScriptTM から呼び出すメソッド内の HttpServletRequest オブジェクトにアクセスする必要があります。
そのためには、RPC アダプターで HttpServletRequest をメソッド呼び出しの先頭パラメーターに設定します。
返される単純メソッド記述 (SMD) には、パラメーターとしての HttpServletRequest オブジェクトは存在しません。
このパラメーターを渡すことなく、JavaScript からメソッドを呼び出すことができます。
例えば、メソッド putNameInSession(HttpServletRequest req, String name) の場合を考えます。
以下のような対応する XML が表示されます。
---
putNameInSession
Puts a name in session
POST
req
HttpServletRequest オブジェクト
name
The name entered by the user
BeanDescriptor 記述子を使用して同様な構成を指定することもできます。
その場合には、Bean が提供するこの記述が優先されます。
- バリデーター
バリデーターは、RPC アダプター構成ファイルのバリデーター・エレメントを使用して定義します。個別の POJO サービス用に一連のバリデーターを指定できます。
メソッドを呼び出す前に、メソッドのパラメーターについて、指定したバリデーターの妥当性検査メソッドが呼び出されます。
メソッドのパラメーターごとに、別々のバリデーターを指定できます。
バリデーターはすべて、抽象クラス com.ibm.websphere.rpcadapter.Validator を拡張します。
妥当性検査を行うもう 1 つの方法は、正規表現を使用する方法です。validation-regex エレメントを使用すると、
パラメーター値が一致する必要がある正規表現を指定できます。
パラメーター値が正規表現に一致しない場合は、妥当性検査エラーが生成されます。
妥当性検査エラーの結果、JSON フォーマットで Error オブジェクトが返されます。
この情報は、エラー処理に使用することができます。
フィールドの説明は、以下のとおりです。
- name : JSONRPCError (JSON-RPC 呼び出し時にエラーが発生した場合の名前) および XMLRPCError (XML-RPC 呼び出し時にエラーが発生した場合の名前)。
- code : エラー・コード。
- message : エラー・メッセージ。
このメッセージは、エラーの詳細を示すメッセージです。
- methodName : エラーが発生したメソッドの名前。
- serviceName : エラーが発生したサービスの名前。
- parameterIndex : 妥当性検査が失敗したパラメーターのインデックス。
妥当性検査に関連したエラーでない場合はヌルです。
- parameterValue : 妥当性検査が失敗したパラメーター値。
妥当性検査に関連したエラーでない場合はヌルです。
「code」フィールドには、CWRPC0008E と CWRPC0009E の値が入ります。
- CWRPC0008E は、メソッド内のパラメーター数が、要求内で受け渡しているパラメーター数と一致しないことを意味します。
- CWRPC0009E は、regex/class ベースの妥当性検査が失敗したことを意味します。
エラー・オブジェクト内のすべてのフィールドには、常に値が設定されているわけではありません。パラメーターは、エラーとの関連性に基づいて設定されます。
DefaultValidator という名前のバリデーターは、以下のように定義されます。
regex expr1
com.ibm.websphere.rpcadapter.DefaultValidator
Lookup サービスのメソッド・パラメーターにデフォルト ID のバリデーターを使用するには、
AddressLookup POJO サービスのそのメソッドのパラメーター・エレメントに、以下の値を指定します。
Lookup
test.POJO.Lookup
method1
Gets getWhiteListedMessage
parameter1
デフォルト
コンマ区切りのリストを使用すると、複数のバリデーターを指定できます。
バリデーターを全メソッドのすべての引数に適用するために、JavaBeans レベルで validator-ref タグを指定することもできます。
このバリデーターは、すべてのメソッド引数に適用されますが、
パラメーター・レベルでバリデーターを定義することによってオーバーライドできます。
- オブジェクトの有効範囲
RPC アダプターは、公開するオブジェクトの有効範囲をサポートするようになりました。
RPC アダプターがサポートする有効範囲には、Request、Session、Application の 3 種類があり、
公開されるオブジェクトを要求、セッション、アプリケーションに保管するように指定できます。
また、有効範囲を Application または Session に設定した場合の利点として、
オブジェクトが毎回再作成されずに、Session または Application の有効範囲から検索されることがあげられます。
使用されるキーのフォーマットは、「com.ibm.websphere.rpcadapter:ServiceName」です。
ここで、ServiceName は公開されるオブジェクトの名前です。
このキーを指定するには、オブジェクトごとに scope タグを提供します。
このタグには、Session、Request、Application という値が入ります。
以下の例を参照してください。
サンプル
com.ibm.Sample
Session
前述の構成では、com.ibm.Sample の実装から作成されたオブジェクトが、
「com.ibm.websphere.rpcadapter:Sample」というキーを持つセッションに配置されることを意味します。
この場合、Sample は serviceName です。
- セッション内の戻り値
RPC アダプターのサポートにより、セッションに戻り値を追加できるようになりました。
この値を追加できるようにするには、以下のように <add-to-session> タグを追加する必要があります。
ObjectTestTarget
test.POJO.ObjectTestTarget
アプリケーション
echoObject
Gets getWhiteListedMessage
jsonObject
Contains the message to be foo'd.
new
ObjectTestTarget.echoObject.returnType
add-to-session タグの値は、メソッドの戻り値をセッション内に配置する場合のキーです。
- 複合オブジェクト・サポート
RPC アダプターは、複合オブジェクト (例えば、他のオブジェクトを含むことができるオブジェクト) をサポートしています。複合オブジェクトは、戻りの型およびメソッド・パラメーターとしてサポートされます。
RPC アダプターは、任意のタイプの複合オブジェクトをシリアライズすることができます。Map と Collection は、
メソッドの呼び出しのパラメーターとしてはサポートされていません。
これは、Map または Collection に含まれているオブジェクトのクラスをその内容からだけでは識別できないためです。
これをサポートするには、クラス・ヒントまたはパラメーター化された型が必要になりますが、まだサポートされていません。
また、複雑な戻りの型はサポートされていますが、HTTP-RPC を介して複雑なパラメーターを使用してメソッドを呼び出すことはできません。
- 再帰的オブジェクト・サポート
これは、複合オブジェクト・サポートの特殊なケースです。
例えば、A -> B -> A、すなわち A は B を含み、その B は A を含んでいます。
製品の RPC アダプター・コンポーネントは、これを処理するために、
オブジェクトの重複オカレンスを $jref (JSON シリアライズ) または $xref (XML シリアライズ) プレースホルダーで置き換えます。
これらのプレースホルダーには、元のオブジェクトの検索に使用できる情報が含まれています。
すなわち、XML の場合は XPath 式であり、JSON の場合は JavaScript 式です。
再帰的オブジェクト処理のサポートをオンにするには、<recursive-object-support> タグの値を true に設定します。
以下に例を示します。
xml
false
true
([A-Za-z])+
com.ibm.websphere.rpcadapter.DefaultValidator
---
---
---
- 選択済み属性のシリアライズ
公開の必要があるオブジェクトに、
アプリケーション開発者が JSON または XML Web サービスを介して公開することを望まない特定フィールドが含まれていることがよくあります。
RPC アダプターには、返されたオブジェクトのフィールドを非公開にする機能があります。
このようなフィールドの非公開機能は、タグ <serialized-params> を使用して設定することができます。
com.ibm.Address クラスの postalCode フィールドを非公開にする場合に必要な構成を以下に示します。
この構成により、com.ibm.Address クラスの postalCode フィールドはシリアライズされなくなります。
---
---
---
com.ibm.Address
postalCode
もう 1 つの使用シナリオは、どのクラスに含まれているかに関係なく、
あるクラスのオブジェクトをシリアライズしないようにしたい場合です。
これを使用可能にするには、
RPC アダプターを以下の例のように構成します。
---
---
---
com.ibm.Address
true
前述の例では、XML にシリアライズされるときに Address のすべてのインスタンスが <address> タグ内に挿入されます。
- クラスの別名
ユーザーはクラスに別名を指定できます。別名は、XML シリアライズの際にノード名として使用されます。
次の例は、アドレスの別名を構成する方法を示しています。
---
---
---
test.POJO.Address
address
前述の例では、XML にシリアライズされるときに Address のすべてのインスタンスが <address> タグ内に挿入されます。
- クラス用コンバーター
ユーザーは、JSON/XML 用にコンバーターを指定できます。
クラスにコンバーターが指定されている場合、そのクラスの JSON/XML シリアライズにはそのコンバーターを使用してください。
すべてのコンバーター・クラスは、
com.ibm.websphere.rpcadapter.converters.IConverter
インターフェースを実装している必要があります。デフォルトでは、
RPC アダプターには以下のコンバーターが付属しています。
|
コンバーター
|
使用法 |
com.ibm.websphere.rpcadapter.converters.sql.Date
|
java.sql.Date を日時ストリングに変換します。
|
com.ibm.websphere.rpcadapter.converters.sql.Time
|
java.sql.Time を日時ストリングに変換します。
|
com.ibm.websphere.rpcadapter.converters.sql.TimeStamp
|
java.sql.TimeStamp を日時ストリングに変換します。
|
com.ibm.websphere.rpcadapter.converters.util.Date
|
java.util.Date を日時ストリングに変換します。
|
以下の例のように、RpcAdapterConfig.xml 内でコンバーターを指定できます。<subclass-support> タグの値を true に設定することで、指定された bean-class のサブクラスも converter-class によって変換されるよう指定することができます。デフォルトでは、これは false に設定されています。
xml
false
true
java.util.Date
com.ibm.websphere.rpcadapter.converters.util.Date
java.sql.Date
com.ibm.websphere.rpcadapter.converters.sql.Date
com.ibm.Parent
com.ibm.websphere.ParentConverter
true
---
---
- JSON のコメント・フィルター済み出力を使用可能にする
JSON Web サービスとしてメソッドを公開するために RPC アダプターを使用する場合、
セキュリティー上の理由で、JSON のコメント・フィルター済み出力を生成するように RPC アダプターを
構成することができます。
例えば、JSON データを「/*」と「*/」で囲みます。
Dojo には、このコメント・フィルター済み JSON をクライアント・サイドで処理する機能があります。
デフォルトでは、このフィーチャーは RPCAdapter で使用不可になっています。
これを使用可能にするには、次の例で示すように、RPCAdapterConfig.xml ファイル内の filtered タグを true に設定します。
xml
true
---
---
---
- セキュリティー
RPC アダプターのセキュリティー・サポートは、Java EE Web セキュリティーを使用して実現されています。
クライアントに公開するように構成されているすべてのサービスは、固有の URL を持ちます。
これらの URL へのアクセスは、Java EE Web セキュリティーによって制限されます。
これを行うには、Application Server にセキュリティー・レルムを作成し、
デプロイメント記述子ファイル web.xml にさまざまな URL へのアクセスに基づくロールを定義してから、
サーバー固有の構成を使用して、これらのロールをセキュリティー・レルム内のユーザーまたはグループにマップします。
この機能をバッチ呼び出し用に独立して使用することはできません。
Java EE Web セキュリティーに加えて、公開されたサービスに対して許可検査を実行するよう、したがって、web.xml または geronimo-web.xml 内に定義された特定のロールにのみアクセスを許可するよう、RPCAdapter を構成することもできます。この機能を使用するには、「/RPCAdapter/*」url パターンが web.xml を介して保護されている必要があります。その次のステップでは、特定のロールのユーザーのみが、対応するサービスへのアクセスを許可されるのかどうかを、<role> タグを使用して指定します。RPCAdapter がサービス許可を実行するとはいっても、保護されたサービスが呼び出される前にユーザーを認証するのはやはりアプリケーションの責任であることに注意が必要です。保護されたサービスが呼び出される前に認証が実行されない場合、RPCAdapter は対応するサービスへのアクセスを許可しません。これは、サービス内のホワイトリスト登録済みメソッドにのみ適用されます。以下に、サービスへのアクセスを制御する例を示します。
AddressLookup
Admin
com.ibm.courier.AddressLookup
getAddress
GET
postcode
このように構成すると、AddressLookup サービス内のホワイトリスト登録済みメソッドへのアクセスを、web.xml または geronimo-web.xml 内の定義に従って「Admin」ロール・グループのユーザーのみに制限できます。
- バッチ
BatchService API を使用すると、一連の呼び出しをバッチ処理することができます。
新規バッチ・サービス・ファクトリーは、以下のように作成、初期化、サブミットすることができます。
var batch = new ibm.rpc.BatchService("/ContextRoot/RPCAdapter/jsonbatch");
var example = batch.createService("/ContextRoot/RPCAdapter/jsonrpc/example");
var example2 = batch.createService("/ContextRoot/RPCAdapter/jsonrpc/example2");
batch.initialize();
//Smds of the services in the batch are returned after the initialize call
example.getEcho('Hello World').addCallback(processMessage);
example2.setMessage('Hi');
batch.submit;
本リリースには、バッチ要求を作成できるようにするための BatchService.js ファイルが用意されているので、
これを「/ibm/rpc」フォルダー構造にコピーし、CourierApp の例のようにバッチ呼び出しを行います。
新規バッチを作成するために前述の例で使用した URL (「/ContextRoot/RPCAdapter/jsonBatch」) は、
すべてのバッチ要求の実行先 URL です。
サービスは、createService 関数を使用してバッチに追加されます。
その後、バッチが初期化され、すべての呼び出しがバッチ・オブジェクトを使用して単一の要求として送信されます。
バッチ内のサービスに対する単純メソッド記述 (SMD) が正常にロードされない場合は、
正常にロードされたその他の SMD とともにエラー・メッセージが送信されます。
バッチ呼び出しから返された結果に対して、該当するコールバックを指定することもできます。
呼び出しは、バッチに追加された順序で処理され、結果が単一の応答として返信されます。
ここで留意すべき 1 つの重要な点は、バッチ内で最初の呼び出しが実行される前であっても、
バッチ内のすべての呼び出しが認証されるということです。
結果として、バッチ内で認証されない呼び出しが 1 つでもあると、バッチ呼び出し全体が失敗となります。
- メソッドの多重定義
多重定義されたメソッドは、
特定の多重定義されたメソッドの固有名とそれに対応するパラメーター・タイプを RpcAdapterConfig.xml ファイルに指定することにより、
公開することができます。
public float add(float numa,float numb){
return (numa + numb);
}
public float add(int numa,int numb){
return (numa + numb);
}
特定の 2 つのメソッドを公開する場合、必要な構成は以下のとおりです。
add
addint
Adds 2 integers
GET
numa
int
numb
int
add
addfloat
Adds 2 floating point numbers
GET
numa
float
numb
float
メソッドの多重定義フィーチャーは、RpcAdapterConfig.xml でのみサポートされています。
多重定義されたメソッドをブラックリストまたはホワイトリストのいずれかに登録する際には、
そのパラメーター・タイプと固有の名前 (別名) を記載する必要があります。
多重定義されたメソッドのうち 1 つは、その Java コード名と同じ別名を持つことができます。
その場合、対応するメソッドが、<name> および <alias> タグ内の値によって Javascript で呼び出されます。
- カスタム・メソッドの命名
メソッドには、Java 実装で実際に使用される名前とは別の名前を割り当てることができます。
これを行うには、<alias> および <name> タグをメソッドの多重定義の場合と同様の方法で使用します。
ただし、メソッドを多重定義しない場合には、パラメーター・タイプを指定する必要はありません。
square
sqr
Squares the given number
GET
numa
- EJB サポート
RPCAdapter を介してエンタープライズ Bean にアクセスするには、
EJB モジュールの必要な情報を RPCAdapterConfig.xml に指定します。
EJB モジュール内のメソッドが公開されるので、ユーザーは JavaScript から直接メソッドを呼び出すことができます。
セッション Bean
RPCAdapter を介してセッション Bean にアクセスするには、リモートとローカルのインターフェース、
EJB モジュール検索の JNDI 名、および実装するメソッドを指定します。
EJB 3.0 の場合、リモートとローカルのインターフェースは、
通常 business-interface と呼ばれる単一のインターフェースに置き換えられます。
したがって、<business-interface> タグを使用してビジネス・インターフェースを指定します。
<ejb-name> タグは、論理名を EJB モジュールに関連付けるために使用します。
<jndi-name> は、EJB モジュールを検索するために使用します。
ユーザーが RPCAdapterConfig.xml ファイルに指定する jndi-name は、
web.xml ファイルに指定されている jndi-name に一致している必要があります。
EJB 3.0 の場合、使用する Application Server が WebSphere® Application Server Community Edition である場合には、
jndi-name に java:comp/env/ という接頭部を付けます。
WebSphere Application Server の場合、EJB 3.0 を使用しているときは、
<jndi-name> タグ内の jndi-name の接頭部にキーワード「ejblocal:」を付ける必要があります。
<session-type> タグを使用して、
セッション Bean のタイプ (ステートレスまたはステートフルのいずれか) を指定する必要があります。
以下に、RPCAdapterConfig.xml ファイル内のステートレス・セッション Bean のエントリーの例を示します。
サンプル
test.TestSample
test.TestSampleHome
ejb/TestSampleSession
ステートレス
sayHello
bean provides..
GET
name
ステートフル・セッション Bean では、ホーム・インターフェースに複数の create 関数を含めることができます。
このような場合は、呼び出す create 関数を指定します。
<create> タグを使用して、RPCAdapterConfig.xml ファイルに create 関数を宣言します。
EJB 2.1 のステートフル・セッション Bean のコード・スニペットは、以下のとおりです。
サンプル
test.TestSample
test.TestSampleHome
name
ejb/TestSampleSession
ステートフル
----
-----
------
EJB のリモート検索
RPCAdapter では、EJB モジュールのリモート検索もサポートされています。
<ejb> の remote 属性を true に設定して、
リモート検索に設定するために必要なプロパティーを指定します。
プロパティーは、<configuration> タグの下に組み込まれています。
RPCAdapterConfig.xml ファイルのリモート検索のコード・スニペットの例は、以下のとおりです。
test.TestSample
test.TestSampleHome
ejb/TestSampleSession
org.openejb.client.RemoteInitialContextFactory
system
manager
localhost:4201
ステートレス
----
-----
-------
ステートフル・セッション Bean では、
特定のセッション Bean のインスタンスは 1 つしか存在しません。
同じセッション Bean のインスタンスが 2 つある場合は、古いインスタンスが新しいインスタンスに置き換えられます。
- 注釈サポート
注釈サポートを使用すると、サービスを RPCAdapterConfig.xml ファイルに構成せずに、コードから直接公開できるようになります。
本リリースでは、このフィーチャーを使用可能にするために、ファイル RPCAdapter-annotation.jar が用意されています。
このフィーチャーを使用して、この JAR ファイルを Web アプリケーションの WEB-INF/lib ディレクトリーに配置します。
公開するメソッドが含まれているクラスには @Pojo、
該当するメソッドには @Method および @Params という注釈を、それぞれ付ける必要があります。
注釈付きクラスは、web.xml ファイルを介して RPCAdapter に可視になります。
注釈付きクラスの正規名を RPCAdapter に対する「init-param」値として指定します。
対応する「init-param」名を classn (n は任意の数値) とします。
以下に、コード・スニペットの例を示します。
RPCAdapter
RPCAdapter
com.ibm.websphere.rpcadapter.RPCAdapter
Class1
com.ibm.courier.AddressLookup
前述の構成により、AddressLookup クラスの注釈処理が確実に行われます。
以下に示すように、注釈によって Pojo エレメントを作成できる方法は 2 つあります。
- クラスを単一の Pojo エレメントとして公開します
- クラスを複数の Pojo エレメントとして公開します
単一の Pojo エレメント
対応するクラスには、@Pojo という注釈が付いています。
以下に、コード・スニペットの例を示します。
@Pojo(name = "AddressLookup", description = "bean provides ...", id = "1", filter = "whitelisting")
public class AddressLookup {
@Params(name = {"postcode"})
@Method(name = "getAddress", description = "Gets address", id = "1")
public String getAddress(String postcode){
...
...
}
@Params(name = "name")
@Method(name = "validate", description = "Validates name", id = "1")
public void validate(String name){
...
...
}
}
@Pojo という注釈には以下の属性がありますが、そのすべてが必須というわけではありません。
- Name : 必須
- ID : 必須
- Description : オプション
- ValRef : オプション
- Filter : オプション。
デフォルトでは、これは「whitelisting」です。
- Scope : オプション
@Method という注釈には以下の属性がありますが、そのすべてが必須というわけではありません。
- Name : 必須
- ID : 必須
- Description : オプション
- HttpMethod : オプション。
デフォルトでは、これは GET です。
- AddToSession : オプション
- SecurityRoles : オプション
@Params という注釈には以下の属性がありますが、そのすべてが必須というわけではありません。
- Name : 必須。
これは、メソッドのすべてのパラメーター名のストリング配列です。
- Description : オプション
- ValidatorRef : オプション
同じクラスの複数の Pojo エレメント
このクラスには、@Pojos という注釈が付いています。
この場合、「id」属性は、メソッドをクラスの Pojo 実装に関連付ける際に、重要な役割を果たします。
Pojo の「id」属性とメソッドが一致した場合に、メソッドがその Pojo 実装に関連付けられます。
以下に、コード・スニペットの例を示します。
@Pojos(pojo = {@Pojo(name = "AddressLookup", description = "bean provides ...", id = "1"), @Pojo(name = "AddressLookup_Blacklisting", description = "the method is not visible", id = "2", filter = "blacklisting")})
public class AddressLookup {
@Params(name = {"postcode"})
@Method(name = "getAddress", description = "Gets address", id = "1")
public String getAddress(String postcode){
...
...
}
@Params(name = "name")
@Method(name = "validate", description = "Validates name", id = "1")
public void validate(String name){
...
...
}
@Method(name = "testBlackListing", description = "testBlackListing Method", id = "2")
public Address testBlackListing(){
...
...
}
}
ここでは ID が一致しているため、メソッド「getAddress」と「validate」が Pojo AddressLookup に関連付けられます。
同様に、メソッド testBlackListing は AddressLookup_Blacklisting Pojo に関連付けられます。
@Pojos 注釈には、次の属性があります。
- pojo - 必須。
これは、@Pojo 注釈の配列です。
注 : 注釈サポートは、Java 5.0 と Java 6.0 のユーザー専用です。
現在、サポートされているのは前述の注釈だけです。
残りのエレメントに対するサポートは、RPCAdapterConfig.xml ファイルによって提供される予定です。
JSON/XML への結果のマッピング
RPC アダプターでは、出力フォーマットは JSON または XML のどちらかです。
XML への結果のマッピング
以下に、各種シナリオのもとで生成されるさまざまな XML 出力をリストします。
戻りの型が void の場合
戻りの型が void の場合、以下のように、生成される XML 出力は空の結果タグになります。
戻りの型が primitive、wrapper、または string の場合
JavaBeans のメソッドが public int getSalary()
の場合は、出力は以下のようになります。
80000
JavaBeans のメソッドが public String getMessage()
の場合、出力例は以下のようになります。
Hello World
JavaBeans のメソッドが public Boolean isLeapYear(int year)
の場合、出力例は以下のようになります。
true
戻りの型が Collection の場合
戻りの型が collection の場合、出力はエレメントの集合であり、各エレメントがコレクションのエントリーを表しています。
コレクションに、抑制されたオブジェクト・タイプのインスタンスが含まれている場合、そのエントリーは無視されます。
JavaBeans のメソッドが public Collection getEmployees()
であり、
返された collection に Employee のインスタンスが含まれている場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
ユーザーはオブジェクト・タイプの別名を指定できます。
Employee クラスの別名が employee の場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
戻りの型が Array の場合
戻りの型が Array の場合、出力はエレメントの集合であり、各エレメントが配列のエントリーを表しています。
JavaBeans のメソッドが public Employee[] getEmployees()
であり、
返された Array が Employee のインスタンスから構成されている場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
戻りの型が Map の場合
戻りの型が Map の場合、出力はエレメントの集合になり、各エレメントはマップ内のキー値の組を表します。
ノード名がキーになります。
JavaBeans のメソッドが public Map getDepartments()
であり、
返された map が部門コードと部門詳細のキー値の組である場合、
出力例は以下のようになります。
Computer Science
Dan Johns
Electronics and Communication
Iva Brown
戻りの型が JavaBeans の場合
戻りの型が JavaBeans の場合、すべての読み取りメソッドと読み取りメソッドがない public フィールドは、XML シリアライズとみなされます。JavaBeans はエレメントで表されます。
このエレメントのノード名は、エレメントが表す JavaBeans の型です。
Bean に別名が指定されている場合は、その別名はノード名としても使用されます。
JavaBeans のメソッドが public Employee getEmployee()
の場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
Employee にマネージャーの Employee 参照が含まれている場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
助言:
employee に collection のフィールド・アドレス・タイプが含まれている場合、出力例は以下のようになります。
James
Smith
Software Developer
IBM
John
Dow
Manager
IBM
JSON への結果のマッピング
以下に、各種シナリオで生成されるさまざまな JSON 出力について説明します。
戻りの型が void の場合
戻りの型が void の場合、生成される JSON 出力は JSON の結果オブジェクトになります。
{"result":null,"error":null,"id":1}
戻りの型が primitive、wrapper、または string の場合
JavaBeans のメソッドが public int getSalary()
の場合、出力例は以下のようになります。
{"result":20000,"error":null,"id":1}
JavaBeans のメソッドが public String getMessage()
の場合、出力例は以下のようになります。
{"result":"Hello World","error":null,"id":1}
JavaBeans のメソッドが public Boolean isLeapYear(int year)
の場合、出力例は以下のようになります。
{"result":true,"error":null,"id":1}
戻りの型が Collection の場合
戻りの型が collection の場合、出力はエレメントの集合であり、各エレメントがコレクションのエントリーを表しています。
コレクションに、抑制されたオブジェクト・タイプのインスタンスが含まれている場合、そのエントリーは無視されます。
JavaBeans 内のメソッドが public Collection getEmployees()
であり、
返されたコレクションに Employee のインスタンスが含まれている場合、出力例は以下のようになります。
{"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}
戻りの型が Array の場合
戻りの型が Array の場合、出力はエレメントの集合であり、各エレメントが配列のエントリーを表しています。
JavaBeans のメソッドが public Employee[] getEmployees()
であり、
返された Array が Employee のインスタンスから構成されている場合、出力例は以下のようになります。
{"result":[{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},{"firstName":"John","lastName":"Dow","designation":"CEO","company":"IBM"}],"error":null,"id":1}
戻りの型が Map の場合
戻りの型が Map の場合、出力はキー値の組の集合になります。
JavaBeans のメソッドが public Map getDepartments()
であり、
返された map が部門コードと部門詳細のキー値の組である場合、出力例は以下のようになります。
{"result":[{"deptName":"name1","deptHead":"head1"},{"deptName":"name2","deptHead":"head2"}],"error":null,"id":1}
戻りの型が JavaBeans の場合
JavaBeans は、フィールド名としての key とフィールドの値としての value を持つキー値の組として表されます。public フィールドと getter があるフィールドのみがシリアライズされます。
JavaBeans のメソッドが public Employee getEmployee()
の場合、出力例は以下のようになります。
{"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM"},"error":null,"id":1}
Employee にマネージャーの Employee 参照が含まれている場合、出力例は以下のようになります。
{"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","manager":{"firstName":"Martin","lastName":"Smith","designation":"Manager","company":"IBM"}},"error":null,"id":1}
employee に collection のフィールド・アドレス・タイプが含まれている場合、出力例は以下のようになります。
{"result":{"firstName":"James","lastName":"Smith","designation":"Software Developer","company":"IBM","adresses":["address1","address2","address3"]},"error":null,"id":1}
インスタンスの再利用
RPC アダプターは、(1) 要求別に新規 JavaBeans をインスタンス化する、または (2) ユーザー別にインスタンスを再利用するように構成することができます。(例えば、ショッピング・カート・オブジェクトは後者として構成することができます。)
デフォルトでは、要求別に新規 JavaBeans がインスタンス化されます。
再利用は Bean 記述子情報を介して構成します。
詳しくは、SampleBeanInfo API の資料を参照してください。
ベスト・プラクティス
含まれているロジック
一部のコマンドは、サービスとして直接公開しないことを想定して作成されています。
この場合、JavaBeans アクセサーに暗黙のロジックを含めることで作成することができます。
例えば、PlantsByWebSphere サンプルの ShoppingCart EJB には、
addItem(StoreItem item) メソッドが含まれています。StoreItem オブジェクトにはアイテム価格が含まれています。
したがって、この設計では、ShoppingServlet サーブレットの以下のようなものなど、信頼されたソースのみがメソッドを呼び出すと想定しています。
// Add item to cart.
if (shoppingCart != null)
{
String invID = req.getParameter("itemID");
try
{
Catalog catalog = catalogHome.create();
StoreItem si = catalog.getItem(invID);
si.setQuantity(Integer.parseInt(req.getParameter("qty").trim()));
shoppingCart.addItem(si);
}
catch (javax.ejb.CreateException e)
{
}
ShoppingServlet には、addItem(String itemID, String qty) のような仮想メソッドを効率よく作成するロジックが含まれていることに注意してください。その同じロジックは、
以下のように JavaBeans アクセサーに実装することができます。
public class ShoppingCartAccessor implements SelfBeanInfo {
private static ShoppingCartHome _home = (ShoppingCartHome) Util.getEJBHome("java:comp/env/ejb/ShoppingCart",
com.ibm.websphere.samples.plantsbywebsphereejb.ShoppingCartHome.class);
private ShoppingCart _bean;
public static String[][] getBeanDescriptorInfo() {
String [][] descriptor = {
{"bean", "storeInSession", "true"},
{"method", "addItem", "Add item to the shopping cart.", "POST", "itemId", "ID of the desired item",
"quantity", "number of items"},
};
return(descriptor);
}
public ShoppingCartAccessor() throws RemoteException, CreateException {
_bean = _home.create();
}
public void addItem(String invID, int quantity) throws RemoteException {
CatalogAccessor catalog;
try {
catalog = new CatalogAccessor();
} catch (CreateException e) {
throw new RemoteException(e.getMessage(), e);
}
StoreItem si = catalog.getItem(invID);
si.setQuantity(quantity);
_bean.addItem(si);
}
}
XML スキーマ:
以下に、RPCAdapterConfig.xml ファイルの XML スキーマの例を示します。
|