2013-07-12 61 views
8

今天我有了構建一個非常簡單的Web應用程序的想法,它將由一個REST後端供電。因爲我想要一個非常輕量級的服務器,所以我開始考慮Jetty。因爲我想嘗試另一個JAX-RS實現,所以我看了一下RestEasy。我認爲這兩項將很容易實施。我錯了...Jetty 9.0嵌入式和RestEasy 3.0持續拋出NoSuchMethodError

我導入了基本的Jetty服務器和servlet依賴項,因爲我認爲這是基本(僅REST)Jetty服務器的唯一服務器需求(我嘗試使用webapp依賴項;這給了相同的錯誤)。

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

然後我進口的基本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> 

主要方法:

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

當我去webapge我得到以下跟蹤:

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) 

通常這意味着我忘記了依賴關係,但是我真的不知道發生了什麼。

+0

碼頭9.0.4.v20130625應該代替一個RC –

+0

我已經改變了碼頭依賴於9.0.4.v2013062版本一起使用。我一直得到同樣的例外。 – Wouter

+0

剛剛遇到同樣的問題..在我的情況下開始與'mvn運行爆炸碼頭工作正常,並與'mvn運行'它沒有!?添加jaxrs-api確實修復了它.. – milan

回答

2

我有同樣的問題。首先它使用JAX-RS 2,然後將它遷移到JAX-RS 3,所以我認爲它與此有關。在試圖獲得通過JBoss的Maven和JBoss的部署,structure.xml使用JAX-RS 3從應用程序失敗後,我試圖升級的JBoss模塊,它可以通過以下步驟來完成:

3.1。在JBoss AS 7中升級Resteasy Resteasy與JBoss AS 7捆綁在一起。您可能需要升級AS7中的Resteasy。 Resteasy發行版附帶一個名爲resteasy-jboss-modules-3.0.1.Final.zip的zip文件。 使用JBoss AS7發行版的modules /目錄解壓縮此文件。這將覆蓋 那裏的一些現有文件。

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

希望它能幫助!

6

我只是偶然發現了同樣的問題。解決方案是顯式添加jaxrs-api作爲依賴項列表中的第一個依賴項。

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

傑克遜使用JSR311的API,它提供用於由BuiltResponse類相同Response類。不幸的是,這個Response不包含getHeaders()方法。所以即使解決了依賴關係,它也會使用錯誤的類。如果傑克遜的依賴關係在Resteasy之前得到了解決,那麼上面的異常就會被提出。

+1

我只是排除了jsr311-api,它現在正在工作。 – natros

+0

這個答案適用於我,但「第一個依賴」真的意味着「第一個依賴」 - 我的問題是Swagger和JBoss都加載了衝突的依賴項,直到我在JBoss之前列出這個dep,我的測試才通過。最後,''是不必要的,並且不能自行工作。 – Lambart

0

我也遇到了這個問題,它花了我一直想弄清楚如何解決它。凱文日是對的。問題在於,我的POM中的一個依賴關係間接拉入了Jackson,並且依賴關係在jaxrs依賴關係之前被放置在POM文件中。一個解決方法就是簡單地將jaxrs依賴關係移動到POM文件的頂部,以便在Jackson之前將其取出。

0

當試圖將一個jax-rs(with resteasy)部署到glassfish 3.1.2.2時遇到了同樣的問題。試圖解決造成不一致的原因,花了幾個小時,最終找不到它 - 玻璃魚的行爲變得越來越陌生。

我對每個試圖在gf上運行resteasy的人的建議是:停止並使用球衣。

相關問題