2017-08-19 51 views
0

我在灰熊上運行新澤西州2.26-B09,和我使用下面的代碼來啓動灰熊HTTP服務器:新澤西+灰熊 - @ApplicationPath忽略

public void start() { 
    URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).path("/rest").build(); 
    Map<String, String> params = new HashMap<>(16); 
    String applicationClassName = RestApplication.class.getName(); 
    String applicationPackageName = RestApplication.class.getPackage().getName(); 
    String productionPackageName = ProductionService.class.getPackage().getName(); 
    params.put(ServletProperties.JAXRS_APPLICATION_CLASS, applicationClassName); 
    params.put(ServerProperties.PROVIDER_PACKAGES, productionPackageName + "," + applicationPackageName); 
    HttpServer server = GrizzlyWebContainerFactory.create(uri, params); 
    server.start(); 
} 

的RestApplication類擴展應用,並有一個@ApplicationPath(「/ system」)註釋。 ProductionService類是一個帶有@Path(「/ production」)批註的REST資源。

我可以看到@ApplicationPath中指定的路徑被忽略:我的資源可以在/ rest/production而不是在/ rest/system/production上訪問。

我試圖將URI更改爲/休息/系統而不是/休息,但無濟於事:

URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).path("/rest/system").build(); 

的應用程序部署在根上下文/休息,不要/休息/系統。

我錯過了什麼?

當然,作爲一種解決方法,我可以將資源路徑從「/ production」更改爲「/ system/production」,但我想知道爲什麼應用程序路徑被忽略。

+1

註解在ServletContainerInitializer中提取(主要在戰爭部署中)。我不知道灰熊是否支持這一點。也許你需要嘗試配置應用程序爲戰爭,並部署戰爭。我從來沒有試圖用灰熊的戰爭,所以我不知道如何配置它。但我知道初始化器不會像這樣通過編程配置來調用。 –

+0

謝謝@peeskillet。我已經找到了一個關於如何用web應用程序配置grizzly的例子:https://stackoverflow.com/questions/22593983/using-jersey-with-grizzly?rq=1。我會給它一個機會。 –

+0

不是這樣。這已經是'GrizzlyWebContainerFactory'正在做的事情了。我的意思是將你的項目打包成WAR,然後配置灰熊部署這場戰爭。 ApplicationPath實際上是用於自動發現的WAR部署,而不是用於嵌入式部署。沒有真正的需要。因爲你可以通過編程來配置URL。 –

回答

0

我已經改變了創建和服務器初始化的代碼:

public void start() { 
    URI uri = UriBuilder.fromPath("").scheme("http").host("localhost").port(8084).build(); 
    Map<String, String> params = new HashMap<>(16); 
    String applicationPackageName = RestApplication.class.getPackage().getName(); 
    String productionPackageName = ProductionService.class.getPackage().getName(); 
    params.put(ServerProperties.PROVIDER_PACKAGES, productionPackageName + "," + applicationPackageName); 

    HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri); 
    WebappContext context = new WebappContext("system", "/rest/system"); 
    ServletRegistration registration = context.addServlet("jersey", ServletContainer.class); 
    registration.setInitParameters(params); 
    registration.addMapping("/*"); 
    context.deploy(server); 

    server.start(); 
} 

Web應用程序上下文中創建,並在所需的路徑提供的資源。由於在此編程方法中不調用Servlet容器初始值設定項,因此未設置ServletProperties.JAXRS_APPLICATION_CLASS屬性。

我認爲設置這個屬性做的工作,但它沒有。感謝@peeskillet提示。