Jersey + Grizzly - @ApplicationPath被忽略了

时间:2017-08-19 12:53:34

标签: java jersey-2.0 grizzly

我在Grizzly上运行Jersey 2.26-b09,我正在使用以下代码启动Grizzly HTTP服务器:

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类扩展了Application,并有一个@ApplicationPath(“/ system”)注释。 ProductionService类是一个带有@Path(“/ production”)注释的REST资源。

我可以看到@ApplicationPath中指定的路径被忽略:我的资源可以在/ rest / production访问,而不是在/ rest / system / production。

我尝试将URI更改为/ rest / system而不是/ rest,但无济于事:

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

应用程序部署在根上下文/ rest中,而不是/ rest / system。

我错过了什么?

当然作为一种解决方法,我可以将资源路径从“/ production”更改为“/ system / production”,但我想知道为什么忽略应用程序路径。

1 个答案:

答案 0 :(得分:1)

我已将创建并初始化服务器的代码更改为:

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的提示。