使用Restlet AppEngine和Jackson的NoClassDefFoundError

时间:2012-06-02 23:34:27

标签: google-app-engine restlet

我使用Restlet与Google App Engine和GWT获得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);
}

最初,当仅使用Restlet提供的JAR时,JsonFactory类出现错误。然后我下载了`jackson-all-1.9.7.jar。从那以后,这个错误被这个新错误取代了。

知道发生了什么事吗?也许我错过了一些图书馆,但我可以弄清楚哪些图书馆。

编辑:包括堆栈跟踪。我删除了所有的libs,然后跑掉了Restlet org.restlet.ext.jackson JAR。另外,为了检查类是否在编译时可用,如下面的答案暗示的那样,我尝试检查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

3 个答案:

答案 0 :(得分:2)

此外,如果您查看下载的Restlet版本的lib目录,您将看到一个readme.txt,它将告诉您在使用各种Restlet Extensions时需要包含的一些jar。例如,readme.txt应该具有以下内容:

org.restlet.ext.jackson(Restlet Extension - Jackson)

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

因此,如果您使用Jackson with Restlet(org.restlet.ext.jackson.jar),您还需要包含下面列出的其他两个jar。

答案 1 :(得分:0)

这与此问题类似:Objectify NoClassDefFoundError

您需要将jar文件放在WEB-INF / lib /下,并确保在构建路径中包含该库。对于线索,NoClassDefFound意味着库在编译时可用,但在运行时不可用

答案 2 :(得分:0)

我更新了Restlet 2.0.14并使用了它提供的org.codehaus.jackson库而不是网站上的库。

这似乎解决了这个问题,虽然我不知道这两个动作中的哪一个实际上是这样做的。