JSONRPCBridge
JSONRPCBridgeには、register〜
というメソッドがいくつかある。
それぞれを以下に説明する。
void registerObject(Object key, Object o)
o
のインスタンスメソッド全てをリモートメソッドとして登録する。
これは先の例でも使った。
void registerClass(String name, Class clazz)
clazz
のクラスメソッド全てをリモートメソッドとして登録する。
GlobalBridgeオブジェクト
全てのリクエストで呼出可能なリモートメソッドを登録するときに使う。
GlobalBridge
とは、JSONRPCBridge
クラスのクラス変数。
型は、JSONRPCBridge
なので、今まで説明したregisterXXXXはすべて使える。
いままで説明したメソッドを使った場合と、GlobalBridge
を使った場合で何が違うかというと。
GlobalBridge
でリモートメソッドを登録すると、そのメソッドは全てのクライアントで呼出可能になるということ。
また、同じ名前でリモートメソッドが登録されているときは以下の順で選ばれる。(上にある方が優先度が高い。)
void registerReference(Class clazz)
中身(プロパティ)を見せたくないクラスを登録する。
例えば、セキュリティに関わるようなクライアントに見せちゃいけない情報を持つクラスを登録する。
以下のように、Barクラスを持つFooクラスがある。
public class Foo { private Bar bar = new Bar(); public Bar getBar() { return bar; } public void setBar(Bar bar) { this.bar = bar; } } public class Bar { public String getName() { return "BARID"; } }
上記のFooクラスのオブジェクトが"foo"
という名前で登録されているとき、Barオブジェクトを取得するJavaScriptコードは以下のようになる。
var jsonrpc = new JSONRocClient("/jsonrpc/JSON-RPC"); var result = jsonrpc.foo.getBar();
registerReference
が呼ばれていない場合、result
には、以下のようなオブジェクトが返される。
{"javaClass":"mypackage.Bar","id":"BARID"};
一方、以下のように、registerReference
が呼ばれている場合、
JSONRPCBridge.registerReference(mypackage.Bar.class);
result
には、以下のようなオブジェクトが設定される。
{"javaClass":"mypackage.Bar","objectID":33507544,"JSONRPCType":"Reference"}
ただし、直接JSONRPCBridge
に登録されているBarオブジェクトを呼び出す場合は、中身は見えてしまう。
void registerCallableReference(Class clazz)
ネストしたリモート呼出を許可したいクラスを設定する。
このメソッドを使うと、リモート呼出で取得したオブジェクトが持っているメソッドをさらにリモート呼出することが可能になる。
registerReference
で使用したクラスを用いて説明する。
通常、JavaScriptのコードから、Fooオブジェクトが持つidプロパティを取得するコードは以下のように書く。
var jsonrpc = new JSONRocClient("/jsonrpc/JSON-RPC"); var result = jsonrpc.foo.getBar().id;
JSONRPCのデフォルトでは、リモート呼出(getBar
の呼出)の結果が、特定のクラス(String,List,int,Integer等)でない場合は、JavaBeansの規約に従い呼出結果のオブジェクトをJavaScriptのオブジェクトに変換する。
なので、上記のコード〜.getBar().id
で望む結果を得ることができる。
これはこれで便利、だけどBarクラスにあるプロパティしか見えない。
そこでregisterCallableReference
にBarクラスを登録する。
JSONRPCBridge.registerCallableReference(mypackage.Bar.class);
すると、以下の呼出が可能になる。
var jsonrpc = new JSONRocClient("/jsonrpc/JSON-RPC"); var result = jsonrpc.foo.getBar().getId();
ただし、〜.id
のような参照はできなくなる。