簡體   English   中英

Swagger UI - 無法推斷 Swagger 2.9.2 中的基礎 url

[英]Swagger UI - Unable to infer base url in Swagger 2.9.2

所以,我兩天前才開始使用 Swagger,我在我的 API 上看到了一個關於如何配置基本 Swagger 文檔的視頻。 該視頻只是告訴您使用以下代碼創建一個新的 class:

@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 class:

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 版本來運行該項目。

您的問題中有很多不清楚的地方,但讓我試試。

如果您正在運行帶有嵌入式 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();
}

添加以下依賴項:

        <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/");
    }
}

在 controller 中注釋@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM