Отправка ValueProxy для неизменяемого класса в восходящем направлении на сервер - PullRequest
0 голосов
/ 06 сентября 2011

Предположим, я пытаюсь использовать RequestFactory GWT для передачи неизменяемого типа между клиентом и сервером, двунаправленно.Допустим, базовым типом является 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 в том, что у меня нет способа установить (неизменяемое) содержимое tofdProxy, поскольку GWT.create () просто создает встроенный прокси по умолчанию (т. е. что идет вместо «???»?).Замедление № 2 - это ошибка «Нет установщика» на стороне сервера.

Есть ли какое-то волшебство, чтобы обойти эти препятствия?AutoBeanFactory.create () имеет вариант с двумя аргументами, который принимает объект, обертываемый autobean - что-то вроде этого позаботится о Snag # 1 (если бы такая вещь существовала для create () ValueProxys).Что касается Snag # 2, я уверен, что есть много умных подходов для решения этой проблемы;вопрос в том, были ли еще реализованы в GWT?

1 Ответ

0 голосов
/ 07 сентября 2011

RequestFactory требует инстанцируемых по умолчанию классов с установщиками для связи клиент-сервер.

Существует отложенный запрос на улучшение для добавления поддержки неизменяемых классов с использованием шаблона построителя: http://code.google.com/p/google-web-toolkit/issues/detail?id=5604

...