2013-07-12 11 views
8

Dzisiaj miałem pomysł zbudowania bardzo prostej aplikacji internetowej, która byłaby zasilana przez backend REST. Ponieważ chciałem bardzo lekkiego serwera zacząłem patrzeć na Jetty. A ponieważ chciałem wypróbować inną implementację JAX-RS niż Jersey, spojrzałem na RestEasy. Myślałem, że te 2 będą łatwe do wdrożenia. Myliłem się ...Wbudowany Jetty 9.0 i RestEasy 3.0 wciąż rzucają NoSuchMethodError

Zaimportowałem podstawowe zależności serwera Jetty i servletu, ponieważ uważałem, że są to jedyne wymagania serwera dla podstawowego (tylko REST) ​​serwera Jetty (próbowałem użyć zależności webapp; te same błędy).

<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> 

Następnie zaimportowałem podstawowe zależności RestEasy.

<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> 

główna metoda:

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"; 
    } 
} 

Kiedy idę do webapge Otrzymuję następujący ślad:

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) 

Normalnie oznaczałoby to, że zapomniałem o zależności, jednak nie mam pojęcia, co się dzieje.

+0

Molo 9.0.4.v20130625 powinno być używane zamiast RC –

+0

Zmieniono zależności Jetty na wersję 9.0.4.v2013062. Wciąż otrzymuję ten sam wyjątek. – Wouter

+0

po prostu wpadł na ten sam problem .. w moim przypadku uruchomienie pomostu z 'mvn run-exploded' działa dobrze, a przy' mvn run' to nie robi !? dodanie jaxrs-api naprawiło to .. – milan

Odpowiedz

2

Miałem ten sam problem. Przede wszystkim pracował z JAX-RS 2, a następnie został przeniesiony do JAX-RS 3, więc pomyślałem, że ma to coś wspólnego z tym. Po nieudanej próbie, starając się uzyskać JBoss użyciu JAX-RS 3 z aplikacji poprzez Maven i jboss rozmieszczeniem-structure.xml, próbowałem aktualizacji modułów JBoss, które można zrobić za pomocą następującej procedury:

3.1. Aktualizacja Resteasy w JBoss AS 7 Resteasy jest dołączany do JBoss AS 7. Prawdopodobnie będziesz musiał ulepszyć Resteasy w AS7. Do dystrybucji Resteasy dołączany jest plik zip o nazwie resteasy-jboss-modules-3.0.1.Final.zip. Rozpakuj ten plik, gdy znajduje się w katalogu modules/katalogu dystrybucji JBoss AS7. To spowoduje nadpisanie niektórych z istniejących tam plików.

Źródło: http://docs.jboss.org/resteasy/docs/3.0.1.Final/userguide/pdf/resteasy-reference-guide-en-US.pdf

Nadzieję, że to pomaga!

6

Po prostu natknąłem się na ten sam problem. Rozwiązaniem było jawne dodanie jaxrs-api jako pierwszej zależności na liście zależności.

<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 używa jsr311-API, która zapewnia ten sam Response klasę, która jest używana przez klasę BuiltResponse. Niestety ten Response nie zawiera metody getHeaders(). Więc nawet jeśli zależność została rozwiązana, używa niewłaściwej klasy. Jeśli w jakiś sposób uzależnienie od Jacksona trafi przed Resteasy, wówczas powyższy wyjątek zostanie podniesiony.

+1

Właśnie wykluczyłem jsr311-api i teraz działa. – natros

+0

Ta odpowiedź zadziałała, ale "pierwsza zależność" naprawdę oznaczała "pierwszą zależność" - moim problemem było to, że zarówno Swagger, jak i JBoss ładowali sprzeczną zależność, i dopóki nie wymieniłem tego dep przed JBoss, moje testy nie przeszłyby. W końcu '' były niepotrzebne i nie działały same. – Lambart

0

Wpadłem również na ten problem i zajęło mi to na zawsze zrozumienie, jak rozwiązać ten problem. Kevin Day miał rację.Problem polegał na tym, że jedna z zależności w moim POM pośrednio przyciągnęła Jacksona i ta zależność została umieszczona w pliku POM przed zależnością jaxrs. Rozwiązaniem było po prostu przeniesienie zależności jaxrs na górę pliku POM, aby został on pobrany przed Jacksonem.

0

Miał ten sam problem podczas próby rozmieszczenia jax-rs (z resteasy) na glassfish 3.1.2.2. Próbowałem rozwiązać problem, który spowodował niespójność, trwało wiele godzin i nie udało się go znaleźć na końcu - zachowanie się rybaków stało się coraz bardziej dziwne.

Moja rekomendacja dla wszystkich, którzy próbują uciec od gf: przestań i użyj koszulki.

Powiązane problemy