0

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 に実装されているものがあるかどうかです。

4

1 に答える 1