0

HashMap のメソッド呼び出しをインターセプトできるように、cglib を使用して 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());

また、エンハンサーは 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 詳細

4

1 に答える 1

0

申し訳ありませんが、簡単な検索でこれを見つけました:http://grepcode.com/snapshot/repo1.maven.org/maven2/cglib/cglib/2.2

GAE にはPartial supportto cglib しかないようです...これがこの問題の原因でしょうか? さらに、サポートされている Java ライブラリの公式 GAE ドキュメントhttp://code.google.com/p/googleappengine/wiki/WillItPlayInJava

CGLIBについても言及されていません。

EDIT:ところで、私はあなたがjava.util.HashMapをインポートしていると仮定しています...他の実装(「com.google.gwt.dev.util.collect.HashMap」など)をインポートしていないことを確認してください...時々これなんのミスも起きない!

于 2012-02-01T21:25:54.680 に答える