配置Swagger错误解决步骤:documentationPluginsBootstrapper入手

·Swagger ·SpringBoot

我在springboot2.6中配置swagger。因为不想在postman中编辑请求体,而swagger可以直接在网页进行api调试,这样我就可以方便复制数据到postman中永久保存。我的步骤是这样的,这看起来毫无问题:

添加maven,最新版只需配置一个依赖
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>
添加swagger注解配置类,比如:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Value("${server.servlet.context-path}")
    private String contextPath;
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("xxx/xxx/xxx"))
            .build()
            .pathMapping(contextPath);
    }
}

但是启动报错:
Failed to start bean ‘documentationPluginsBootstrapper‘
此问题是因为springboot 2.x版本将antPathMatcher更改为pathPatternMatcher,而swagger仍使用antPathMatcher导致的问题,所以在yml配置文件中配置“matching-strategy: ant_path_matcher”即可。

但是呢,应用启动正常,但是访问swagger-ui.html界面出现404问题,这是因为高版本的swagger依赖修改了ui访问路径。在依赖包META-INF.resources.webjars.springfox-swagger-ui下,没有swagger-ui.html文件,但是有index.html文件。因此访问localhost:{port}/{context-path}/swagger-ui/index.html就能成功看到界面了,不需要做任何放行swagger静态资源的配置,因为在SwaggerUiWebMvcConfigurer类源码中重写了addResourceHandlers方法:
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    String baseUrl = StringUtils.trimTrailingCharacter(this.baseUrl, '/');
    registry.
        addResourceHandler(baseUrl + "/swagger-ui/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
        .resourceChain(false);
  }

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController(baseUrl + "/swagger-ui/")
        .setViewName("forward:" + baseUrl + "/swagger-ui/index.html");
  }
}

刷新界面,可以看到界面访问正常。但是会发生这样的问题,就是我的项目中明明有接口注解Controller,但是界面却是空的,显示“no operations defined”,这是因为前面的swagger注解配置类没有正确扫包,应该这样:
@Configuration
@EnableSwagger2
// can not missing the Scan
@ComponentScan("xxx.xxx.xxx.controller")
public class SwaggerConfig {
    ........
    @Bean
    public Docket docket() {
        .........
    }
}

注意上面的@ComponentScan不能丢失且包正确,正常接口都是controller目录下。
刷新就能看到你所有的接口了,可以在界面上直接测试接口。要想清晰的解释接口的作用、各个参数含义、返回值描述,让前端可以理解,你还需要用到一些注解。比如最常见的:
  • @Api:用在类上,描述一个Controller
  • @ApiOperation:在接口方法上,描述Action接口作用。包括(Response)返回的模型描述
  • @ApiParam:用在接口参数上
  • @ApiImplicitParam:必须用在@ApiImplicitParams中,用于同一描述参数含义,而不必像@ApiParam那样对每个参数都使用注解
  • @ApiModel:描述一个Model类信息
  • @ApiResponse:必须用在@ApiResponses中,一般用于描述错误请求和异常
以上都是常见的swagger描述注解,详细可以自己查阅文档。

来自:Java
更新于2023-02-22 20:23:43 发表于2023-02-18 21:55:00


发表您的评论





公元2024年甲辰龍年,平安健康、龍行天下!