我希望能够为同一个域对象使用不同的实体定位器。我使用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);
}
道
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
还会加载所有A
' 和所有B
',这需要时间。我只对MyDomain
对象中的属性感兴趣,这就是我想使用“lite”定位器的原因。
树枝定位器
@Override
public DatastoreObject find(Class< ? extends DatastoreObject> clazz, Long id) {
ObjectDatastore myDatastore = datastoreProvider.get();
DatastoreObject object = myDatastore.load(clazz, id);
return object;
}
TwigLite 定位器
@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 实现是相同的,因此两个代理的 ID 和版本相同。