簡體   English   中英

在 GlassFish Server 中找不到 JAX-RS 資源

[英]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"網址的傳入獲取請求均由DukesAgeResourcegetText方法處理。 怎么了?

謝謝

您可能缺少 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM