JSONRPCBridge

JSONRPCBridgeには、register〜というメソッドがいくつかある。
それぞれを以下に説明する。

void registerObject(Object key, Object o)

oインスタンスメソッド全てをリモートメソッドとして登録する。
これは先の例でも使った。

void registerClass(String name, Class clazz)

clazzのクラスメソッド全てをリモートメソッドとして登録する。

GlobalBridgeオブジェクト

全てのリクエストで呼出可能なリモートメソッドを登録するときに使う。
GlobalBridgeとは、JSONRPCBridgeクラスのクラス変数。
型は、JSONRPCBridgeなので、今まで説明したregisterXXXXはすべて使える。


いままで説明したメソッドを使った場合と、GlobalBridgeを使った場合で何が違うかというと。
GlobalBridgeでリモートメソッドを登録すると、そのメソッドは全てのクライアントで呼出可能になるということ。


また、同じ名前でリモートメソッドが登録されているときは以下の順で選ばれる。(上にある方が優先度が高い。)

  1. インスタンスメソッド
  2. GlobalBridgeのインスタンスメソッド
  3. クラスメソッド
  4. 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のような参照はできなくなる。