【问题标题】:Jersey 2: render Swagger static content correctly without trailing slash(/)Jersey 2:正确渲染 Swagger 静态内容,不带斜杠(/)
【发布时间】:2026-02-07 22:20:04
【问题描述】:

我做的是用Grizzly/Jersey托管swagger-ui,是静态内容。

这是build.gradle的一部分:

compile 'org.glassfish.jersey.core:jersey-server:2.22.1'
compile 'org.glassfish.jersey.containers:jersey-container-grizzly2-http:2.22.1'
compile 'org.glassfish.jersey.containers:jersey-container-grizzly2-servlet:2.22.1'

以下是使用Grizzly 配置静态内容的方法:

httpServer = GrizzlyWebContainerFactory.create(uri);
httpServer.getServerConfiguration().addHttpHandler(new StaticHttpHandler("swagger-ui"), "/swagger");

swagger-ui是项目根文件夹下的文件夹。

当我访问 http://localhost/swagger/ 时一切正常,但是当我尝试 http://localhost/swagger 时,它只给出了一个没有渲染的简单页面,似乎所有 css/js 文件都丢失了:

我想知道使不带斜杠(/)的 url 与带有斜杠的 URL 相同的最佳方法是什么。

更新: 我已经向 swagger-ui 提出了一张票:https://github.com/swagger-api/swagger-ui/issues/1966,但它说这是Grizzly 的配置问题,所以Grizzly 的另一张票:https://java.net/jira/browse/GRIZZLY-1823

现在没有找到解决方案。我正在考虑使用另一个网络服务器。

【问题讨论】:

  • 将在 Grizzly 2.3.25 中修复

标签: javascript html url swagger


【解决方案1】:

我可以确认(正如 alexey 所说)这已在最近版本的 Grizzly 中得到修复。

您可以将此添加到您的pom.xml 或更新版本号

<dependency>
    <groupId>org.glassfish.grizzly</groupId>
    <artifactId>grizzly-http-server</artifactId>
    <version>2.3.28</version>
</dependency>

Grizzly 会自动将 301 重定向从不带斜杠的网址返回到带有斜杠的网址。

【讨论】:

    【解决方案2】:

    我相信你要么想映射到 HTML 文件 swagger-ui.html 要么提供 jar 你可以试试这个html server grizzly+jersey (.html from .jar archive)

    更新:

    问题在于 Grizzly 路由。例如。如果您检查您的浏览器错误日志,您会看到它正在尝试从 http://localhost:18888/css/typography.css 而不是 http://localhost:18888/swagger/css/typography.css 加载。

    我找不到任何关于 Grizzly 如何进行路由的信息,而且似乎不一致。例如。 http://localhost/swagger 加载 index.html 很好,但不是 swagger-ui.js,它们都在同一路径上。我用过其他服务器,比如 Nginx 来提供静态文件,没有遇到过像我们这样的问题。

    一种解决方法是分别映射每个 swagger-ui 文件夹,或者您可以使用 this 将 Swagger 部署为单个 JAR,正如我在 cmets 中所说的那样。我还研究了使用通配符,如 here 所讨论的那样,但没有任何运气。

        httpServer.getServerConfiguration().addHttpHandler(new StaticHttpHandler("<basepath>/lib"),"/lib");
        httpServer.getServerConfiguration().addHttpHandler(new StaticHttpHandler("<basepath>/css"),"/css");
    ...
    

    【讨论】:

    • 能否详细说明如何映射到 HTML 文件 swagger-ui.html?
    • 您是否还托管动态生成的 Swagger 文档?例如,我们使用 Springfox 托管我们的文档和 swagger ui,它负责配置 Web 服务器以托管 swagger ui,请参阅springfox.github.io/springfox/docs/snapshot
    • 是的,我将使用swagger 来导出我的restful api。但是对于swagger ui,我只是使用从guihub下载的静态内容
    • 你看过 Springfox 吗?除非您有其他要求,否则我会使用它来部署 Swagger UI。
    • 还没有,我不想将Springfox 导入到我的项目中,因为已经有一个用于swagger 的Web 容器Grizzly。一切都很好,只是想让/swagger/swagger/ 一样工作