【问题标题】:Cannot get my endpoints list from controller in swagger UI无法从 swagger UI 中的控制器获取我的端点列表
【发布时间】:2019-06-07 08:53:19
【问题描述】:

我是使用 Swagger UI 的 Spring Boot 新手。我只是想将我的 Rest 控制器端点配置为在 swagger UI 屏幕上显示,但它显示 No operation for specs defined。很确定,这是一个配置问题。

我试过@EnableAutoConfiguration,还是找不到控制器

SwaggerDemoApplication.java

package com.example.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

}

SwaggerConfig.java

package com.example.config;

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

@EnableSwagger2
@Configuration

public class SwaggerConfig {

 @Bean
 public Docket productApi() {
     return new Docket(DocumentationType.SWAGGER_2)  
              .select()                                  
              .apis(RequestHandlerSelectors.basePackage("com.example.controller"))              
              .paths(regex("/test.*"))                       
              .build();                                           

 } 
}



TestController.java

package com.example.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;

@RestController
@RequestMapping(value = "/test")
@Api(value="onlinestore", description="Operations pertaining to products in Online Store")
public class TestController {

    @RequestMapping(value = "/test-swagger", method= RequestMethod.GET)
    public String home() {
        return "Spring is here!";
    }

}

预期:休息端点 实际:规范中没有定义操作

【问题讨论】:

  • 您能否将 Docket bean 更改为具有此配置的测试目的:.apis(RequestHandlerSelectors.any()).paths(PathSelectors.any())
  • 尝试从 SwaggerConfig 中删除 .paths(regex("/test.*"))
  • 您的代码中是否有注释@EnableGlobalMethodSecurity(..) 来启用Spring Rest Security?如果是,那么您的问题可能与 Swagger 中的错误有关:github.com/springfox/springfox/issues/2531

标签: java rest spring-boot swagger-ui swagger-2.0


【解决方案1】:

我遇到了和你一样的问题,这是由于我的 @SpringBootApplication 类的位置错误造成的,就像你遇到的那样。

(在代码 sn-ps 中,我故意省略了不太相关的注释,它们仍然必须存在,就像您在帖子中一样。

我还引用了“下”、“根包”等词,因为从技术上讲,Java 不识别“子包”之类的东西。 Java 中的所有包都处于同一“级别”,即使 Web 域的点和相似之处“误导”我们对它们进行分层思考。然而 Spring 广泛适用于“子包”和“根包”。)

package com.example.config;
@SpringBootApplication
public class SwaggerDemoApplication {
    ...
}

package com.example.config;
@EnableSwagger2
public class SwaggerConfig {
      ...
      .apis(RequestHandlerSelectors.basePackage("com.example.controller"))              
      ...
}

@RestController
package com.example.controller; // notice that this is not "under" com.example.config where SwaggerDemoApplication resides
public class TestController {
    ....
}

我观察到,如果@SpringBootApplication 类不在@RestController 类的“根包”中,它会破坏自动魔术行为,并且在apis(...) 的调用中设置的包名被忽略,包被未扫描。老实说,我不太确定apis() 应该如何工作以及这是一个错误还是一个功能

要在不添加@ComponentScan 的情况下修复它,您的包组织应该是这样的:

package com.example.myapplication; // the main class is placed in the "root" package
@SpringBootApplication
public class SwaggerDemoApplication {
    ...
}

package com.example.myapplication.config;
@EnableSwagger2
public class SwaggerConfig {
      ...
      .apis(RequestHandlerSelectors.basePackage("com.example.myapplication"))
      ...
}

package com.example.myapplication.controller;
@RestController
public class TestController {
    ...
}

您还可以通过指定进一步过滤 API 扫描

.apis(
    withClassAnnotation(RestController.class)
    .and(basePackage("com.example.myapplication.controller))
)

【讨论】:

    【解决方案2】:

    问题不是你的 Swagger 配置,而是你的 Controller 没有被扫描为 Spring 资源类。

    因为你的应用启动类(主类)没有@ComponentScan注解。

    所以,你的班级应该是这样的:

    @EnableSwagger2
    @SpringBootApplication
    @ComponentScan("com.example")
    public class SwaggerDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(SwaggerDemoApplication.class, args);
        }
    }
    

    现在您可以从这里http://localhost:8098/swagger-ui.html# 访问您的 API 文档

    【讨论】:

    • @SpringBootApplication 包括@ComponentScan
    • 您的解决方案是 OP 错误组织课程的一种解决方法。而是掩盖了根本原因,即主应用程序类的奇怪包放置。
    【解决方案3】:

    你可以这样试试。
    您指定的路径可能有问题。

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
    
        @Bean
        public Docket docket() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("<your-package>"))
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("API Documentation")
                    .description("This API documentation is related <something>")
                    .version("1.0.0")
                    .build();
        }
    }
    

    【讨论】:

    • 我尝试过以各种方式配置路径。仍然没有出现端点。如果您有帐户,我可以将您添加到我的私人 gitlab 存储库中。感谢您的回复。
    • @AnirbanDutta 我的 git 帐户已与我的个人资料关联,因此您可以将我添加到您的项目中。
    • 发现问题并在另一个答案中发布解决方案。
    【解决方案4】:

    SwaggerConfig.java

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    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 SwaggerConfig implements WebMvcConfigurer{
    
        @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/");
        }   
    
       @Bean
       public Docket apiDocket() {
    
           Docket docket =  new Docket(DocumentationType.SWAGGER_2)
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.example"))
                    .paths(PathSelectors.any())
                    .build();
    
           return docket;
    
        } 
    }
    

    SwaggerDemoApplication.java

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

    pom.xml

    <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.9.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-core</artifactId>
                <version>2.9.2</version>
            </dependency>
    
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.9.2</version>
            </dependency>   
    

    如果你使用 Spring Security,你必须在下面添加配置

     @Override
        public void configure(WebSecurity web) throws Exception {
            web
              .ignoring()  
                .antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**");
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception{
    
             http
             .csrf().disable()
             .authorizeRequests()
             .antMatchers("/v2/api-docs", "/configuration/**", "/swagger*/**", "/webjars/**")
             .permitAll()
             .anyRequest().authenticated();
        }
    

    【讨论】:

    • 我可以在 gitlab 上分享我的私人仓库吗?如果是,请提供您的用户名。抱歉,我还是个菜鸟,即使在所有建议的更改之后也无法正常工作
    • @AnirbanDutta 您在上述实施后面临的问题,您可以将您的项目共享为公共 repo 并可以共享链接
    • gitlab.com/anirban-dutta/my-rough-work 让我知道这是否有效
    猜你喜欢
    • 2019-10-05
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2023-02-06
    • 2017-01-06
    相关资源
    最近更新 更多