GVKun编程网logo

RequestFactory理论:为什么经常调用Locator <>。find()?(为什么要调用函数)

21

对于RequestFactory理论:为什么经常调用Locator<>。find感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍?,并为您提供关于android–AppEngineRequest

对于RequestFactory理论:为什么经常调用Locator <>。find感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍,并为您提供关于android – AppEngine RequestFactory还是“Normal”方法?、android – Eclipse中的间歇性RequestFactory错误、BeanFactory定位器的使用:BeanFactoryLocator、DataFactory 调试错误 - BadRequest - 工厂被删除的有用信息。

本文目录一览:

RequestFactory理论:为什么经常调用Locator <>。find()?(为什么要调用函数)

RequestFactory理论:为什么经常调用Locator <>。find()?(为什么要调用函数)

我是RequestFactory的新手,但是在ThomasBroyer的慷慨帮助下,并且在查看了下面的文档后,它变得越来越好:)

  • RequestFactory入门
  • 索取工厂活动零件
  • GWT 2.4中的RequestFactory更改

但是请您解释一下为什么Locator<>.find()经常被不必要地打扰(我认为)?

在我的示例项目中,我有两个实体“组织”和“人”来维护父子关系。当我获取组织时,Objectify会 自动
获取子Person。另外,我在服务层中创建了两个方法findOrganizationById,分别saveOrganization用于加载和持久化对象。

现在考虑两种情况:

当我findOrganizationById在客户端中致电时,服务器端会发生以下呼叫:

OrderDao.findOrganizationById(1)PojoLocator.getId(Key<?>(Organization(1)))PojoLocator.getId(Key<?>(Organization(1)/Person(2)))PojoLocator.getId(Key<?>(Organization(1)))PojoLocator.find(Key<?>(Organization(1)))PojoLocator.getId(Key<?>(Organization(1)/Person(2)))PojoLocator.find(Key<?>(Organization(1)/Person(2)))

通过调用,OrderDao.findOrganizationById我已经收到了完整的对象图。为什么.find还要打两次电话呢?这是Datastore上的额外负载,这使我花了很多钱。我当然缓存了它,但是对其进行修复很简洁。如何避免这些额外的电话?

当我通过saveOrganization在客户端中调用来保存对象时,也会发生类似的事情。服务器端发生以下调用:

PojoLocator.find(Key<?>(Organization(1)))PojoLocator.find(Key<?>(Organization(1)/Person(2)))OrderDao.saveOrganization(1)PojoLocator.getId(Key<?>(Organization(1)))PojoLocator.find(Key<?>(Organization(1)))PojoLocator.getId(Key<?>(Organization(1)/Person(2)))PojoLocator.find(Key<?>(Organization(1)/Person(2)))

我可以理解需要 在* 更新 之前
从DataStore提取两个对象。RequestFactory将增量发送到服务器,因此在持久存储之前,它需要具有整个对象。不过,由于我一次加载了完整图表,因此最好不要再调用第二个PojoLocator.find(Key<?>(Organization(1)/Person(2)))。坚持下来
之后 ,我真的不明白需要.find()打来的电话。
*

有什么想法吗?

我的代理

@ProxyFor(value = Organization.class, locator = PojoLocator.class)public interface OrganizationProxy extends EntityProxy{    public String getName();    public void setName(String name);    public String getAddress();    public void setAddress(String address);    public PersonProxy getContactPerson();    public void setContactPerson(PersonProxy contactPerson);    public EntityProxyId<OrganizationProxy> stableId();}@ProxyFor(value = Person.class, locator = PojoLocator.class)public interface PersonProxy extends EntityProxy{    public String getName();    public void setName(String name);    public String getPhoneNumber();    public void setPhoneNumber(String phoneNumber);    public String getEmail();    public void setEmail(String email);    public OrganizationProxy getOrganization();    public void setOrganization(OrganizationProxy organization);}

我的服务

public interface AdminRequestFactory extends RequestFactory{    @Service(value = OrderDao.class, locator = InjectingServiceLocator.class)    public interface OrderRequestContext extends RequestContext    {        Request<Void> saveOrganization(OrganizationProxy organization);        Request<OrganizationProxy> findOrganizationById(long id);    }    OrderRequestContext contextOrder();}

最后是我的定位器<>

public class PojoLocator extends Locator<DatastoreObject, String>{    @Inject Ofy ofy;    @Override    public DatastoreObject create(Class<? extends DatastoreObject> clazz)    {        try        {            return clazz.newInstance();        } catch (InstantiationException e)        {            throw new RuntimeException(e);        } catch (IllegalAccessException e)        {            throw new RuntimeException(e);        }    }    @Override    public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id)    {        Key<DatastoreObject> key = Key.create(id);        DatastoreObject load = ofy.load(key);        return load;    }    @Override    public Class<DatastoreObject> getDomainType()    {        return null;    // Never called    }    @Override    public String getId(DatastoreObject domainObject)    {        Key<DatastoreObject> key = ofy.fact().getKey(domainObject);        return key.getString();    }    @Override    public Class<String> getIdType()    {        return String.class;    }    @Override    public Object getVersion(DatastoreObject domainObject)    {        return domainObject.getVersion();    }}

答案1

小编典典

成对的getIdfind结尾是的默认实现Locator#isLive:如果通过其ID查找到对象返回非空值,则假定该对象处于 活动状态
(即数据存储中仍存在)。

RF会在构造响应时检查EntityProxy在请求/响应期间看到的每个对象的 活跃性
,以告知客户端实体何时被删除(在客户端,它随后会EntityProxyChange通过DELETE write操作 触发一个事件。

当然你也可以超越的isLiveLocator用更优化的实现,如果你能提供一个。

android – AppEngine RequestFactory还是“Normal”方法?

android – AppEngine RequestFactory还是“Normal”方法?

这不是一个真正的问题,更像是一般的X对Y问题.

所以我正在使用谷歌应用程序引擎编写的服务器在Android上试验c2dm.目前我正在使用“App Engine Connected Android Project”作为模板,我自己添加了一些代码.因此,生成的代码使用RequestFactory来处理大量内容,例如注册/取消注册设备,发送消息等.

我之前的后端通信经验是建立与servlet的连接,写入它(json)和读取响应(json).

所以这就是问题:
使用RequestFactory与app引擎进行通信而不仅仅是从URLConnection的输入/输出流中写入/读取有什么好处(如果有的话)?
或者它真的只是品味问题?

解决方法

请求工厂的一个缺点是它在检索对象时非常慢.自定义servlet和http请求要快得多(快10倍-20倍!).

查看此帖子了解更多详情RequestFactory slow on Android

android – Eclipse中的间歇性RequestFactory错误

android – Eclipse中的间歇性RequestFactory错误

我在AppEngine连接的 Android项目中成功使用了RequestFactory好几个月.但有时候,我在我的子类RequestFactory的文件中遇到了问题

public interface MyRequestFactory extends RequestFactory {
    ...
}

Eclipse在“public interface …”行上给了我一个红色X,我得到的错误如下所示. (注意这不是运行时,它只是在我正在编辑的Eclipse窗口中)

奇怪的是,我通常可以做几个Project->清理和编辑代码几次,从不进行任何实际的代码更改,然后“保存”,问题总是消失.这次它被卡住了.

有任何想法吗?

java.lang.NullPointerException at
org.eclipse.jdt.apt.core.internal.AptCompilationParticipant.addJava6GeneratedFile(AptCompilationParticipant.java:272)
at
org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeProcessingEnvImpl.addNewUnit(IdeProcessingEnvImpl.java:132)
at
org.eclipse.jdt.internal.apt.pluggable.core.filer.IdeJavaSourceOutputStream.close(IdeJavaSourceOutputStream.java:72)
at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:319) at
sun.nio.cs.StreamEncoder.close(StreamEncoder.java:148) at
java.io.OutputStreamWriter.close(OutputStreamWriter.java:233) at
java.io.BufferedWriter.close(BufferedWriter.java:265) at
java.io.PrintWriter.close(PrintWriter.java:312) at
com.google.web.bindery.requestfactory.apt.DeobfuscatorBuilder.visitType(DeobfuscatorBuilder.java:146)
at
com.google.web.bindery.requestfactory.apt.DeobfuscatorBuilder.visitType(DeobfuscatorBuilder.java:43)
at
org.eclipse.jdt.internal.compiler.apt.model.TypeElementImpl.accept(TypeElementImpl.java:60)
at
javax.lang.model.util.ElementScanner6.scan(ElementScanner6.java:139)
at
com.google.web.bindery.requestfactory.apt.ScannerBase.scan(ScannerBase.java:63)
at
com.google.web.bindery.requestfactory.apt.State.executeJobs(State.java:248)
at
com.google.web.bindery.requestfactory.apt.RfValidator.process(RfValidator.java:83)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.Rounddispatcher.handleProcessor(Rounddispatcher.java:139)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.Rounddispatcher.round(Rounddispatcher.java:121)
at
org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManag
er.java:159) at
org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorMan
ager.java:134) at
org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:813)
at
org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:432)
at
org.eclipse.jdt.internal.core.builder.AbstractimageBuilder.compile(AbstractimageBuilder.java:364)
at
org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.compile(IncrementalImageBuilder.java:329)
at
org.eclipse.jdt.internal.core.builder.AbstractimageBuilder.compile(AbstractimageBuilder.java:301)
at
org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:134)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:265)
at
org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:193)
at org.eclipse.core.internal.events.BuildManager
$2.run(BuildManager.java:728) at
org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:199)
at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:239)
at org.eclipse.core.internal.events.BuildManager
$1.run(BuildManager.java:292) at
org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) at
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:295)
at
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:351)
at
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:374)
at
org.eclipse.core.internal.events.AutoBuildJob.dobuild(AutoBuildJob.java:143)
at
org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:241)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

解决方法

这是一个已知的Eclipse bug.我发现的唯一解决方案是重启eclipse.有时我必须在没有注释的情况下编译然后重新启动.

BeanFactory定位器的使用:BeanFactoryLocator

BeanFactory定位器的使用:BeanFactoryLocator

(一)BeanFactoryLocator接口

//BeanFactory的定位器,用来查找、使用或释放一个BeanFactory
public interface BeanFactoryLocator {
    //根据参数factoryKey封装一个BeanFactoryReference,factoryKey代表的BeanFactory是BeanFactoryReference的成员属性
	BeanFactoryReference useBeanFactory(String factoryKey) throws BeansException;
}

(二)BeanFactoryReference接口

public interface BeanFactoryReference {

	//返回该reference持有的beanFactory
	BeanFactory getFactory();

	//释放该reference,通常是由于客户端不再需要
	void release();
}

(三)SingletonBeanFactoryLocator类

 

DataFactory 调试错误 - BadRequest - 工厂被删除

DataFactory 调试错误 - BadRequest - 工厂被删除

我认为这不是一个常见的错误。
根据 policy,我认为您应该检查您的帐户,看看您的 ADF 是否被禁用。

我们今天的关于RequestFactory理论:为什么经常调用Locator <>。find的分享已经告一段落,感谢您的关注,如果您想了解更多关于android – AppEngine RequestFactory还是“Normal”方法?、android – Eclipse中的间歇性RequestFactory错误、BeanFactory定位器的使用:BeanFactoryLocator、DataFactory 调试错误 - BadRequest - 工厂被删除的相关信息,请在本站查询。

本文标签: