2013-07-12 8 views
8

Heute hatte ich die Idee, eine sehr einfache Webanwendung zu erstellen, die von einem REST-Backend betrieben werden würde. Da ich einen sehr leichten Server wollte, habe ich angefangen, Jetty zu betrachten. Und da ich eine andere JAX-RS-Implementierung als Jersey ausprobieren wollte, schaute ich auf RestEasy. Ich dachte, diese 2 wären einfach zu implementieren. Ich habe mich geirrt ...Jetty 9.0 eingebettet und RestEasy 3.0 wirft NoSuchMethodError

Ich importierte die grundlegenden Jetty Server und Servlet Abhängigkeiten, da ich dachte, dass das die einzigen Serveranforderungen für einen einfachen (nur REST) ​​Jetty Server waren (ich versuchte die webapp Abhängigkeit zu benutzen; gleiche Fehler).

<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-server</artifactId> 
    <version>9.0.0.RC0</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlet</artifactId> 
    <version>9.0.0.RC0</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlets</artifactId> 
    <version>9.0.0.RC0</version> 
    <scope>compile</scope> 
</dependency> 

Dann importierte ich die grundlegenden RestEasy Abhängigkeiten.

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>3.0.1.Final</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxb-provider</artifactId> 
    <version>3.0.1.Final</version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>async-http-servlet-3.0</artifactId> 
    <version>3.0.1.Final</version> 
    <scope>compile</scope> 
</dependency> 

Main-Methode:

public class ExampleActivator { 
    public static void main(String args[]) throws Exception { 
     Server server = new Server(8080); 
     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); 
     context.setContextPath("/"); 
     ServletHolder h = new ServletHolder(new HttpServlet30Dispatcher()); 
     h.setInitParameter("javax.ws.rs.Application", "packages.ExampleResources"); 
     context.addServlet(h, "/*"); 
     server.setHandler(context); 
     server.start(); 
     server.join(); 
    } 
} 

ExampleResources:

public class ExampleResources extends Application { 

    private static final ImmutableSet services = ImmutableSet.of(
      ExampleResourceImpl.class 
    ); 

    @Override 
    public Set<Class<?>> getClasses() { 
     return services; 
    } 
} 

ExampleResourceImpl:

@Path("activities") 
public class ExampleResourceImpl { 

    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getAll() { 
     return "Hello World"; 
    } 
} 

Als ich zum webapge gehe ich die folgende Spur erhalten:

250 [main] INFO org.eclipse.jetty.server.Server - jetty-9.0.0.RC0 
911 [main] INFO org.jboss.resteasy.spi.ResteasyDeployment - Deploying javax.ws.rs.core.Application: class packages.ExampleResources 
939 [main] INFO org.jboss.resteasy.spi.ResteasyDeployment - Adding class resource packages.ExampleResourceImpl from Application class packages.ExampleResources 
1005 [main] INFO org.eclipse.jetty.server.handler.ContextHandler - started [email protected]{/,null,AVAILABLE} 
1037 [main] INFO org.eclipse.jetty.server.ServerConnector - Started [email protected]{HTTP/1.1}{0.0.0.0:8080} 
6315 [qtp84346444-13] WARN org.eclipse.jetty.servlet.ServletHandler - Error for /activities 
java.lang.NoSuchMethodError: org.jboss.resteasy.specimpl.BuiltResponse.getHeaders()Ljavax/ws/rs/core/MultivaluedMap; 
    at org.jboss.resteasy.core.ServerResponseWriter.setDefaultContentType(ServerResponseWriter.java:195) 
    at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:46) 
    at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:411) 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:376) 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:671) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:448) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1070) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:375) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1004) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 
    at org.eclipse.jetty.server.Server.handle(Server.java:449) 
    at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:246) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:265) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:240) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:589) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:520) 
    at java.lang.Thread.run(Thread.java:722) 

Normalerweise würde dies bedeuten, dass ich eine Abhängigkeit vergessen habe, aber ich habe wirklich keine Ahnung, was los ist.

+0

Anlegesteg 9.0.4.v20130625 sollte anstelle eines RC verwendet werden –

+0

Ich habe die Jetty Abhängigkeiten zu Version 9.0.4.v2013062 geändert. Ich bekomme immer die selbe Ausnahme. – Wouter

+0

nur in das gleiche Problem laufen .. in meinem Fall Startanlegestelle mit 'mvn run-exploded' funktioniert gut, und mit' mvn run' es nicht !? Hinzufügen von Jaxrs-api hat es behoben .. – milan

Antwort

2

Ich hatte das gleiche Problem. Zuerst arbeitete es mit JAX-RS 2 und dann wurde es nach JAX-RS 3 migriert, also dachte ich, dass es etwas damit zu tun hat. bei dem Versuch, JAX-RS 3 von App über Maven und Jboss-Deployment-structure.xml zu bekommen JBoss verwenden, nach dem Fehlschlagen habe ich versucht, JBoss Module aktualisieren, die mit dem folgenden Verfahren durchgeführt werden kann:

3,1. Aktualisieren von Resteasy innerhalb von JBoss AS 7 Resteasy ist im Lieferumfang von JBoss AS 7 enthalten. Sie müssen Resteasy wahrscheinlich in AS7 aktualisieren. Die Resteasy-Distribution wird mit einer Zip-Datei namens resteasy-jboss- modules-3.0.1.Final.zip geliefert. Entpacken Sie diese Datei mit den Modulen/Verzeichnis der JBoss AS7 Distribution. Dies überschreibt einige der vorhandenen Dateien dort.

Quelle: http://docs.jboss.org/resteasy/docs/3.0.1.Final/userguide/pdf/resteasy-reference-guide-en-US.pdf

Hoffe, es hilft!

6

Ich bin gerade über das gleiche Problem gestolpert. Die Lösung bestand darin, die Jaxrs-API explizit als erste Abhängigkeit in die Liste der Abhängigkeiten einzufügen.

<dependencies> 
    <!-- jaxrs-api is the very first dependency --> 
    <dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>jaxrs-api</artifactId> 
    <version>3.0.4.Final</version> 
    </dependency> 
    <!-- here come the other depdendencies --> 
</dependencies> 

Jackson nutzt den jsr311-api, die die gleiche Response-Klasse bietet, die von der BuiltResponse Klasse verwendet wird. Leider enthält diese Response nicht die getHeaders() Methode. Obwohl die Abhängigkeit aufgelöst wird, verwendet sie eine falsche Klasse. Wenn die Jackson-Abhängigkeit irgendwie vor dem Rasteasy steht, wird die obige Ausnahme ausgelöst.

+1

Ich habe gerade die jsr311-api ausgeschlossen und es funktioniert jetzt. – natros

+0

Diese Antwort funktionierte für mich, aber "erste Abhängigkeit" bedeutete wirklich "erste Abhängigkeit" - mein Problem war, dass sowohl Swagger als auch JBoss die widersprüchliche Abhängigkeit luden, und bis ich diese dep vor JBoss auflistete, würden meine Tests nicht bestehen. Am Ende waren "" unnötig und funktionierten nicht alleine. – Lambart

0

Ich stieß auch auf dieses Problem und es dauerte mich für immer herauszufinden, wie es gelöst werden kann. Kevin Day hatte Recht.Das Problem war, dass eine der Abhängigkeiten in meinem POM indirekt in Jackson gezogen wurde und diese Abhängigkeit in der POM-Datei vor der Jaxrs-Abhängigkeit platziert wurde. Eine Lösung bestand darin, einfach die Jaxrs-Abhängigkeit an den Anfang der POM-Datei zu verschieben, damit sie vor Jackson aufgenommen wurde.

0

Hatte das gleiche Problem beim Versuch, eine jax-rs (mit Resteasy) zu Glassfish 3.1.2.2 zu implementieren. Versucht zu lösen, was die Inkonsistenz verursachte, dauerte Stunden und konnte es am Ende nicht finden - das Glasfischverhalten wurde immer seltsamer.

Meine Empfehlung für alle, die versuchen, RESTasy auf Gf zu laufen: stoppen Sie es und benutzen Sie Jersey.