InvalidClassException:没有有效的构造函数

时间:2013-09-20 01:00:42

标签: google-app-engine java-ee objectify

当我在localhost中运行app时,它可以正常工作,但是当部署到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

在MercadoriaMbean.java中:

public class MercadoriaMBean implements Serializable {

private MercadoriaDAO dao;

public MercadoriaMBean() {
    dao = new MercadoriaDAOOfyImpl();
    fillMercadorias();
}

MercadoriaDAOOfyImpl.java:

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

public MercadoriaDAOOfyImpl() {
    super(Mercadoria.class);
}

AbstractObjectifyDAO.java:

public class AbstractObjectifyDAO<T extends AbstractEntity> {

private Class<T> clazz;

public AbstractObjectifyDAO(Class<T> clazz) {
    this.clazz = clazz;
}

修改

使用反思:

    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

在AbstractObjectifyDAO.class中:

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

我检查过Mercadoria.class有@Entity注释。

1 个答案:

答案 0 :(得分:1)

我从堆栈跟踪中了解到,当MercadoriaDAOOfyImpl被反序列化时会发生错误。反序列化需要类具有no-args构造函数,对于MercadoriaDAOOfyImpl和类具有serialVersionUID是正确的。

来自Java文档here

  

序列化运行时与每个可序列化的类a关联   版本号,称为serialVersionUID,在此期间使用   反序列化以验证序列化的发送方和接收方   object已加载与该对象兼容的类   尊重序列化。如果接收器已加载了一个类   具有与其不同的serialVersionUID的对象   相应的发件人类,然后反序列化将导致   InvalidClassException。可序列化的类可以声明它自己的类   serialVersionUID通过声明一个名为的字段显式地显示   “serialVersionUID”必须是static,final和long类型。

我在serialVersionUID中没有看到MercadoriaDAOOfyImpl,所以如果它丢失了,您可以尝试先添加它,看看它是否解决了问题。

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