使用Spring Boot 2.0的Swagger导致404错误页面

时间:2018-05-31 06:53:02

标签: java spring-boot swagger

我尝试将我的Spring Boot版本2.0.1.RELEASESwagger集成。

从这个blog post看起来,通过添加两个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>

创建了SwaggerConfig bean:

@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错误。

我找到了this issues in the swagger github pagethis question in stackoverflow,但我无法更改404错误。

15 个答案:

答案 0 :(得分:9)

请检查参考:https://springfox.github.io/springfox/docs/current/

“2.1.3. 从现有 2.x 版本迁移”

您可以从 pom.xml 中删除 springfox-swagger2 和 springfox-swagger-ui,并添加 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/。这使得将其作为 Web jar 提取并在不需要时使用配置属性将其关闭时效果更好。”

答案 1 :(得分:5)

我能够使其与Spring Boot版本2.0.4.RELEASEthis blog post一起使用:

我添加了以下依赖项:

<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();
    }
}

它奏效了。

答案 2 :(得分:2)

我也遇到了同样的问题(404 Not Found with springfox 3.0.0)。通过将日志记录级别设置为“DEBUG”,我能够看到 /v3/api-docs 的端点并且它们工作正常,但没有关于“swagger-ui”的任何内容。

我终于找到了https://github.com/springfox/springfox/issues/3285,这表明:

<块引用>

3.0.0 中的新 url 是 /swagger-ui/index.html 或 /swagger-ui/ 而不是 /swagger-ui.html"

他们是否可以不添加调试日志来指示 swagger UI 可用的位置?

答案 3 :(得分:1)

对于 Spring Boot,只需使用下面的依赖项,它就可以处理 URL /swagger-ui/(尾部斜杠是必需的)。

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

在尝试之前,我尝试使用 swagger2swagger-ui 的经典依赖项,但建议的 URL 均无效。

答案 4 :(得分:0)

另一种可能性是您的Swagger配置文件的位置;您需要将其放在spring boot文件的相同软件包或子软件包中。 如上图:

Swagger config and Spring Boot file hierarchy

答案 5 :(得分:0)

首先将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中的路径

将此文件添加到您的文件中

server.servlet-path=/my-service

并尝试这个 http://localhost:8080/my-service/swagger-ui.html(UI文件)

http://localhost:8080/loop-service/v2/api-docs(JSON文档)

结果: enter image description here

答案 6 :(得分:0)

如果将Spring Boot升级到2+,请不要忘记将server.contextPath更改为server.servlet.contextPath

答案 7 :(得分:0)

解决方案:您只需要从配置类中删除 @EnableWebMvc

说明: @EnableWebMvc 打开类 org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport 。在spring-boot中,有一个自动配置类 org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration ,其注释为 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

最终结果:通过将 @EnableWebMvc 添加到项目中,由于我们关闭了spring-boot自动配置,因此我们自己对一切负责。

答案 8 :(得分:0)

面对同样的问题,只是通过更改依赖关系解决了 请参阅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”

答案 9 :(得分: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();
    }
}

答案 10 :(得分:0)

如果它可以帮助某人,请添加它。这个网址对我有用

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

对于 swagger-ui,这个 url 开箱即用:

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

检查您是否使用正确配置的 url 来获取 swagger 规范。像 http://localhost:8080/spring-security-rest/api/swagger-ui/

这样的网址

没有用,我一直收到 404。

答案 11 :(得分:0)

只需使用 springdoc-openapi-ui 代替。

依赖:

<dependency>
     <groupId>org.springdoc</groupId>
     <artifactId>springdoc-openapi-ui</artifactId>
     <version>1.5.9</version>
</dependency>

然后对于 UI 只需转到:

  • http://localhost:8080/swagger-ui.html

对于 Json 去:

  • http://localhost:8080/v3/api-docs

对于 yaml:

  • http://localhost:8080/api-docs.yaml

这就是它的全部内容......不需要注释/配置。干杯!

如果您正在使用 spring security,请确保您可以访问这些路径以使其正常工作:

  • /swagger-ui.html
  • /swagger-ui/**
  • /v3/api-docs/**

欲了解更多信息: https://www.baeldung.com/spring-rest-openapi-documentation

答案 12 :(得分:0)

以下是在 Spring Boot 应用程序中启用 swagger 的步骤:

  1. 添加 springfox-swagger2springfox-swagger-ui 依赖项。
  2. 要在您的项目中启用 Swagger2,您应该使用 @EnableSwagger2
  3. 在下方定义一个 Docket bean 广告

        @Bean
        public Docket docket(){
                return new Docket(DocumentationType.SWAGGER_2).groupName("group-name").apiInfo(apiInfo()).select().paths(predicate()).build();
        }


        private Predicate<String> predicate() {
                return or(regex("/api/v1.*"), regex("/api/v2.*"));
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder().title("The title of the your choice")
                    .contact("your@email.com").license("Licence name ").version("1.0").build();
        }
    

答案 13 :(得分:-1)

这对我有用,我使用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/");
  }
}

答案 14 :(得分:-2)

在删除@EnableWebMvc

之后,它对我有用