GWT请求工厂 - 同一实体类型的多个实体定位器

时间:2011-07-16 00:39:34

标签: gwt requestfactory

我希望能够为同一个域对象使用不同的实体定位器。我使用Twig,它可以选择完全或部分加载对象。当我运行lite请求fetchRangeLite时,使用定位器TwigLocator而不是TwigLiteLocator。我目前的实施是:

代理

@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);
}

DAO

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

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

我期待使用lite定位器,但情况并非如此。那么RF如何选择它应该用于特定域类型的定位器呢?

更新

我的域对象由列表列表组成。

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

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

当我的MyDomain对象的代理服务器从服务器发送到客户端时,Twig还会加载所有AB的所有MyDomain个需要时间。我只对@Override public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) { ObjectDatastore myDatastore = datastoreProvider.get(); DatastoreObject object = myDatastore.load(clazz, id); return object; } 对象中的属性感兴趣,这就是我想使用“精简”定位器的原因。

TwigLocator

@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;
}

TwigLiteLocator

myDatastore.setActivationDepth(0);

MyDomain告诉数据存储区仅加载{{1}}中的属性,而不加载次级(List)属性。

DAO实现是相同的,因此两个代理的ID和版本都是相同的。

1 个答案:

答案 0 :(得分:0)

我不确定为什么RF没有使用“精简”定位器,但我不确定为什么它也可能是一个问题:不管代理是哪一个,MyDomain的ID和版本都不一样使用

实际上,我不明白为什么在这种情况下你确实需要两个不同的定位器:“完整”或“精简”抓取在DAO中完成,而不是在定位器中完成。拥有两个不同定位器的唯一原因是以不同方式实现find,当代理从客户端发送到服务器时(find也被默认实现使用isLive但是通常最好用你自己的实现来覆盖它,除非默认的那个已经是“最优化的”:find(obj.getClass(), getId(obj)) != null