我试图找出是否应该将我的gwt-rpc调用迁移到新的GWT2.1 RequestFactory cals.
Google文档模糊地提到RequestFactory是一种更好的客户端 - 服务器通信方法,用于"面向数据的服务"
我可以从文档中提炼出来的是有一个新的Proxy类可以简化通信(你不会来回传递实际的实体而只是代理,所以它更轻,更容易管理)
这是重点吗?还是我在大局中遗漏了其他东西?
几天前,我开始使用Google App Engine和Google Cloud Endpoints开发移动应用后端.本教程将介绍如何自动生成端点,以及Android的客户端库.
所以我们有我们的实体:
@Entity
public class Person implements IsSerializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
private String name;
//...
}
Run Code Online (Sandbox Code Playgroud)
这个类的端点:
@Api(name = "personendpoint")
public class PersonEndpoint {
@ApiMethod(name = "getPerson")
public Person getPerson(@Named("id") Long id) {
...
Run Code Online (Sandbox Code Playgroud)
此外,使用生成的Android端点库(使用REST API)我想在服务器上添加用户界面,使用Google Web Toolkit(GWT)构建.但是我应该如何操作服务器端的日期?我可以看到不同的方法......
选项A1:在GWT中添加RPC服务
public interface PersonServiceAsync {
void insertPerson(Person person, AsyncCallback<Person> callback);
}
@RemoteServiceRelativePath("api")
public interface PersonService extends RemoteService {
public Person insertPerson(Person person);
}
public class PersonServiceImpl …
Run Code Online (Sandbox Code Playgroud) 我们偶尔会遇到例外情况,例如:
com.google.gwt.user.client.rpc.SerializationException:类型"xxx"无法分配给"com.google.gwt.user.client.rpc.IsSerializable",并且没有自定义字段序列化程序.出于安全考虑,此类型不会序列化:com.google.gwt.user.client.rpc.impl中的com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610)中的instance = xxx .AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)维持在com.google.gwt.user.server com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write(ServerSerializationStreamWriter.java:152). rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:534)位于com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:609)位于com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:467)com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.的java:564)在com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:188)在de.softconex.travicemanager.server.TraviceManagerServiceImpl.processCall(TraviceManagerServiceImpl.java:615)在com.google .gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:224)在com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)在javax.servlet.http.HttpServlet .service(HttpServlet.java:710)位于org.apache.catalina.core.ApplicationFilterChain的javax.servlet.http.HttpServlet.service(HttpServlet.java:803).internalDoFilter(ApplicationFilterChain.java:290)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)在org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)在组织位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)的.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve) .java:230)在org.jboss的org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179). org.apache.catalina上的web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84).core.StandardHostValve.invoke(StandardHostValve.java:127)在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve. java:157)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)at org.apache.coyote.ajp .AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java:378)在org.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint .java:1508)在java.lang.Thread.run(Thread.java:619)调用(ErrorReportValve.java:102)在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler .process(AjpAprProtocol.java:378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)调用(ErrorReportValve.java:102)在org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler .process(AjpAprProtocol.java:378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java: 378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)connector.CoyoteAdapter.service(CoyoteAdapter.java:262)在org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)在org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process(AjpAprProtocol.java: 378)atg.apache.tomcat.util.net.AprEndpoint $ Worker.run(AprEndpoint.java:1508)at java.lang.Thread.run(Thread.java:619)
该应用程序通常正常运行.指示的类实现Serializable(整个对象图).
到目前为止,唯一的模式/观察是:
我们似乎只有在iframe中使用应用程序时才会遇到问题
当部署了新版本的应用程序时,似乎会出现问题
在隐私模式下运行firefox(禁用所有缓存等)并不能解决问题
有任何想法吗?
霍尔格
我正在计划一个新的应用程序,并一直在试验GWT作为可能的前端.我面临的设计问题是这个.
我应该使用选项A:GWT-RPC并快速构建应用程序
选项B:使用Spring MVC 3.0和所有优秀的@Controller,@ Service,@ Repository注释构建REST后端,并使用GWT覆盖功能和GWT请求构建器构建客户端库以与后端通信?
我对这种设计的所有优点和缺点以及人们的经验感兴趣?
我是gwt的新手.我不知道如何启动Super Dev模式.我需要一步一步详细说明.
我已经尝试通过添加来编辑gwt.xml文件
<add-linker name="xsiframe"/>
<set-configuration-property name="devModeRedirectEnabled" value="true"/>
<set-property name="compiler.useSourceMaps" value="true" />
Run Code Online (Sandbox Code Playgroud)
但我无法理解这一点.
在我的Google Web Toolkit项目中,我收到以下错误:
com.google.gwt.user.client.rpc.SerializationException:类型'your.class.Type'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象.出于安全考虑,此类型不会被序列化.
导致此错误的可能原因是什么?
我正在通过GWT Request Factory将对象列表传输到客户端.对象只包含几个字符串,列表只包含20个对象.要传输这个小数据列表,需要一秒钟.首先,我认为需要优化查询.但测量显示:
从数据库中检索对象只需要
300ms
转移到客户端总共需要一秒钟
1136ms
所以这似乎是请求工厂开销.我已经使用了自己的ServiceLayerDecorator
并且已经覆盖了isLive()
函数,所以它总是返回true
.我可以采取任何其他措施加快速度并将性能提升到可接受的范围吗?
更新:
我创建了将我的实体对象数据复制到DTO并使用RPC传输它们以比较RPC和Request工厂性能的逻辑.如您所见,RPC逻辑要快得多.现在我想知道这是设计还是我的申请中存在缺陷.
20个转移对象:
Request factory: 1252 ms
RPC: 420 ms
28个转移对象:
Request factory: 1654 ms
RPC: 460 ms
78个转移对象:
Request factory: 3963 ms
RPC: 769 ms
================================================== ==========
UPDATE2
所以我编写了一个非常简单的示例应用程序,以确保我的应用程序没有任何过滤器或其他干扰组件.应用程序从服务器加载10个带有4个String字段的对象.我使用Request工厂和RPC完成了它并停止了时间.
代码可以在这里找到:https: //github.com/jan10101/requstFactoryVSRPC
这里的生活演示:http: //requestfactorytest.appspot.com/
测试应用程序证实了我的观察结果:与RPC性能相比,请求工厂性能非常糟糕.在开发模式下,RPC的性能大约高出40倍,在生产模式下仍然是4倍.我是第一个注意到性能问题的人吗?
以下屏幕截图显示了测试结果,如果您不想自己尝试.
开发模式下的结果:
生产代码的结果(在app引擎上):
GWT中IsSerializable接口的用途是什么(关于RPC机制).我从来没有找到一个很好的解释,为什么它是这样的,以及为什么默认的Java Serializable标记接口不起作用.
我收到以下异常:
com.google.gwt.user.client.rpc.SerializationException:类型'java.lang.Long'未包含在可由此SerializationPolicy序列化的类型集中,或者无法加载其Class对象.出于安全考虑,此类型不会被序列化
使用GWT 2.1和内置的Jetty服务器.根据文档,这种类型绝对是可序列化的...如何将它包含在SerializationPolicy中?
我刚开始学习Google Web Toolkit并完成了Stock Watcher教程应用程序的编写工作.
我想正确的,如果一个人想坚持业务对象(如股票)使用JDO并将其发送从客户端来回/ 通过RPC那么就必须为该对象创建两个单独的类:一是与JDO注解用于在服务器上保留它以及另一个可序列化并在RPC上使用的服务器?
我注意到Stock Watcher有单独的类,我可以理解为什么:
我只是想确保我正确地理解这一点.我不想创建我想要在RPC上使用的所有业务对象类的两个版本,如果我不需要的话.
gwt-rpc ×10
gwt ×8
java ×3
gwt2 ×1
jdo ×1
performance ×1
rest ×1
rpc ×1
serializable ×1
spring ×1
spring-mvc ×1