如何使用Grizzly在同一个基本URL上提供静态内容和资源
作者:互联网
我正在使用Grizzly来提供我的REST服务,它可以有多个“模块”.我希望能够为服务和静态内容使用相同的基本URL,以便我可以访问所有这些URL:
> http://host:port/index.html
> http://host:port/module1/index.html
> http://host:port/module1/resource
> http://host:port/module2/index.html
> http://host:port/module2/resource
我试图设置的代码如下所示:
private HttpServer createServer(String host, int port, ResourceConfig config)
{
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://" + host + ":" + port + "/"), config, false);
HttpHandler httpHandler = new CLStaticHttpHandler(HttpServer.class.getClassLoader(), "docs/");
server.getServerConfiguration().addHttpHandler(httpHandler, "/");
return server;
}
使用此代码,我只能看到html页面,当我尝试获取资源时,我得到“路径不存在的资源不存在”响应.
当我注释掉添加HttpHandler的代码时,我能够访问我的资源(但当然没有文档).
访问我的资源和静态内容需要做什么?
解决方法:
我最终写了一个服务来自己处理静态资源.我决定从文件系统提供我的文件,但这种方法也适用于从jar中提供它们 – 你只需要将文件作为资源而不是直接创建文件.
@Path("/")
public class StaticService
{
@GET
@Path("/{docPath:.*}.{ext}")
public Response getHtml(@PathParam("docPath") String docPath, @PathParam("ext") String ext, @HeaderParam("accept") String accept)
{
File file = new File(cleanDocPath(docPath) + "." + ext);
return Response.ok(file).build();
}
@GET
@Path("{docPath:.*}")
public Response getFolder(@PathParam("docPath") String docPath)
{
File file = null;
if ("".equals(docPath) || "/".equals(docPath))
{
file = new File("index.html");
}
else
{
file = new File(cleanDocPath(docPath) + "/index.html");
}
return Response.ok(file).build();
}
private String cleanDocPath(String docPath)
{
if (docPath.startsWith("/"))
{
return docPath.substring(1);
}
else
{
return docPath;
}
}
}
标签:java,rest,jersey,jax-rs,grizzly 来源: https://codeday.me/bug/20190608/1200370.html