对于RequestFactory理论:为什么经常调用Locator<>。find感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍?,并为您提供关于android–AppEngineRequest
对于RequestFactory理论:为什么经常调用Locator <>。find感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍?,并为您提供关于android – AppEngine RequestFactory还是“Normal”方法?、android – Eclipse中的间歇性RequestFactory错误、BeanFactory定位器的使用:BeanFactoryLocator、DataFactory 调试错误 - BadRequest - 工厂被删除的有用信息。
本文目录一览:- RequestFactory理论:为什么经常调用Locator <>。find()?(为什么要调用函数)
- android – AppEngine RequestFactory还是“Normal”方法?
- android – Eclipse中的间歇性RequestFactory错误
- BeanFactory定位器的使用:BeanFactoryLocator
- DataFactory 调试错误 - BadRequest - 工厂被删除
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
小编典典成对的getId
和find
结尾是的默认实现Locator#isLive
:如果通过其ID查找到对象返回非空值,则假定该对象处于 活动状态
(即数据存储中仍存在)。
RF会在构造响应时检查EntityProxy
在请求/响应期间看到的每个对象的 活跃性
,以告知客户端实体何时被删除(在客户端,它随后会EntityProxyChange
通过DELETE
write操作 触发一个事件。
当然你也可以超越的isLive
你Locator
用更优化的实现,如果你能提供一个。
android – AppEngine RequestFactory还是“Normal”方法?
所以我正在使用谷歌应用程序引擎编写的服务器在Android上试验c2dm.目前我正在使用“App Engine Connected Android Project”作为模板,我自己添加了一些代码.因此,生成的代码使用RequestFactory来处理大量内容,例如注册/取消注册设备,发送消息等.
我之前的后端通信经验是建立与servlet的连接,写入它(json)和读取响应(json).
所以这就是问题:
使用RequestFactory与app引擎进行通信而不仅仅是从URLConnection的输入/输出流中写入/读取有什么好处(如果有的话)?
或者它真的只是品味问题?
解决方法
查看此帖子了解更多详情RequestFactory slow on Android
android – Eclipse中的间歇性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)
解决方法
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 - 工厂被删除
我认为这不是一个常见的错误。
根据 policy,我认为您应该检查您的帐户,看看您的 ADF 是否被禁用。
我们今天的关于RequestFactory理论:为什么经常调用Locator <>。find和?的分享已经告一段落,感谢您的关注,如果您想了解更多关于android – AppEngine RequestFactory还是“Normal”方法?、android – Eclipse中的间歇性RequestFactory错误、BeanFactory定位器的使用:BeanFactoryLocator、DataFactory 调试错误 - BadRequest - 工厂被删除的相关信息,请在本站查询。
本文标签: