Google app engine InvalidClassException:没有有效的构造函数

Google app engine InvalidClassException:没有有效的构造函数,google-app-engine,jakarta-ee,objectify,Google App Engine,Jakarta Ee,Objectify,当我在localhost中运行应用程序时,它可以工作,但当部署到GAE时,抛出以下错误: http://myapp.appspot.com/Login javax.servlet.ServletException: java.lang.RuntimeException: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no va

当我在localhost中运行应用程序时,它可以工作,但当部署到GAE时,抛出以下错误:

http://myapp.appspot.com/Login
javax.servlet.ServletException: java.lang.RuntimeException: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:268)
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 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:439)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.RuntimeException: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at com.google.apphosting.runtime.SessionManagerUtil.deserialize(SessionManagerUtil.java:57)
at com.google.apphosting.runtime.jetty.MemcacheSessionStore.getSession(MemcacheSessionStore.java:39)
at com.google.apphosting.runtime.jetty.SessionManager.loadSession(SessionManager.java:327)
at com.google.apphosting.runtime.jetty.SessionManager.getSession(SessionManager.java:301)
at org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession(AbstractSessionManager.java:237)
at org.mortbay.jetty.servlet.SessionHandler.setRequestedId(SessionHandler.java:246)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:136)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
... 16 more
Caused by: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:730)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1799)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2012)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1936)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:396)
at java.util.HashMap.readObject(HashMap.java:1043)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1914)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2012)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1936)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:396)
at com.google.apphosting.runtime.SessionManagerUtil.deserialize(SessionManagerUtil.java:55)
... 25 more
Caused by: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:488)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:327)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:564)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1649)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1562)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
... 46 more
W 2013-09-19 21:44:19.795
Nested in javax.servlet.ServletException:     java.lang.RuntimeException: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor:
java.lang.RuntimeException: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at com.google.apphosting.runtime.SessionManagerUtil.deserialize(SessionManagerUtil.java:57)
at com.google.apphosting.runtime.jetty.MemcacheSessionStore.getSession(MemcacheSessionStore.java:39)
at com.google.apphosting.runtime.jetty.SessionManager.loadSession(SessionManager.java:327)
at com.google.apphosting.runtime.jetty.SessionManager.getSession(SessionManager.java:301)
at org.mortbay.jetty.servlet.AbstractSessionManager.getHttpSession(AbstractSessionManager.java:237)
at org.mortbay.jetty.servlet.SessionHandler.setRequestedId(SessionHandler.java:246)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:136)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
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 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:439)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:730)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1799)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2012)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1936)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:396)
at java.util.HashMap.readObject(HashMap.java:1043)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:991)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1914)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2012)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1936)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1819)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1395)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:396)
at com.google.apphosting.runtime.SessionManagerUtil.deserialize(SessionManagerUtil.java:55)
... 25 more
Caused by: java.io.InvalidClassException: br.com.myapp.dao.MercadoriaDAOOfyImpl; no valid constructor
at java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:488)
at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:327)
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:564)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1649)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1562)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
... 46 more
java.lang.IllegalArgumentException: Class hierarchy for class br.com.myapp.model.Mercadoria has no @Entity annotation
MercadoriaDAOOfyImpl.java:

public class MercadoriaDAOOfyImpl extends AbstractObjectifyDAO<Mercadoria>
    implements Serializable, MercadoriaDAO {

public MercadoriaDAOOfyImpl() {
    super(Mercadoria.class);
}
在AbstractObjectifyDAO.class中:

    public List<T> getAll() {
    return ofy().load().type(clazz).list();
}
public List getAll(){
返回y().load().type(clazz.list();
}

我检查了Mercadoria.class是否有@Entity注释。

我从堆栈跟踪中了解到,当反序列化
MercadoriaDAOOfyImpl
时会发生错误。反序列化需要类不具有参数构造函数,这对于
MercadoriaDAOOfyImpl
是真的,并且类具有serialVersionUID

从Java文档中:

序列化运行时与每个可序列化类关联 版本号,称为serialVersionUID,在 反序列化以验证序列化的发送方和接收方 对象已为该对象加载与兼容的类 关于序列化。如果接收器已为 对象的SerialVersionId与的SerialVersionId不同 对应发件人的类,则反序列化将导致 . 可序列化类可以声明自己的类 通过声明名为 “serialVersionUID”必须是静态的、最终的且类型为long

我在
MercadoriaDAOOfyImpl
中没有看到
serialVersionUID
,因此如果缺少它,您可以尝试先添加它,看看它是否解决了问题


如果存在或无法解决问题,请尝试从
AbstractObjectifyDAO
构造函数中删除参数
Class clazz
,并使用反射获得
clazz
,看看问题是否会得到解决,或者让我们看看在这种情况下会出现什么错误。

您如何尝试实例化MercadoriaDAOOfyImpl?使用串行Id不起作用,但当我设置this.clazz=Mercadoria.class时;工作!但是我尝试使用反射来保留所有模型的通用代码。@vctlzac使用反射的想法是使
AbstractObjectifyDAO
没有参数构造函数。删除字符串参数,并使用反射从类本身的泛型参数中获取类。@vctlzac我还怀疑其他东西。。你确定MercadoriaDAOOfyImpl的所有字段都是可序列化的吗?实际上MercadoriaDAOOfyImpl没有字段。只有Mercadoria.java具有字段,并且所有字段都可序列化。奇怪的是,初始代码在localhost中工作,但在GAE上崩溃。我正在尝试使用反射与T。现在谢谢!Mercadoria是客观化实体,对吗?我理解将其序列化到客户机的需要,但是为什么DAO类也被序列化呢?它不应该只在服务器上吗?
    public AbstractObjectifyDAO(String clazz) {

    ClassLoader myClassLoader = ClassLoader.getSystemClassLoader();

    try {
        this.clazz = (Class<T>) myClassLoader.loadClass(clazz);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
java.lang.IllegalArgumentException: Class hierarchy for class br.com.myapp.model.Mercadoria has no @Entity annotation
    public List<T> getAll() {
    return ofy().load().type(clazz).list();
}