我在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”,但我想知道为什么忽略应用程序路径。
答案 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的提示。