其他分享
首页 > 其他分享> > 如何使用Grizzly在同一个基本URL上提供静态内容和资源

如何使用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