[英]JAX-RS Resource not found in GlassFish Server
我一直在嘗試使用 NetBeans Ide 創建一個簡單的 Restful WebService。
我的 Java EE 版本是:Java EE 7 Web。
我創建了一個新的 Java Web 應用程序,設置了這個 ContexPath: /DukesAgeService
。
現在,運行我的應用程序,瀏覽器顯示我的Index.html
頁面:
http://localhost:8080/DukesAgeService/
所以,一切正常。
然后,我嘗試使用 RESTful Web 服務向導創建一個簡單的 Restful 資源。
所以,我創建了這個類:
package firstcup.webservice;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PUT;
/**
* REST Web Service
*
* @author nolanof
*/
@Path("dukesAge")
public class DukesAgeResource {
@Context
private UriInfo context;
/**
* Creates a new instance of DukesAgeResource
*/
public DukesAgeResource() {
}
/**
* Retrieves representation of an instance of firstcup.webservice.DukesAgeResource
* @return an instance of java.lang.String
*/
@GET
@Produces("text/plain")
public String getText() {
return "hello world";
}
}
但是運行我的應用程序,在 url: http://localhost:8080/DukesAgeService/dukesAge
我得到一個 404-not found 頁面。
我預計任何具有"/dukesAge"
網址的傳入獲取請求均由DukesAgeResource
類getText
方法處理。 怎么了?
謝謝
您可能缺少 JAX-RS 應用程序 servlet。 您可以在web.xml
定義它,或者如果您想要無 xml,您可以使用Application
子類。 IMO 最簡單的方法是使用帶有@ApplicationPath
注釋的Application
子類。 將創建一個 servlet,並將 servlet 路徑設置為注釋中的值。 就像是
@ApplicationPath("/rest")
public class RestApplication extends Application {
// All request scoped resources and providers
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(DukesAgeResource.class);
return classes;
}
// all singleton resources and providers
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<>();
return singletons;
}
}
然后應該通過訪問資源
http://localhost:8080/DukesAgeService/rest/dukesAge
。
還有其他方式,但這是便攜式方式。 Glassfish 使用 Jersey,但在 Netbeans 中從頭開始創建 Java EE Web 應用程序只會導入編譯時 Java EE 標准類(無 Jersey 依賴項)。 因此,以上確實是您開始的最佳選擇。
您可以在Jersey 文檔中查看其他部署選項。 對於某些選項,您可能需要添加一些 Jersey 編譯時依賴項。 這就是我剛才提到的原因。 不需要其他罐子。
導致 404 的另一件事是,如果您將 JAX-RS servlet 路徑指定為/*
。 這將與提供靜態資源(如 html 頁面)的默認 servlet 沖突。 這就是我將其設置為/rest
。
更新
JAX-RS 規范中還聲明,如果getClasses()
和getSingletons()
返回空集, getSingletons()
隱式類路徑掃描。 (provider) 用@Provider
注釋的類將默認添加為單例,用@Path
注釋的資源類將是每個請求對象(意味着每個請求都會創建一個新對象)。 所以你也可以只擁有
@ApplicationPath("/rest")
public class RestApplication extends Application {
// Left empty
}
它應該是一樣的。
您可能已經在 web.xml 中初始化了一些路徑,這可能就是您在調用服務時收到 404 錯誤的原因。 請檢查您的 web.xml,如果它被設置為任何內容而不是 * 然后請將其附加到您的服務調用中以使其正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.