GWT RequestFactory и несколько типов

В моем приложении GWT есть десять различных типов сущностей. Прямо сейчас я использую старые добрые DTO и переношу их через GWT-RPC. Это хорошо работает для таких случаев, как запуск — я могу упаковать их все в один запрос.

Я рассматриваю возможность перехода на RequestFactory, потому что за время существования приложения много раз (в среднем 30 минут) мне просто нужно обновить один тип объекта, а функции унификации/сбережения полосы пропускания RequestFactory привлекательны. НО: я не вижу способа загрузить все мои данные инициализации в одном запросе при загрузке приложения. Я не хочу делать десять запросов, чтобы получить все данные инициализации для моих десяти типов сущностей.

Есть ли способ сделать GeneralRequestContext или что-то в этом роде? Я был бы даже рад такому решению, как:

public interface InitDataProxy extends EntityProxy
{
    public UserProxy getInitUsers();
    public OrganizationProxy getInitOrganizations();
    ...
}

public interface GeneralRequestContext extends RequestContext
{
    Request<InitDataProxy> getInitData();
}

Но это не сработает, потому что я не хочу на самом деле поддерживать InitDataProxy чем-либо, я просто хочу использовать его для объединения нескольких разных типов прокси в одном запросе.

Итак: есть ли способ получить несколько несвязанных типов EntityProxy в одном запросе?

Я также был бы счастлив сделать обычный запрос gwt-rpc для выхода за пределы RequestFactory для этих данных, но я не хочу реализовывать дублирующиеся DTO для запуска рядом с прокси-серверами RequestFactory и писать собственный код для копирования DTO в их!


person Riley Lark    schedule 11.02.2011    source источник


Ответы (1)


Вместо этого InitDataProxy может расширять ValueProxy, что не требует, чтобы объект на сервере имел какую-либо семантику идентификатора или версии. Тип InitData на стороне домена может быть интерфейсом, возможно, реализованным с анонимным типом.

interface InitData {
  User getUser();
  Organization getOrgatization();
}
class InitService {
  static InitData makeInitData() {
    return new InitData() { ..... };
  }
}

@ProxyFor(InitData.class)
interface InitDataProxy extends ValueProxy {
  UserProxy getUser();
  OrganizationProxy getOrganization();
}
@Service(InitService.class)
interface Init extends RequestContext {
  Request<InitDataProxy> makeInitData();
}
person BobV    schedule 12.02.2011
comment
А, отлично. Спасибо - это сводит количество непреодолимых препятствий между мной и использованием RF до одного, и я тоже чувствую, что он рушится! Я ценю вашу работу! - person Riley Lark; 12.02.2011
comment
RequestContext можно рассматривать как набор вызовов методов, который позволяет вам группировать их в одном HTTP-запросе. Это означает, что вам не нужно объединять результаты в одном типе; вы можете вызвать несколько методов в RequestContext и только затем запустить () его, чтобы отправить вызовы метода на сервер в виде пакета. - person Thomas Broyer; 15.02.2011
comment
Привет, только что увидел это и скоро попробую это с ValueProxy. Но в прошлый раз, когда я экспериментировал с ValueProxys (хотя не помню версию GWT), GWT продолжал жаловаться на класс, за который выступает ValueProxy, отсутствует конструктор по умолчанию и отсутствуют методы установки для свойств. Посмотрим, работает ли это в текущих версиях :) - person Gandalf; 06.10.2011
comment
@ThomasBroyer, но если вы объедините несколько методов в одном RequestContext, а затем запустите (), то как вы предоставите один приемник каждому из этих методов? - person manubot; 05.01.2014
comment
Есть один Receiver для Request<?> и один глобальный Receiver<Void> для RequestContext (но этот не получает никакого значения, только глобальная информация об успешном/неудачном/ограниченном нарушении) - person Thomas Broyer; 05.01.2014