Swagger с Spring Boot 2.0 приводит к странице ошибки 404

Я пытаюсь интегрировать свою версию Spring Boot 2.0.1.RELEASE с swagger.

Из этого Сообщение блога казалось, что это будет легко, просто добавив две зависимости Maven, и все должно работать.

Поэтому я добавил в pom следующие зависимости:

        <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>

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

И создал bean-компонент SwaggerConfig:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
    Docket docket = new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            .build();

    return docket;
   }
}

И в файле свойств я получил эти 3 записи во время попыток заставить его работать:

spring.application.name=cat-service
management.server.servlet.context-path=/cat-service
server.servlet.contextPath=/cat-service

Но в конце при доступе

http://localhost:8080/cat-service/api/v2/api-docs

или на странице пользовательского интерфейса по адресу

http://localhost:8080/cat-service/swagger-ui.html

Я получаю ошибку page not found.

Я нашел это проблемы на странице чванства github и этот вопрос в stackoverflow, но мне не удалось изменить свою ошибку 404.

Вам также потребуется правильная конфигурация, включая аннотацию @EnableSwagger2, как указано в статье. Есть ли у вас они, и если да, не могли бы вы также опубликовать их в своем вопросе?

g00glen00b 31.05.2018 08:58

Вы добавили конфигурацию swagger?

pkgajulapalli 31.05.2018 08:59

пружинный упор для вас не подходит

Pratapi Hemant Patel 31.05.2018 08:59

Дубликат: stackoverflow.com/a/64333853/410439

Ravi Parekh 13.10.2020 15:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
4
36 788
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

У меня это сработало, я использовал WebMvcConfigurer вместо WebMvcConfigurerAdapter, потому что этот класс уже устарел.

@Configuration
@EnableSwagger2
public class SwaggerConfig implements WebMvcConfigurer {
  @Bean
  public Docket productApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()                
            .apis(RequestHandlerSelectors.basePackage("com.illary.controller"))
            .paths(PathSelectors.any())
            .build()            
            .apiInfo(metaData());
  }
  private ApiInfo metaData() {
    return new ApiInfoBuilder()
            .title("Spring Boot Swagger App")
            .description("\"Spring Boot Swagger Server App\"")
            .version("1.0.0")
            .license("Apache License Version 2.0")
            .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0\"")
            .build();
  }

  public ApiInfo apiInfo() {
    final ApiInfoBuilder builder = new ApiInfoBuilder();
    builder.title("Swagger Test App").version("1.0").license("(C) Copyright Test")
    .description("The API provides a platform to query build test swagger api");

    return builder.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/");
  }
}
Ответ принят как подходящий

Мне удалось заставить его работать с загрузочной версией Spring 2.0.4.RELEASE и это сообщение в блоге:

Я добавил эти зависимости:

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

И этот файл конфигурации:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SpringFoxConfig {
    @Bean
    public Docket apiDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }
}

И это сработало.

Пользовательский интерфейс Swagger находится по адресу /swagger-ui.html#.

У меня стало работать после удаления @EnableWebMvc

его удаление среди прочего вызывает Error creating bean with name webMvcRequestHandlerProvider ...

Mahmoud K. 21.10.2020 21:25

Другая возможность - это расположение вашего файла конфигурации Swagger; вам нужно разместить его в том же пакете или подпакете загрузочного файла Spring. Как на картинке выше:

Swagger config and Spring Boot file hierarchy

Сначала добавьте файл SwaggerConfig.java в тот же пакет с файлом Springboot, как в следующем примере.

@Configuration
@EnableSwagger2
@EnableWebMvc
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/");
   }

}

попробуй это http://localhost:8080/spring-security-rest/api/swagger-ui.html или же http://localhost:8080/spring-security-rest/swagger-ui.html

Если это не сработает, попробуйте изменить путь в application.properties.

Добавьте это в application.properties:

server.servlet-path=/loop-service

и попробуйте следующие URL-адреса:

http://localhost:8080/loop-service/swagger-ui.html (Документы пользовательского интерфейса)

http://localhost:8080/loop-service/v2/api-docs (документы JSON)

Результат :

Не забудьте изменить server.contextPath на server.servlet.contextPath, если вы обновите Spring Boot до 2+.

Решение: Вам просто нужно удалить @EnableWebMvc из классов конфигурации.

Описание:@EnableWebMvc включает класс org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport. В spring -boot есть класс автоконфигурации org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration, который имеет аннотацию @ConditionalOnMissingBean (WebMvcConfigurationSupport.class).

Что мы получаем в итоге: Добавляя @EnableWebMvc в проект, мы сами становимся ответственными за все, так как отключаем автоконфигурацию spring -boot.

его удаление среди прочего вызывает Error creating bean with name webMvcRequestHandlerProvider ...

Mahmoud K. 21.10.2020 21:25

Столкнулся с той же проблемой, только что решенной с изменением зависимости Обратитесь к https://www.vojtechruzicka.com/documenting-spring-boot-rest-api-swagger-springfox/

скомпилировать "io.springfox: springfox-swagger2: 2.9.2"

Раньше пользовался - Не работает

группа компиляции: 'io.springfox', имя: 'springfox-swagger2', версия: '3.0.0'

После добавления строки ниже в application.properties он начал работать

spring.web.resources.static-locations: classpath:/webapp/

Но я не уверен, зачем нам это добавлять. Добавление кода, который, я думаю, может быть актуальным. Зависимости указаны ниже:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    ...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>

        <!-- Swagger Dependencies -->
        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

И основной класс как

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableSwagger2
public class ProxyApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProxyApplication.class, args);
    }

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

Добавьте это, если это может кому-то помочь. Этот URL работал у меня

http://localhost:8003/v2/api-docs

и для swagger-ui этот URL-адрес работал у меня из коробки:

http://localhost:8003/swagger-ui.html 

Проверьте, используете ли вы правильно настроенный URL-адрес для характеристик swagger. URL-адреса типа http://localhost:8080/spring-security-rest/api/swagger-ui/

не сработало, и я получал 404.

У меня также была такая же проблема (404 Not Found с springfox 3.0.0). Установив уровень ведения журнала на «DEBUG», я смог увидеть конечные точки для /v3/api-docs, и они работали, но о «swagger-ui» ничего не было.

Наконец я нашел https://github.com/springfox/springfox/issues/3285, который указывает на то, что:

the new url in 3.0.0 is /swagger-ui/index.html or /swagger-ui/ rather than /swagger-ui.html"

Могли они не добавить журнал отладки, чтобы указать, где доступен пользовательский интерфейс Swagger?

Пожалуйста, проверьте ссылку: https://springfox.github.io/springfox/docs/current/

«2.1.3. Переход с существующей версии 2.x»

Вы можете удалить springfox-swagger2 и springfox-swagger-ui из вашего pom.xml и вместо этого добавить springfox-boot-starter (например, версия 3.0.0). Также вы можете удалить аннотации @ EnableSwagger2

И: "расположение swagger-ui перемещено с http: //host/context-path/swagger-ui.html на http: //host/context-path/swagger-ui/index.html ИЛИ http: // host / context-path / swagger-ui / для краткости. Благодаря этому он работает намного лучше, вытаскивая его как веб-банку и отключая, используя свойства конфигурации, если это не нужно.

Другие вопросы по теме