返回

Swagger升级到Knife4j和Springdoc,不再为SpringBoot3兼容性发愁

后端

SpringBoot3中Swagger整合Knife4j和Springdoc的配置指南

SpringBoot3和Swagger的不解之缘

随着SpringBoot3的发布,Swagger兼容性问题应运而生,原因在于javax包的弃用。为了解决此问题,我们需要转向Springdoc和Knife4j这两大神器。

告别过时的Springfox,拥抱Springdoc和Knife4j

Springfox已时过境迁,两年未更新且不支持OpenAPI3标准。而SpringBoot3只支持OpenAPI3规范,因此Springdoc应运而生。

Knife4J是一个强大的工具,可快速生成API文档和调试平台,将Swagger规范转换为易读文档并支持在线API测试。

SpringBoot3整合Knife4j和Springdoc

Knife4j

1. 引入依赖

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>

2. 配置Swagger

@Configuration
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SpringBoot3 Swagger API")
                .description("SpringBoot3 Swagger API")
                .version("1.0")
                .build();
    }
}

3. 配置Knife4j

@Configuration
public class Knife4jConfig {
    @Bean
    @ConditionalOnBean(Docket.class)
    public SwaggerProperties swaggerProperties() {
        return new SwaggerProperties();
    }

    @Bean
    public RouteLocator swaggerRouteLocator(RouteLocatorBuilder builder, SwaggerProperties swaggerProperties) {
        String contextPath = swaggerProperties.getContextPath();
        return builder.routes()
                .route("knife4j-swagger-ui")
                .predicate(PathSelectors.ant(contextPath + "/swagger-ui.html"))
                .uri("forward:/knife4j/swagger-ui.html")
                .build();
    }
}

Springdoc

1. 引入依赖

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

2. 配置Swagger

@Configuration
public class SwaggerConfig {
    @Bean
    public OpenAPI openAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("SpringBoot3 Swagger API")
                        .description("SpringBoot3 Swagger API")
                        .version("1.0"));
    }

    @Bean
    public UiConfiguration uiConfiguration() {
        return UiConfigurationBuilder.builder()
                .build();
    }
}

3. 配置Springdoc

@Configuration
public class SpringdocConfig {
    @Bean
    @ConditionalOnBean(OpenAPI.class)
    public SwaggerProperties swaggerProperties() {
        return new SwaggerProperties();
    }

    @Bean
    public RouteLocator swaggerRouteLocator(RouteLocatorBuilder builder, SwaggerProperties swaggerProperties) {
        String contextPath = swaggerProperties.getContextPath();
        return builder.routes()
                .route("springdoc-swagger-ui")
                .predicate(PathSelectors.ant(contextPath + "/swagger-ui.html"))
                .uri("forward:/swagger-ui.html")
                .build();
    }
}

用Springdoc Knife4j为你的SpringBoot3保驾护航

使用Springdoc和Knife4j,你可以轻松生成API文档,在线测试API,解决SpringBoot3兼容性问题,让你的开发更顺畅。告别Springfox,拥抱新时代!

常见问题解答

1. 如何配置Knife4j的上下文路径?

SwaggerProperties中设置contextPath属性即可。

2. 如何使用Springdoc自定义OpenAPI文档?

通过实现OpenAPICustomizer接口并重写customize方法进行自定义。

3. 如何解决Swagger文档不显示的问题?

检查依赖是否正确引入,并且确保Swagger和Springdoc配置正确。

4. 如何为Springdoc添加API密钥认证?

使用SecurityRequirement类和SecurityScheme类在OpenAPI规范中定义API密钥认证。

5. 如何在Swagger中添加自定义注释?

使用@ApiImplicitParam@ApiModelProperty等注解在Swagger API方法中添加自定义注释。