GWT / RequestFactory - Дерево ответа не загружено полностью, хотя параметры () выглядят нормально - PullRequest
1 голос
/ 30 марта 2012

У меня возникла следующая проблема при использовании GWT и фабрики запросов.

Я работаю над деревом объектов, состоящим из различных объектов, скажем, ссылок A и B, ссылок C на D.

У меня есть метод loadAs, который возвращает весь граф объекта, используя аннотации с (with("B", "C", "C.D")).Пока все выглядит отлично, и у меня загружена следующая структура на клиенте.

A1
  -> B1
  -> C1
    -> D1

Теперь я создаю следующее в контексте запроса на клиенте.

A* (created on the client using context.create() )
  -> B1 (same B1 that was already loaded)
  -> C* (created on the client using context.create())
    -> D1 (same D1 that was already loaded)

Мой постоянный методвыглядит так: Request<List<A>> persistAs(List<A>)

Я запускаю его с теми же параметрами, что и для loadAs (with("B", "C", "C.D")), но мой ответ выглядит так:

A* (now contains an id that was created on the server)
  -> B1 (same as the previously loaded)
  -> C* (now contains an id that was created on the server)
      -> null

Итак,D1, который уже существует на клиенте, не является частью дерева объектов ответа.Однако D1 отправляется на сервер и доступен в методе persistAs как часть дерева объектов запросов.Кроме того, persistAs гарантирует, что будет возвращено полное дерево объектов (содержится D1).

Понятия не имею, почему это происходит.Я также не знаю, где отлаживать.Я не получаю никаких исключений.

Дополнительная информация или выводы, которые я заметил при отладке и попытке зафиксировать это:

  • , когда я запускаю loadAs на клиенте после того, как они былисохранено, полный граф объектов возвращается
  • Я использую objectify как постоянство api
  • C - это супертип, который является абстрагирующим по своей природе, однако он реализован как обычный объект, и его подтипы слишкомТак как эта концепция работает везде, я не могу представить, что это проблема.Чтобы быть более точным: C всегда конкретный подтип.Ссылка от C к D, однако, находится непосредственно на супертипе C. C, и все его подтипы помечены как прокси-объекты сущностей и имеют соответствующие серверные сущности.
  • Для целей тестирования я изменил мою серверную реализациюМетод persistAs, чтобы он вызывал loadAs после сохранения As.Но тогда клиент вообще ничего не получает?!?См. Следующий пример кода для иллюстрации:

    List<A> persistAs(List<A> As) {
       //Persist the As
    
       // Make sure the object graph of the As is loaded
    
       // return As;
    
       // Debug only - return As using loadAs -> the client receives nothing at all
       return loadAs(As);
    }
    

1 Ответ

0 голосов
/ 30 марта 2012

Полагаю (я боюсь), это может быть странным следствием http://code.google.com/p/google-web-toolkit/issues/detail?id=7189

Попытка edit() использования вашего прокси D1 (и B1, как вы это делаете) перед вами fire()RequestContext.

...