我正在使用 Google App Engine 创建一个由多个Google Modules组成的项目。如何设置我的项目(使用 Maven),以便我可以跨模块共享源代码,例如 Objectify 对象模型定义、共享实用程序代码和单元测试代码?
我希望答案很简单,并且我可以按照以下答案中的建议使用 Maven:
但是,我担心 Google App Engine 模块可能有一些特殊之处,使它们与 Maven 模块不同。然后也许上面的方法行不通。
作为我担心的一个例子,请注意Google 说“虽然 Java EE 支持 WAR 文件,但模块配置仅使用解压的 WAR 目录。” 然而,上面给出的一些解决方案建议将共享代码打包到 JAR 文件中。我意识到 WAR 和 JAR 是不同的,但我担心我会浪费时间尝试做一些不能工作的事情。
关于如何在 Google App Engine 模块之间共享代码的任何建议?
我有以下 Objectify 关系:
@Entity(“Author”)
public class Author{
@Id
private long authorId;
…
}
@Entity(“Book”)
public class Book{
@Id
private long id;
private Key<Author> authorKey;
…
}
Run Code Online (Sandbox Code Playgroud)
现在是有趣的部分:我有authorId(id,不是实体),我需要为该作者查询 Book。我的查询在下面,但它返回一个空列表,而我知道该作者在数据存储区中有书籍。那么我该如何解决这个查询呢?
public static List<Book> getBooksForAuthor(Long authorId) {
Key<Author> authorKey = Key.create(Author.class, authorId);
return OfyService.ofy().load().type(Book.class).filter("authorKey", authorKey).order(“-date").list();
}
Run Code Online (Sandbox Code Playgroud) google-app-engine filter objectify google-cloud-endpoints google-cloud-datastore
我有如下类 City 的模型:
@Entity
public class City {
@Id
Long id;
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
我有另一个模型类 Person 下面给出:
@Entity
public class Person {
@Id
Long id;
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
Key<City> city;
}
Run Code Online (Sandbox Code Playgroud)
之后,我使用 android studio 为这两个类生成端点并部署它。
这是生成的端点的代码:
个人端点
@Api(
name = "personApi",
version = "v1",
resource = "person", …Run Code Online (Sandbox Code Playgroud) google-app-engine android objectify google-cloud-endpoints google-cloud-datastore
我想做一个像这样的查询"从Person where Address ="中选择名称"OR age =""".这在GAE模型中是否可行.所有东西都包括AND封闭而不是OR.我怎么能用JDO/JPA,Objectify做到这一点.提前致谢
所以我刚刚使用Google Eclipse插件在Eclipse Indigo中创建了一个新的GAE项目,我只有以下servlet:
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
Objectify obj = ObjectifyService.begin();
System.out.println(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我在浏览器上运行servlet时,我得到:
java.lang.NoClassDefFoundError: com/googlecode/objectify/ObjectifyService
at com.fer.TestServlet.doGet(TestServlet.java:17)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:369)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at …Run Code Online (Sandbox Code Playgroud) 如何在客体化中使用"IN"查询?我有一个'纸'实体和一个不同的实体'附表'.在'附表'中我有纸的关键.现在我使用一些标准获得了"纸"的几个键.现在我想用'scheduledDate'来过滤那些.我要查询"日程"像这样的东西:get 'schedule' from 'Schedule' where 'paper key' in (List of paper keys) and 'scheduledDate' = 'some date'.如何在物化中做到这一点?谢谢
我正在尝试做一个简单的JUnit测试来执行这样的查询:
Resource result = ofy().load().type(Resource.class).filter("raw =",
"/Bob/-/userId/-/").first().get();
if (result != null){
System.out.println("Resulting Resource raw =" + result.getRaw());
}
Run Code Online (Sandbox Code Playgroud)
上面的查询结果null,但是当我使用id(Long类型)进行查询时,我得到了结果.当我坚持我正在尝试查询的实体时,我记录了@Id并且值是1,所以我做了一个查询id用于检查:
Resource result =
ofy().load().type(Resource.class).filter("id =", 1).first().get();
if (result != null){
System.out.println("Resulting Resource raw =" + result.getRaw());
}
Run Code Online (Sandbox Code Playgroud)
结果result.getRaw()是/Bob/-/userId/-/真的很奇怪,从我的第一次查询结果应该没有null?
我的servlet应该执行以下操作:当用户在场地注册时,我会检查他当前是否在某处注册(即使它是同一地点),如果是,请取消注册并再次注册.
我有以下代码,为了显示我的问题,我已经简化了:
Date tempDate = new Date();
Visit v = ofy().load().type(Visit.class)
.filter(Visit.USER_ID, 5L)
.filter(Visit.EXIT_DATE, null).first().get();
if(v != null)
exitVenue(5L, 7L, tempDate);
Visit visit = new Visit(5L, 7L, tempDate);
ofy().save().entity(visit).now();
Date tempDate2 = new Date();
Visit v2 = ofy().load().type(Visit.class)
.filter(Visit.USER_ID, 5L)
.filter(Visit.EXIT_DATE, null).first().get();
if(v2 != null)
exitVenue(5L, 7L, tempDate2);
Visit visit2 = new Visit(5L, 7L, tempDate2);
ofy().save().entity(visit2).now();
}
public void exitVenue(Long userID, Long venueID, Date exitDate) {
Visit visit = ofy().load().type(Visit.class)
.filter(Visit.USER_ID, userID)
.filter(Visit.VENUE_ID, venueID)
.filter(Visit.EXIT_DATE, null).first().get();
if(visit == null){
log.info("ERROR …Run Code Online (Sandbox Code Playgroud) google-app-engine persistence objectify google-cloud-datastore
我正在尝试使用谷歌应用引擎数据库,我需要在2个日期范围内获得员工的总薪水.我需要提供小时的范围,即startDate和endDate,以便我如何在数据存储上执行此操作.我在app引擎数据存储区中使用objectify.
我使用Android Studio创建了Android项目及其后端AppEngine端点对应项.我有一个数据存储区,我正在使用Objectify.系统工作得很好,直到我在查询中添加了一个过滤器(仅显示特定的给定电子邮件).
Query<Report> query = ofy().load().type(Report.class).filter("email", user.getEmail()).order("email").order("-when").limit(limit);
Run Code Online (Sandbox Code Playgroud)
这是POJO数据存储区实体:
@Entity
public class Report {
@Id
Long id;
String who;
@Index
Date when;
String what;
@Index
String email;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试测试时,我从Google API Explorer收到此类错误:
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
The suggested index for this query is:
<datastore-index kind=\"AccessReport\" ancestor=\"false\" source=\"manual\">
<property name=\"email\" direction=\"asc\"/>
<property name=\"when\" direction=\"desc\"/>
</datastore-index>
Run Code Online (Sandbox Code Playgroud)
据我所知,我只需要创建一个复合索引,包括特定字段的电子邮件和时间,以及它们的特定排序方向.
但是,我找到的大多数文档都告诉我编辑datastore-indexes.xml.
App Engine预定义实体的每个属性的简单索引.App Engine应用程序可以在名为datastore-indexes.xml的索引配置文件中定义更多自定义索引,该文件在应用程序的/ war/WEB-INF/appengine生成的目录中生成.
不幸的是,这个文件似乎并不存在于我的项目中.
是否有人熟悉使用Android Studio时改变这种情况的方法?
google-app-engine objectify google-cloud-endpoints google-cloud-datastore android-studio