【问题标题】:Swagger UI - Unable to infer base url in Swagger 2.9.2Swagger UI - 无法在 Swagger 2.9.2 中推断基本 URL
【发布时间】:2020-08-20 05:12:44
【问题描述】:

所以,我两天前才开始使用 Swagger,我看到了一个关于如何在我的 API 上配置基本 Swagger 文档的视频。该视频只是告诉您使用以下代码创建一个新类:

@Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("your-api-package")
                .paths(PathSelectors.any())
                .build();
    }

我下载了 spring-instrument.jar 并将其添加到我的项目中。在 pom.xml 中添加了依赖项,仅此而已。然后当我尝试访问 localhost/my-project/swagger-ui.html 时出现 Unable to infer base url 错误。上网查了一下,发现我也需要添加Swagger Security,所以我最终下载了spring-security.jar。我用这段代码创建了一个 SwaggerSecurity 类:

private static final String[] AUTH_LIST = {
        "/swagger-resources/**",
        "/swagger-ui.html",
        "/v2/api-docs",
        "/webjars/**"
};

protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests().antMatchers(AUTH_LIST).authenticated()
    .and()
    .httpBasic().authenticationEntryPoint(swaggerAuthenticationEntryPoint())
    .and()
    .csrf().disable();
}

@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
    BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
    entryPoint.setRealmName("Swagger Realm");
    return entryPoint;
}

这似乎解决了某些人的问题,但错误仍然存​​在。所以我想知道是否有人也遇到过这种情况,你们是如何解决这个问题的。我不知道它是否对我的问题有任何补充,但我正在使用最新的 Eclipse 版本来运行该项目。

【问题讨论】:

    标签: java eclipse rest swagger swagger-ui


    【解决方案1】:

    你的问题有很多不清楚的地方,让我试试。

    如果您使用嵌入式 tomcat 运行 spring 应用程序,那么您需要定义 servlet 上下文路径。只需在您的src/main/resources/application.properties 中添加以下行

    server.servlet.context-path=/my-project
    

    然后尝试再次运行,它应该可以工作。
    如果它仍然不起作用,请尝试将您的 Docket bean 定义修改为:

    @Autowired
    private  javax.servlet.ServletContext servletContext;
    
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathProvider(new springfox.documentation.spring.web.paths.RelativePathProvider(servletContext) {
                      @Override
                      protected String applicationPath() {
                          return "/my-project";
                      }
                })
                .select()
                .apis(RequestHandlerSelectors.basePackage("your-api-package"))
                .paths(PathSelectors.any())
                .build();
    }
    

    【讨论】:

      【解决方案2】:

      添加以下依赖项:

              <dependency>
                  <groupId>io.springfox</groupId>
                  <artifactId>springfox-swagger2</artifactId>
                  <version>2.9.2</version>
              </dependency>
              <dependency>
                  <groupId>io.springfox</groupId>
                  <artifactId>springfox-swagger-ui</artifactId>
                  <version>2.9.2</version>
              </dependency>
      

      在您的项目中扩展 WebMvcConfigurationSupport 并覆盖 addResourceHandlers

      @Configuration
      @EnableSwagger2
      public class SwaggerConfig extends WebMvcConfigurationSupport {
      
          @Bean
          public Docket productApi() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .select()
                      .apis(RequestHandlerSelectors.basePackage("your-base-package"))
                      .paths(PathSelectors.any())
                      .build();
          }
      
          @Override
          protected void addResourceHandlers(ResourceHandlerRegistry registry) {
              registry.addResourceHandler("swagger-ui.html")
                      .addResourceLocations("classpath:/META-INF/resources/");
              registry.addResourceHandler("/webjars/**")
                      .addResourceLocations("classpath:/META-INF/resources/webjars/");
          }
      }
      

      在您的控制器中注释 @Api@ApiOperation

      @RestController
      @Api(tags = {"Hello controller"})
      @RequestMapping(value = "api")
      public class HelloController {
      
          @ApiOperation(value = "greet")
          @GetMapping(value = "/greet", consumes = "application/json")
          public ResponseEntity<String> index() {
              return ResponseEntity.ok("Greetings from Spring Boot!");
          }
      }
      

      这就像一个魅力。开始您的服务。在浏览器中点击localhost:8080/swagger-ui.html

      【讨论】: