2017-04-21 33 views
1

我遵循幾個教程來設置一個非常簡單的Jersey Webservice,這些對我來說都不是很清楚。無法獲得簡單的RS webservice與Eclipse一起工作Mars

有時候本教程正在討論關於更改web.xml的問題,其他人說只需要在您的服務類中有某些註釋。

所以我結束了以下結論:

使用新澤西2.x的你就不必做具體的事情在你的web.xml,纔有球衣容器,把servlet.jar你的classpath和創建服務類,如下所示:

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Application; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@ApplicationPath("rest") 
public class RestService extends Application { 

    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 

} 

這應該允許我使用訪問API http://localhost:8080/EETest/rest/sayhello

我仔細檢查了該項目已經部署,沒有錯誤, Tomcat7服務器正在運行。所有的運動衫罐和依賴項都在我的lib文件夾中,並且已經添加到項目庫中。修改後的index.html在撥打http://localhost:8080/EETest

時顯示正常但Web服務沒有響應(而是顯示404頁面)。

我知道它一定是非常基本的東西我在這裏做錯了...我用盡了選擇。

編輯:這是我的web.xml對於什麼是值得

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>EETest</display-name> 
    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
</web-app> 

回答

2

不知道你在哪裏學會了做這個

@ApplicationPath("rest") 
public class RestService extends Application { 

    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 
} 

但它是錯的。在JAX-RS中,我們有資源類。資源類別應註明@Path,而不是@ApplicationPath。後者用於應用程序配置類。所以,你應該有類似

@ApplicationPath("/rest") 
public class AppConfig extends Application {} 

@Path("/") 
public class RestService { 
    @GET 
    @Path("/sayhello") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response sayHello() { 
     return Response.ok("Hello World").build(); 
    } 
} 

什麼用@ApplicationPath確實空類是觸發類路徑掃描。因此,類路徑將被掃描以註解@Path@Provider的類,並且這些類將被註冊。

在此示例中,我使用了@Path("/"),以便您仍然可以使用相同的URL /rest/sayHello。但通常情況下,資源類將具有映射到集合URL的路徑,如/rest/animals,因此您將在該類上使用@Path("animals"),並且可以使用該類中的方法添加子資源,該方法也用@Path進行了註釋。任何未註明@Path但具有類似@GET的方法的方法都將映射到根資源路徑/rest/animals

一些其他的東西。請記住,我提到了使用@ApplicationPath註釋的空類Application類觸發的類路徑掃描。那麼這是一種沮喪。你可以註冊類中明確,而不是

@ApplicationPath("/rest") 
public class AppConfig extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
     final Set<Class<?>> classes = new HashSet<>(); 
     classes.add(RestService.class); 
     return classes; 
    } 
} 

但是,當我們用球衣中,優選的使用澤西特定類(除非你有一個要求,以保持它的JAX-RS實現之間移植)。有了澤西島,你可以使用它的ResourceConfig類(它是Application的子類)。你可以使用packages方法

@ApplicationPath("/rest") 
public class AppConfig extends ResourceConfig { 
    public AppConfig() { 
     packages("the.packages.to.scan"); 

     register(RestService.class); 
    } 
} 
+0

它的工作大有與register方法註冊個人類,你可以觸發包掃描(這是不一樣的類路徑掃描)。我對這些改變感到非常驚訝,因爲我使用Jersey創建了一個Rest Webservice,但它是1.x我猜是因爲我必須在web.xml中設置配置,並且沒有「Application」或「ApplicationPath 「涉及 – devnull69

相關問題