向服务器上游的不可变类发送ValueProxy

时间:2011-09-06 15:23:45

标签: gwt immutability requestfactory

假设我试图使用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);
...

Snag#1是我无法设置tofdProxy的(不可变)内容,因为GWT.create()只是一个默认的构造代理(即代替“???”?)。 Snag#2是服务器端的“No setter”错误。

是否有一些魔法来规避这些障碍? AutoBeanFactory.create()有一个双参数变量,它将一个对象包含在一个autobean中 - 类似于Snag#1(如果ValueProxys的create()存在这样的东西)。至于Snag#2,我确信有很多聪明的方法可以解决这个问题;问题是,GWT还没有实现吗?

1 个答案:

答案 0 :(得分:0)

RequestFactory需要带有setter的default-instantiable类,用于客户端到服务器的通信。

使用构建器模式添加对不可变类的支持的待处理增强请求:http://code.google.com/p/google-web-toolkit/issues/detail?id=5604