【问题标题】:Swagger 2 & spring MVC - ignore the war context pathSwagger 2 & spring MVC - 忽略战争上下文路径
【发布时间】:2016-08-23 07:29:09
【问题描述】:

我正在使用带有 spring mvc 的 swagger 2。

war 文件为 web-app.war,Swagger 基本 URL 显示为 /web-app/rest/api

我想删除战争上下文路径,以便可以进行 api 调用

example.com/rest/api不是 example.com/web-app/rest/api

SwaggerConfig.java

@Configuration
@EnableWebMvc
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurerAdapter {

    @Bean
    public Docket api() {
        // @formatter:off
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.any())
                .build().apiInfo(apiInfo());
    }


    private ApiInfo apiInfo() {
         return new ApiInfoBuilder().title("Rest API")
                 .description("Describes the restful interface")
                 .build();
    }

    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

【问题讨论】:

    标签: java spring-mvc swagger


    【解决方案1】:

    如果/web-app 是您的上下文根(您可以在 IDE 中更改它,网上有很多关于如何做到这一点的教程)——那么您无法将项目的元素放置在此之外。

    要实现您想要的,您可以将上下文根设置为 /,然后在您的 REST 服务前面加上 web-app。这将保持相同的 REST 路径,但将 Swagger API 放置在 /rest/api

    编辑

    如果您认为 Springfox 错误地确定了您的基本路径,您可以在 Docket 定义中添加 PathProvider

    return new Docket(DocumentationType.SWAGGER_2)
        /*other options*/
        .pathProvider(new PathProvider(){
    
            String getApplicationBasePath(){
                return "/";
            }
            /*implement other methods or extend RelativePathProvider or Absolute PathProvider instead */
        }
    

    【讨论】:

    • 不确定在 IDE 中更改它是什么意思?问题仅在于当 swagger 发出请求(试试看!)时,它会将 /web-app 添加到 URL。如果我直接访问 URL 是没有 /web-app 的浏览器,一切正常。
    【解决方案2】:

    要解决这个问题,需要更改 Docket 的 host 属性。否则,basePath 将根据请求 url 确定(根据 Swagger2Controllerhow to change base path for swagger

       @Bean
        public Docket api(ServletContext servletContext) throws LoadPropertiesException {
            String host = "example.com";
            String applicationBasePath = null;
            return new Docket(DocumentationType.SWAGGER_2)
              .groupName("My API").host(host).pathProvider(new RelativePathProvider(servletContext) {
                  @Override
                  public String getApplicationBasePath() {
                      return applicationBasePath;
                  }
              })
              .select()
              .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot"))) .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud"))) .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.data.rest.webmvc")))                       
              .build()
              .apiInfo(apiInfo());                                         
        }
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      相关资源
      最近更新 更多