Интеграция Spring Swagger с пользовательским интерфейсом

Излишне говорить, что я знаю, что есть масса вопросов по этой же теме, но я застрял, пытаясь исправить это уже 2 дня, и большая часть того, что я читал, устарело.

Так что да.. это то, что у меня есть прямо сейчас:

Грейдл:

dependencies {
compile 'org.springframework.cloud:spring-cloud-starter-hystrix'
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'org.springframework.boot:spring-boot-starter-actuator'
compile 'org.springframework.boot:spring-boot-starter-security'
compile 'org.springframework.ws:spring-ws-core'
compile 'io.springfox:springfox-swagger2:2.4.0'
compile 'io.springfox:springfox-swagger-ui:2.4.0'
}

Основной класс:

@EnableSwagger2
public class Application {
public static void main(String[] args) {
        SpringApplication.run(FeedServiceApplication.class, args);
}

@Bean
public Docket swaggerSettings() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build()
            .pathMapping("/");
}

Когда я посещаю: http://localhost:8080/v2/api-docs, я получаю документация json в порядке. Кроме того, когда я загружаю swagger-ui с github, устанавливаю источник по ссылке выше и запускаю его на рабочем столе, он также работает нормально. Что не работает, так это объединение этих двух вещей (заставить их работать на http://localhost:8080/swagger-ui.html).

Есть много руководств, подобных этим, в которых утверждается, что все вышеперечисленное заставит работать swagger-ui:

http://kubecloud.io/guide-using-swagger-for-documenting-your-spring-boot-rest-api/

http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api

И множество других руководств, в которых вам предлагается добавить папку dist из git swagger-ui в ваш проект.

Также такое отображение:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

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

Также происходит сбой, выдача «запроса» Scope не активна для текущего потока; исключение.

Попробовав несколько руководств с YouTube, те, которые указаны выше, и многие другие, я увидел только «страница не найдена». Если бы кто-нибудь мог объяснить, что мне не хватает, я был бы очень благодарен.

TL:DR Как заставить работать swagger-ui.html?

РЕДАКТИРОВАТЬ: найдено решение.

На случай, если кто-то еще наткнется на это, проблема в том, что если у вас есть сопоставление запроса, которое принимает параметр @RequestMapping("/{param}"), dispatcherServlet больше не сопоставляет /** с ResourceHttpRequestHandler. Приведенный ниже код устраняет эту проблему.

@Configuration
@EnableAutoConfiguration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurerAdapter{
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any()).build();
    }

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

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

person Rauno    schedule 25.11.2016    source источник
comment
Вы должны использовать swagger-ui, предоставленный Springfox и использующий webjar, поэтому нет файлов html или css для ручной установки в вашем веб-приложении.   -  person Gaël Marziou    schedule 25.11.2016
comment
Спасибо за помощь. Застрял в той же проблеме.   -  person harsh.tibrewal    schedule 25.04.2017
comment
Лучше проверьте это stackoverflow.com/a/64333853/410439   -  person Ravi Parekh    schedule 18.02.2021


Ответы (2)


Это то, что мы используем в качестве установки. Класс для себя, аннотированный @Configuration

@Configuration
@EnableSwagger2
public class SwaggerConfig {
  @Bean
  public Docket api() {
    return new Docket(DocumentationType.SWAGGER_2)
      .select()
      .apis(RequestHandlerSelectors.any())
      .paths(Predicates.not(PathSelectors.regex("/error")))
      .build()
      .apiInfo(apiInfo());
  }
  private ApiInfo apiInfo() {
    return new ApiInfo(
      "APP NAME",
      "APP DESCRIPTION",
      "1.0",
      null,
      new Contact("Firstname Lastname", null, "[email protected]"),
    null,
    null);

} }

person hecko84    schedule 25.11.2016
comment
Спасибо за ответ. Пробовал и это, но для пользовательского интерфейса нет конечной точки. - person Rauno; 25.11.2016
comment
По какому адресу вы ищете? кажется, вы добавляете туда v2, наш графический интерфейс swagger находится по адресу host:8050/swagger-ui.html , где 8050 — это открытый порт. - person hecko84; 25.11.2016
comment
Я просматриваю /swagger-ui.html и v2/swagger-ui.html, но вижу все конечные точки в консоли (например, я прекрасно вижу v2/api-docs), а для пользовательского интерфейса нет конечной точки. - person Rauno; 25.11.2016

<dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>${swagger.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>${swagger.version}</version>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-spi</artifactId>
        <version>${swagger.version}</version>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-core</artifactId>
        <version>${swagger.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-spring-web -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-spring-web</artifactId>
        <version>${swagger.version}</version>
    </dependency>

Преобразуйте приведенную выше зависимость в gradle. Я использовал версию 2.3.1.

package XXXX;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
public class SwaggerConfiguration {

}

Мы включили конфигурацию Swagger, как указано выше.

Вы можете добавить компонент Docket для пользовательских заголовков:

@Bean
  public Docket docket() {

 Parameter parameterAuthorization =
        new ParameterBuilder().name("Authorization").description("Authentication of the API User")
            .modelRef(new ModelRef("string")).parameterType("header").required(true).build();

    Parameter parameterClientUserId =
        new ParameterBuilder().name("user_id").description("Client user identifier")
            .modelRef(new ModelRef("string")).parameterType("header").required(true).build();

    return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any())
        .paths(PathSelectors.any()).build()
        .globalOperationParameters(Lists.newArrayList(parameterClientUserId, parameterAuthorization));
  }

И, наконец, импортируйте конфигурацию Swagger в класс основного приложения при загрузке Spring.

@Import({SwaggerConfiguration.class})

person Rajeev Singla    schedule 25.11.2016
comment
Спасибо за ответ. Пробовал это, но до сих пор не получил конечной точки для пользовательского интерфейса. - person Rauno; 25.11.2016