GWT の RequestFactory を使用して、クライアントとサーバーの間で不変の型を双方向に渡そうとしているとします。基になる型が TimeOfDay であるとしましょう。これは不変になるように設計されています。
public class TimeOfDay {
private final int hours;
private final int minutes;
public TimeOfDay(final int hours, final int minutes) {...}
public int getHours() {...}
public int getMinutes() {...}
}
このクラスを ValueProxy でプロキシできます。
@ProxyFor(TimeOfDay.class)
public interface TimeOfDayProxy extends ValueProxy {
public int getHours();
public int getMinutes();
}
これで、サーバー側で TimeOfDay インスタンスを非常に簡単に作成し、サーバー側でこれを介してクライアントに返すことができます。
public class TimeOfDayService {
public static TimeOfDay fetchCurrentTofD() {
return new TimeOfDay(16, 20);
}
}
...そしてこれはクライアント側で:
@Service(TimeOfDayService.class)
public interface TimeOfDayRequestContext extends RequestContext {
Request<TimeOfDayProxy> fetchCurrentTofD();
}
...
final Receiver<TimeOfDayProxy> receiver = new Receiver<TimeOfDayProxy>() {...};
final TimeOfDayRequestContext context = myFactory.timeOfDayRequestContext();
final Request<TimeOfDayProxy> fetcher = context.fetchCurrentTofD();
fetcher.fire(receiver);
...
これはうまくいきます。でも、これを逆にやってみると引っかかる。つまり、サーバー側では:
public class TimeOfDayService {
public static void setCurrentTofD(final TimeOfDay tofd) {...}
}
...そしてクライアント側:
@Service(TimeOfDayService.class)
public interface TimeOfDayRequestContext extends RequestContext {
Request<Void> setCurrentTofD(TimeOfDayProxy tofd);
}
...
final Receiver<Void> receiver = new Receiver<Void>() {...};
final TimeOfDayRequestContext context = myFactory.timeOfDayRequestContext();
final TimeOfDayProxy tofdProxy = GWT.create(TimeOfDayProxy.class);
<???>
final Request<Void> setter = context.setCurrentTofD(tofdProxy);
setter.fire(receiver);
...
問題点 1 は、GWT.create() がデフォルトで構築されたプロキシを作成するだけなので (つまり、"???" の代わりに何が入るのか?)、tofdProxy の (不変の) コンテンツを設定する方法がないことです。思わぬ障害 #2 は、サーバー側の「No setter」エラーです。
これらの障害を回避する魔法はありますか? AutoBeanFactory.create() には、autobean によってラップされるオブジェクトを取る 2 つの引数のバリアントがあります --- そのようなものが Snag #1 を処理します (そのようなものが ValueProxys の create() に存在する場合)。Snag #2 については、この問題に対処する賢い方法がたくさんあると思います。問題は、まだ GWT に実装されているものがあるかどうかです。