Фабрика запросов GWT — несколько локаторов сущностей для одного и того же типа сущностей

Я хочу иметь возможность использовать разные локаторы сущностей для одного и того же объекта домена. Я использую Twig, и у него есть возможность загрузить объект полностью или частично. Когда я запускаю облегченный запрос fetchRangeLite, вместо TwigLiteLocator используется локатор TwigLocator. Моя текущая реализация:

Прокси

@ProxyFor(value = MyDomain.class, locator = TwigLocator.class)
public interface MyDomainProxy extends EntityProxy {}

@ProxyFor(value = MyDomain.class, locator = TwigLiteLocator.class)
public interface MyDomainLiteProxy extends EntityProxy {}

Запрос

@Service(value = MyDao.class, locator = DaoServiceLocator.class)
public interface MyRequest extends RequestContext {
    Request<List<MyDomainProxy>> fetchRange(Integer start, Integer length);
    Request<Integer> getCount();
    Request<List<MyDomainLiteProxy>> fetchRangeLite(Integer start, Integer length);
}

ДАО

public List<MyDomain> fetchRange(Integer start, Integer length) {
  ...   
}

public List<MyDomain> fetchRangeLite(Integer start, Integer length) {
  ...   
}

Я ожидал, что будет использоваться упрощенный локатор, но это не так. Так как же RF выбирает, какой локатор следует использовать для определенного типа домена?

ОБНОВЛЕНИЕ

Мой объект домена состоит из списка списков.

public class MyDomain extends DatastoreObject {
  private List<A> a;
}

public class A {
  private List<B> b;
}

Когда прокси моего объекта MyDomain отправляется с сервера клиенту, Twig также загружает все A и все B, что требует времени. Меня интересует только свойство объекта MyDomain, поэтому я хочу использовать «облегченный» локатор.

TwigLocator

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

TwigLiteLocator

@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
    ObjectDatastore myDatastore = datastoreProvider.get();
    myDatastore.setActivationDepth(0);
    DatastoreObject object = myDatastore.load(clazz, id);
    return object;
}

myDatastore.setActivationDepth(0); указывает хранилищу данных загружать только свойства в MyDomain, а не свойства подуровня (списка).

Реализация DAO одинакова, поэтому идентификатор и версия одинаковы для обоих прокси.


person Sydney    schedule 16.07.2011    source источник


Ответы (1)


Я не уверен, почему RF не использует «облегченный» локатор, но я также не уверен, почему это может быть проблемой: разве идентификатор и версия не должны быть одинаковыми для MyDomain независимо от того, какой прокси-сервер используется?

На самом деле, я не понимаю, зачем в этом случае вам нужны два разных локатора: «полная» или «облегченная» выборка выполняется в вашем DAO, а не в локаторах. Единственной причиной наличия двух разных локаторов может быть различная реализация find, когда прокси отправляется с клиента на сервер (find также используется реализацией isLive по умолчанию, но в целом это хорошая идея чтобы переопределить его своей собственной реализацией, если только вариант по умолчанию уже не является «наиболее оптимизированным»: find(obj.getClass(), getId(obj)) != null)

person Thomas Broyer    schedule 16.07.2011
comment
См. Обновление, а также когда вызывается метод find? Это только когда прокси отправляется с клиента на сервер, или он также вызывается, когда прокси отправляется с сервера на клиент? - person Sydney; 16.07.2011
comment
find вызывается только реализацией по умолчанию isLive при отправке с сервера на клиент. isLive вызывается для всех объектов, видимых в данном вызове (клиент-сервер и сервер-клиент). find будет вызываться непосредственно при отправке от клиента к серверу, чтобы получить объект для применения различий (поскольку RF отправляет различия только по сети для связи клиент-сервер). - person Thomas Broyer; 17.07.2011
comment
Как это работает для ValueProxy? Кажется, что локатор вообще не вызывается. Я бы потерял функцию сравнения, но мне все равно, так как я работаю с частично загруженным объектом. Кстати, я использую прокси в CellBrowser, поэтому на более высоком уровне мне не нужна вся информация. - person Sydney; 17.07.2011
comment
Для ValueProxys всегда вызывается только метод create для Locator: нет идентификатора или версии, поэтому нет необходимости в find и isLive. И getDomainType на самом деле никогда не вызывается (даже для EntityProxy). - person Thomas Broyer; 17.07.2011