Google App Engine上的HashMap的Cglib Enhancer会引发Class Not Found Exception

时间:2012-02-01 20:46:19

标签: java google-app-engine cglib

我正在使用cglib来增强HashMap,因此我可以拦截HashMap上的方法调用。

它在我的本地计算机上工作正常,当我在eclipse中作为google web应用程序运行时。但是,一旦部署在服务器上,我就会收到异常“java.lang.NoClassDefFoundError:[Ljava / util / HashMap $ Entry;”

抛出异常的代码行是:

Enhancer.create(HashMap.class, new SomeInterceptor());

我正在使用最新的eclipse插件(3.7)。我使用的是cglib 2.2版(cglib-nodep-2.2.jar)

编辑: 这很有趣:如果我创建一个从HashMap扩展的类,那么我可以毫无问题地增强该类。例如,以下代码有效:

public class MyHashMap extends HashMap {
}
Enhancer.create(MyHashMap.class, new SomeInterceptor());

Enhancer适用于TreeMap,HashSet和TreeSet :EndEdit中

堆栈跟踪是:

java.lang.NoClassDefFoundError: [Ljava/util/HashMap$Entry;
at com.google.appengine.runtime.Request.process-02796318ce7d3a7b(Request.java)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2444)
at java.lang.Class.getDeclaredMethod(Class.java:229)
at net.sf.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:630)
at net.sf.cglib.proxy.Enhancer.setCallbacksHelper(Enhancer.java:618)
at net.sf.cglib.proxy.Enhancer.setThreadCallbacks(Enhancer.java:612)
at net.sf.cglib.proxy.Enhancer.createUsingReflection(Enhancer.java:634)
at net.sf.cglib.proxy.Enhancer.firstInstance(Enhancer.java:538)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:225)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:663)
at com.enhancetest.EnhanceTestServlet.doGet(EnhanceTestServlet.java:30)
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 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:449)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:695)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453)
at java.lang.Thread.run(Thread.java:679)

引起:java.lang.ClassNotFoundException:java.util.HashMap $ Entry     ......还有35个

1 个答案:

答案 0 :(得分:0)

也许我错过了什么,如果我很抱歉,但是通过快速搜索,我发现了这个:http://grepcode.com/snapshot/repo1.maven.org/maven2/cglib/cglib/2.2

似乎GAE只有Partial support到cglib ......这可能是这个问题的根源吗? 此外,在受支持的Java库http://code.google.com/p/googleappengine/wiki/WillItPlayInJava

的官方GAE文档中

甚至没有提到CGLIB。

编辑: 顺便说一下,我假设你要导入java.util.HashMap ...检查你没有导入其他实现(比如“com.google.gwt.dev.util.collect.HashMap”)...有时这种错误无所作为!