为应用引擎端点对象化 OfyService NoClassDefFoundError

Objectify OfyService NoClassDefFoundError for app engine endpoint

我的 android-appengine-endpoint 项目完全由 android 工作室设置。因此,我不会乱搞任何东西:我只是让 android studio 将我的 AppEngine 模块添加到我的 android 项目中。现在我得到了 java.lang.NoClassDefFoundError。我是否必须在 gradle 中设置某些内容或在 android studio 中配置一些内容才能消除此错误?基本上,当我尝试测试我的应用程序时,我得到了异常。

代码:

注意:UserDao 不是在我的端点 class 内调用 ofy,而是一个进行所有 ofy 数据访问调用的地方。 您可以将我的代码与 this tutorial

进行比较
public class UserDao extends OfyService {
    public static void persist(User user) {
        ofy().save().entities(user).now();
    }
    public static User getById(long id) {
        return ofy().load().type(User.class).id(id).now();
    }
    public static List<User> getByTwitterId(Long twitterId) {
        return ofy().load().type(User.class).filter("twitterId", twitterId).list();
    }
}

public class OfyService {
    public OfyService() {}

    static {
        ObjectifyService.register(User.class);
        ObjectifyService.register(Food.class);
        ObjectifyService.register(Pet.class);
    }

    public static Objectify ofy() { return ObjectifyService.ofy(); }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

从 App Engine 控制台看到的实际错误:

com.google.api.server.spi.SystemService invokeServiceMethod: exception occurred while calling backed method
java.lang.NoClassDefFoundError: Could not initialize class com.mycompany.server.data.dao.UserDao
    at com.mycompany.server.utils.Authenticator.verifyAccount(Authenticator.java:22)
    at com.mycompany.server.endpoint.server.getFood(server.java:105)
    at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:44)
    at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:359)
    at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:160)
    at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:118)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    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.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:48)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    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 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:444)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:230)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    at java.lang.Thread.run(Thread.java:745)

我在这里看到的每个post似乎都在谈论WEB-INF\lib。那么 Android Studio 没有在我的 WEB-INF 中创建任何 lib 目录。所以 Android Studio 和 App Engine 都来自 Google。所以我在那里迷路了。

我的webapp/WEB-INF里面只有三个文件:

这是我的依赖项的图片,以防有帮助:

正如我从我们的讨论中发现的那样,Objectify 因未知原因无法注册 类。

也许,

  1. 您对其中一项数据的注释不正确 类(提供 UserFoodPet 的源代码以供进一步调查);
  2. 或同时从另一个线程调用 OfyService 方法(不太可能)。

由于您使用的是 Cloud Endpoint,请执行以下操作:

  1. 在您的端点 class 中,创建一个构造函数。
  2. 在构造函数中,调用new OfyService()

这可能有效的原因是您将在需要使用它们之前加载所有与对象化相关的 classes 方式(即在客户端进行第一次调用之前的方式)。现在您正在需要它们之前加载它们。 App-Engine class 加载程序中的延迟可能会杀死您。可悲的是,您使用的结构非常流行,所以大多数人都这样使用它:但不能保证它会一直有效。这是一个竞争条件的事情。 App-engine 加载 classes 可能非常慢。幸运(或不幸)的你,你很早就发现了问题。人们应该为你的痛苦点赞 :)。