1

Google App Engine と GWT で Restlet を使用すると、NoClassDefFoundError が発生します。

オブジェクトの Json 表現を取得しようとしています。私が得るエラーは次のとおりです。

java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonGenerator$Feature

エラーが発生するメソッドの基本的なスケルトンは次のとおりです。

@Get("json")
public Representation getProduct() {

    Product product = new Product("whatever");

    return new JacksonRepresentation<Product>(MediaType.APPLICATION_JSON, product);
}

最初にJsonFactory、Restlet が提供する JAR のみを使用すると、クラスでエラーが発生しました。次に、「jackson-all-1.9.7.jar」をダウンロードしました。そのエラーはその後、この新しいエラーに置き換えられました。

何が起こっているのかわかりますか?? いくつかのライブラリが不足している可能性がありますが、どのライブラリを見つけることができます。

編集:スタック トレースを含みます。すべてのライブラリを削除し、Restlet org.restlet.ext.jacksonJAR を使い果たしました。また、以下の回答に示されているように、コンパイル時にクラスが使用可能かどうかを確認するために、Eclipse でクラスとパッケージのオートコンプリートを確認しようとしましたが、何も表示されません。これは、コンパイル時にも利用できないことを意味すると思います。

java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory
at org.restlet.ext.jackson.JacksonRepresentation.createObjectMapper(JacksonRepresentation.java:118)
at org.restlet.ext.jackson.JacksonRepresentation.getObjectMapper(JacksonRepresentation.java:164)
at org.restlet.ext.jackson.JacksonRepresentation.write(JacksonRepresentation.java:205)
at org.restlet.representation.WriterRepresentation.write(WriterRepresentation.java:104)
at org.restlet.engine.http.ServerCall.writeResponseBody(ServerCall.java:550)
at org.restlet.engine.http.ServerCall.sendResponse(ServerCall.java:488)
at org.restlet.ext.servlet.internal.ServletCall.sendResponse(ServletCall.java:492)
at org.restlet.engine.http.adapter.ServerAdapter.commit(ServerAdapter.java:197)
at org.restlet.engine.http.HttpServerHelper.handle(HttpServerHelper.java:151)
at org.restlet.ext.servlet.ServerServlet.service(ServerServlet.java:1028)
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.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
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 com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:78)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:369)
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.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.ClassNotFoundException: org.codehaus.jackson.JsonFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 40 more
4

3 に答える 3

2

また、ダウンロードした Restlet バージョンの lib ディレクトリを見ると、さまざまな Restlet 拡張機能を使用するときに含める必要がある jar のいくつかを示す readme.txt が表示されます。たとえば、readme.txt には次のような内容が含まれている必要があります。

org.restlet.ext.jackson (Restlet 拡張機能 - Jackson)

  • org.codehaus.jackson.core_1.9
  • org.codehaus.jackson.mapper_1.9

したがって、Restlet (org.restlet.ext.jackson.jar) で Jackson を使用している場合は、その下にリストされている他の 2 つの jar も含める必要があります。

于 2012-06-04T16:18:46.937 に答える
0

これは、次の問題に似ています: Objectify NoClassDefFoundError

jar ファイルを WEB-INF/lib/ の下に配置し、そのライブラリをビルド パスに含める必要があります。手がかりとして、 NoClassDefFound は、ライブラリがコンパイル時に利用可能であるが、ランタイムでは利用できないことを意味します

于 2012-06-03T05:46:34.190 に答える
0

を Restlet 2.0.14 に更新し、Web サイトのライブラリではなく、付属の org.codehaus.jackson ライブラリを使用しました。

2つのアクションのどちらが実際にこれを行ったのかわかりませんが、これで問題は解決したようです。

于 2012-06-03T13:53:55.783 に答える