Получение swagger-ui для отображения API, созданного сгенерированным кодом - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над проектом Springboot. Сначала мы делаем API, поэтому мы генерируем код из api.yaml. Мы используем openapi 3.0. Интерфейсы генерируются нормально, но когда мы просматриваем наш URL-адрес swagger-ui, он говорит, что в spe c!

не определены операции. Вот подробности:

@Configuration
@RequiredArgsConstructor
@EnableSwagger2
public class SwaggerConfig {

  private final BuildProperties buildProperties;

  @Bean
  public Docket docketConfig() {
    return new Docket(DocumentationType.SWAGGER_2)
        .select()
        .apis(RequestHandlerSelectors
            .basePackage("com.xyz.infrastructure.rest.spring.resource"))
        .build().apiInfo(apiInfo());
  }

  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title(buildProperties.getName())
        .version(buildProperties.getVersion())
        .build();
  }
}

Наша структура это:

com.xyz.infrastructure.rest.spring | | - config | - SwaggerConfig | - spe c // автоматически сгенерировано | - dto // автоматически сгенерировано | - resource // реализации интерфейсов, найденных в spe c

Что нам не хватает?

Мы используем:

<dependency>
  <groupId>io.swagger.codegen.v3</groupId>
  <artifactId>swagger-codegen</artifactId>
  <version>3.0.21</version>
</dependency>
<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>

Спасибо!

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Наконец-то мы заставили его работать. Вот что это для нас сделало:

Springfox версии 3:

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-boot-starter</artifactId>
   <version>3.0.0</version>
</dependency>

Использование плагина io.swagger.codegen.v3.

Эта конфигурация чванства:

@Configuration
@EnableOpenApi
public class SwaggerConfig {

  @Bean
  public Docket docketConfig() {
    return new Docket(DocumentationType.OAS_30)
        .select()
        .apis(RequestHandlerSelectors
            .basePackage("com.xyz.infrastructure.rest.spring.resource"))
        .build();
  }

}

И убедитесь, что ваши классы в ресурсе имеют аннотацию @RestController.

0 голосов
/ 05 августа 2020

Я использовал как показано ниже:

@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                //.apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("uz.xb.qr_project"))//*** base package
                .paths(PathSelectors.any())
                .build()
                .apiInfo(metaData());
    }

    private ApiInfo metaData() {
        return new ApiInfoBuilder()
                .title("Spring Boot REST API")
                .description("\"Spring Boot REST API for Online Store\"")
                .version("1.0.0")
                .license("Apache License Version 2.0")
                .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0\"")
                .contact(new Contact("John Thompson", "https://springframework.guru/about/", "john@springfrmework.guru"))
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")//**address of swagger ui
                .addResourceLocations("classpath:/META-INF/resources/");


        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

ApiController. java

@RestController
@RequestMapping
public class ApiController {

    @Autowired
    private ApiService apiService;

    @GetMapping
    public String swagger(){
        return "<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>REST API LIST</title>\n" +
                "    <meta http-equiv=\"refresh\" content=\"0; url=/qr_online/swagger-ui.html\" />\n" +
                "</head>\n" +
                "<body>\n" +
                "<a href=\"qr_online/swagger-ui.html\">REST API LIST</a>\n" +
                "</body>\n" +
                "</html>";
    }

  //Or you can use like this inside controller
  /*
    @GetMapping
    public void redirect(HttpServletResponse response) throws IOException {
        response.sendRedirect("swagger-ui.html");
    }
  */

}

пом. xml

        <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>
...