GWT和Google云端点
几天前,我开始使用Google App Engine和Google Cloud Endpoints开发移动应用程序的后端。 本教程展示了如何自动生成端点,以及Android的客户端库。
所以我们有我们的实体:
@Entity public class Person implements IsSerializable{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Key key; private String name; //... }
而这个类的端点:
@Api(name = "personendpoint") public class PersonEndpoint { @ApiMethod(name = "getPerson") public Person getPerson(@Named("id") Long id) { ...
此外,使用生成的Android端点库(使用REST API),我想在服务器上添加一个用户界面,使用Google Web Toolkit(GWT)构build。 但是,我应该如何操纵服务器端的date? 我可以看到不同的方法
选项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 extends RemoteServiceServlet implements PersonService{ public Person insertPerson(Person person) { EntityManager mgr = getEntityManager(); try { if (containsPerson(person)) { throw new EntityExistsException("Object already exists"); } mgr.persist(person); } finally { mgr.close(); } return person; } //... }
但现在我的PersonServiceImpl
和PersonEndpoint
大致相同。 所以我们没有按照DRY :)除此之外,这个人是不允许有com.google.appengine.api.datastore.Key
所以我们将不得不改变我们的实体。
选项A2:服务调用端点类
@Override public Person insertPerson(Person person) { return new PersonEndpoint().insertPerson(person); }
应该工作,但仍然没有com.google.appengine.api.datastore.Key
types的实体,并且terminal正在使用CollectionResponse<Person>
我们将不得不把这个变成一个Collection<Person>
的情况下listPerson()
。
选项B1:使用Java Endpoint Client Library
我们可以从我们的App Engine API后端拆分GWT客户端,并使用生成的Java端点客户端库。 所以我们从RemoteServiceServlet
调用REST / Endpoint-API。 但是,即使GWT客户端和端点在同一个服务器上,甚至在同一个项目中,这两个请求都不会结束吗?
GWT客户端 – (RPC) – > GWT服务器 – (HTTP请求) – > App Engine后端服务器
选项B2:使用JavaScript端点客户端库
可能是最好的方法,但最终会在大规模的JSNI。
那么最佳做法是什么? 我无法在一个项目中使用Google Cloud Endpoints和GWTfind任何示例项目:)
好的旧的DTO困境。 没有对错,只要你有什么好处。
重复自己可以是一件好事。 现在,您正在通过端点公开您的数据模型,这意味着您的实体的任何更改都将影响您的移动应用程序用户。 假设你在服务器端重新命名属性 – >没有更新应用程序的每个客户端都会closures。
安全性也是一个问题:如果您的用户实体具有“电子邮件”属性,通过GWT RPC序列化它将使用户的电子邮件几乎可用于任何JavaScriptdebugging器。
这真的是你想要的吗?
不要误解我的意思,我不是那些“洋葱层”的怪物应用程序的粉丝,其中80%的代码似乎被用来将对象转换成具有几乎相同属性的其他对象。
我认为正确的解决scheme介于两者之间:具有“客户端”模型(DTO),由通过GWT RPC和客户端端点公开的可序列化POJO(无数据存储区,ORM,JAXB,无论注释)组成。 您的GWT servlet实现和Endpoint服务器将调用相同的服务,将您的客户端模型转换为实体并处理/保留它们。
通过这种方式,您可以重复使用您的代码,仍然保持简单,在您的API中拥有统一的接口,并且可以在不改变客户端接口的情况下发展内部pipe道。
也许我不明白的东西。 但一切似乎(对我来说)是非常容易的。
-
GWT(客户端!)不在服务器上。 它是在客户端的浏览器中执行的编译的Javascript。
-
Google插件生成使用合适的JSON调用Endpoint的Javascript客户端代码。
-
上面的代码可以从GWT调用。
瞧?