swagger 支持动态host和basePath

  swagger-ui中的 host 和 basePath 等配置通过 swagger 的 /v2/api-doc 接口返回。在项目启动时可以提前设置 host 和 basePath,但是java代码无法动态支持多租户的 host 和 basePath,只能通过前端修改api的请求路径。具体步骤如下:

  1. 删除pox.xml 中的 springfox-swagger-ui 依赖,将 springfox-swagger2 版本设为 2.9.2。
  2. 去maven官网下载 springfox-swagger-ui 的jar包,解压缩,将里面的静态资源放到项目的java/resources/META-INF/resources目录下。
  3. 在Swagger2Config中新增静态资源的controller:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // 解决swagger无法访问
    registry.addResourceHandler("/swagger-ui.html")
            .addResourceLocations("classpath:/META-INF/resources/");
    // 解决swagger的js文件无法访问
    registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
  1. 在pox.xml 的build/resources中新增需要打包的静态资源。默认不加resources会将java/resources中的所有文件打包到jar文件中。
  2. 克隆 https://github.com/springfox/springfox/ 项目的tag 2.9.2,cd 到 springfox/springfox-swagger-ui/src/web/目录,修改 package.json 中 webpack的版本:
"webpack": "^4.20.2", 
"webpack-cli": "^3.1.1`

js/springfox.js 中的 SwaggerUIBundle 中增加插件配置,可以根据需要自行修改spec配置文件:

 plugins: [
        SwaggerUIBundle.plugins.DownloadUrl,
        {
          statePlugins: {
            spec: {
              wrapActions: {
                updateSpec: function (oriAction, system) {
                  return (spec) => {
                    var originSpec = JSON.parse(spec);
                    originSpec.host = window.location.host;
                    originSpec.basePath = window.location.pathname
                      .split("/")
                      .slice(0, -1)
                      .join("/");
                    var newSpec = JSON.stringify(originSpec);
                    return oriAction(newSpec);
                  };
                },
              },
            },
          },
        },
      ]

运行 npm run build 打包 springfox.js.
6. 将上述文件替换 java 项目中的 springfox.js 即可。

posted @ 2020-10-01 11:37  开发之路  阅读(4396)  评论(0编辑  收藏  举报