【问题标题】:Swagger not detecting Api built with Spring Data RestSwagger 未检测到使用 Spring Data Rest 构建的 Api
【发布时间】:2019-07-17 16:27:14
【问题描述】:

我正在开发一个使用 swagger 为我的 API 生成文档的 Spring Boot 应用程序,我正在使用 Spring data rest 来生成 Api,但是当我运行该应用程序时,我收到了 swagger 消息:没有定义操作符合规范!

这是我的 Api 代码:

@Api(tags = "projets")
@RepositoryRestResource(collectionResourceRel = "projets", path = "projets")
public interface IProjectRepository extends JpaRepository<Project, Long> {

}

这是我的配置文件:

@Configuration
@EnableSwagger2
public class QfactoryConfiguration {

    @Bean
     public Docket getDocketInstance() {
         return new Docket(DocumentationType.SWAGGER_2) 
                 .apiInfo(new ApiInfoBuilder()
                            .title("Spring Boot project")
                            .description("Spring Boot bootstrap project")
                            .version("0.1")
                            .license("Unlicense")
                            .build())
                  .select()  
                  .apis(RequestHandlerSelectors.basePackage("com.errabi.qfactory.repositories"))             
                  .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-data-rest</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>

我问的是 Swagger 是否能够为 Spring data rest 生成的 Api 生成文档,或者我应该使用带有注释的 @RestController @Api,@ApiOperation

我使用的是 Spring Boot 版本:2.1.3.RELEASE

【问题讨论】:

    标签: java spring-boot swagger spring-data-rest springfox


    【解决方案1】:

    验证您的包并添加

    @Configuration
    @EnableSwagger2
    

    到spring boot配置文件

       @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2).select()
                    .apis(RequestHandlerSelectors.basePackage("your.package.name")).paths(PathSelectors.any()).build()
                    .apiInfo(apiEndPointInfo());
        }
    

    只有那些依赖项是必需的

    <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.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @SpringBootApplication
    @Configuration
    @EnableSwagger2
    public class TestappApplication implements WebMvcConfigurer {
    
        private static final String PREFIX = "/WEB-INF/views/";
        private static final String SUFFIX = ".jsp";
    
        public static void main(String[] args) {
            SpringApplication.run(TestappApplication.class, args);
        }
    
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            registry.jsp(PREFIX, SUFFIX);
    
        }
    
        @Bean
        public Docket api() {
            return new Docket(DocumentationType.SWAGGER_2).select()
                    .apis(RequestHandlerSelectors.basePackage("your.package.scan.to.swagger.annotations")).paths(PathSelectors.any()).build()
                    .apiInfo(apiEndPointInfo());
        }
    
        public ApiInfo apiEndPointInfo() {
            return new ApiInfoBuilder().title("Spring Boot Rest API").description("user Management API")
                    .contact(new Contact("zouhair kasmi", "website.com/", "myemail@gmail.com"))
                    .license("Apache 2.0").licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
                    .version("0.0.1-SNAPSHOT").build();
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      尝试RequestHandlerSelectors.any() 而不是RequestHandlerSelectors.basePackage("")

      【讨论】:

        【解决方案3】:

        pom.xml

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
            <relativePath />
        </parent>
        
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <swagger>3.0.0-SNAPSHOT</swagger>
        </properties>
        
        <dependencies>
        <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${swagger}</version>
            </dependency>
        
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${swagger}</version>
            </dependency>
        
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-data-rest</artifactId>
                <version>${swagger}</version>
            </dependency>
        
        </dependencies>
        

        应用程序.yaml

        spring:
            data:
                rest: 
                    base-path: /v1
        

        java 配置

        @Configuration
        @EnableSwagger2WebMvc
        @Import(SpringDataRestConfiguration.class)
        public class SwaggerConfig 
        

        【讨论】:

          【解决方案4】:

          这对我有用,升级到 springfox 的最新快照

          <dependencies>
          ...
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger2</artifactId>
              <version>3.0.0-SNAPSHOT</version>
          </dependency>
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger-ui</artifactId>
              <version>3.0.0-SNAPSHOT</version>
          </dependency>
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-data-rest</artifactId>
              <version>3.0.0-SNAPSHOT</version>
          </dependency>
          ...
          </dependencies>
          
          <repositories>
              <repository>
                  <id>JFrog</id>
                  <name>JFrog Snapshot Repository</name>
                  <url>http://oss.jfrog.org/artifactory/oss-snapshot-local/</url>
              </repository>
          </repositories>
          

          然后用@EnableSwagger2WebMvc代替@EnableSwagger2

          @SpringBootApplication
          @EnableSwagger2WebMvc
          @Import(SpringDataRestConfiguration.class)
          public class MyApplication {
          
              public static void main(String[] args) {
                  SpringApplication.run(MyApplication.class, args);
              }
          
          }
          

          感谢Yann39

          【讨论】:

          • 我也面临同样的问题。 Swagger UI 不显示 RepositoryRestResource 注释可用的默认端点。我花了一整天的时间在这上面。通过指向 3.0.0 快照修复了一些问题。但是,我仍然没有看到端点在招摇 UI 中显示。我只能看到 @RestController 端点。让我知道这是否适合您。
          • 我在 Spring 2.2.2.RELEASE - 似乎 SpringDataRestConfiguration 被删除了。还是改名了?有任何想法吗?见stackoverflow.com/questions/59868163/…
          • 即使我也面临同样的问题。我正在使用 Spring Boot 2.2.2.RELEASE,添加了 SpringFox 3.0.0-SNAPSHOT 依赖项。当我尝试访问 swagger-ui.html 页面时,我收到 Whitelabel 错误页面。
          • 您是否启用了任何安全功能?你有没有在控制台上有任何指向任何细节的东西?!如果您遇到相同类型的异常,您可以检查此问题及其相关答案。 stackoverflow.com/a/57342184/9019797
          • EnableSwagger2WebMvc 在 3.0.0 版本中已弃用,不确定早期版本。
          【解决方案5】:

          根据thisspringfox Github 问题的讨论,您似乎需要修改配置类以包含附加注释,即:

          @Configuration
          @EnableSwagger2
          @Import({springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration.class})
          

          我无法对其进行测试,因为我目前仅将 swagger 用于 Rest 控制器,但希望这会有所帮助。

          【讨论】:

          • 我添加了 SpringDataRestConfiguration 并且应用程序在启动时失败搜索错误我发现 Swagger 与 spring boot 2.X 不兼容这个错误更正应用程序的类路径,使其包含org.springframework.data.repository.support.Repositories 的单一兼容版本
          • 你的 POM 的其余部分是什么样的?
          • @EnableSwagger2WebMvc 已弃用,你所做的是正确的
          猜你喜欢
          • 1970-01-01
          • 2020-03-04
          • 2020-11-07
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          • 1970-01-01
          • 2019-06-28
          • 2017-01-19
          相关资源
          最近更新 更多