Swagger2 Knife4jConfig 配置,父子项目swagger扫描多个子模块中的Controller生成接口文档:

问题:

需求父子项目swagger扫描多个子模块中的Controller生成接口文档:

Swagger2Knife4jConfig 配置放在了 springboot-app 启动项目里,而 tiger-web 和 tiger-web2 这两个子项目有自己的 Controller。这种情况下,Swagger 可能无法正确扫描 tiger-web 和 tiger-web2 里的接口。你可以尝试以下几种方式来正确配置 Swagger(Knife4j)

确保 tiger-web 和 tiger-web2 里的 Controller 加上 @Api

例如:

复制代码
package com.zz.web.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "测试接口")
@RestController
@RequestMapping("/test")
public class TestController {

    @ApiOperation(value = "获取测试信息")
    @GetMapping("/info")
    public String getInfo() {
        return "Hello Swagger!";
    }
}
这样,Swagger 就能扫描到 tiger-web 和 tiger-web2 里的接口了。

方案 1:修改 Swagger2Knife4jConfig,支持多个模块

  1. 修改 Swagger2Knife4jConfig,扫描所有子模块 @ComponentScan(basePackages = {"com.zz.web", "com.zz.web2"}) // 扫描 web 和 web2 模块

你需要确保 Swagger2Knife4jConfig 能扫描 tiger-web 和 tiger-web2 里的 Controller。可以使用 @ComponentScan,或者修改 Docket 里的 basePackage。

复制代码
package com.zz.app.config;

import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ComponentScan;
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.EnableSwagger2WebMvc;

import java.util.Collections;

@Configuration
@EnableSwagger2WebMvc
@ComponentScan(basePackages = {"com.zz.web", "com.zz.web2"}) // 扫描 web 和 web2 模块
public class Swagger2Knife4jConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .protocols(Collections.singleton("https"))
                .host("https://www.tiger.com")
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) // 只扫描有 @Api 注解的 Controller
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("tiger-api文档")
                .description("springboot项目")
                .contact(new Contact("tiger", "https://tiger", "[email protected]"))
                .termsOfServiceUrl("https://www.tiger.com/api")
                .version("1.0")
                .build();
    }
}

方案 2:在每个子模块 (tiger-web 和 tiger-web2) 里单独配置 Swagger

如果 tiger-web 和 tiger-web2 是独立的服务(分别启动),你可以在 tiger-web 和 tiger-web2 里分别配置 Swagger,而不是放到 springboot-app 里。

在 tiger-web 里新建 Swagger2Knife4jConfig.java

复制代码
package com.zz.web.config;

import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.EnableSwagger2WebMvc;

@Configuration
@EnableSwagger2WebMvc
public class Swagger2Knife4jConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.zz.*.controller")) // 仅扫描 web 模块的 Controller
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("tiger-web API 文档")
                .description("tiger-web 模块接口文档")
                .contact(new Contact("tiger", "https://tiger", "[email protected]"))
                .version("1.0")
                .build();
    }
}

然后,在 tiger-web2 里也创建一个类似的 Swagger2Knife4jConfig.java,修改 basePackage 为 com.zz.web2.controller。

方案 3:使用 @Import 让 springboot-app 统一加载多个模块的 Swagger 配置

你可以把 Swagger2Knife4jConfig 移动到 tiger-config 里,然后在 springboot-app 里用 @Import 引入。

在 tiger-config 里新建 Swagger2Knife4jConfig.java

复制代码
package com.zz.config;

import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.EnableSwagger2WebMvc;

@Configuration
@EnableSwagger2WebMvc
public class Swagger2Knife4jConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) 
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("统一 API 文档")
                .description("springboot-app 统一 API")
                .contact(new Contact("tiger", "https://tiger", "[email protected]"))
                .version("1.0")
                .build();
    }
}

在 springboot-app 里引入 Swagger2Knife4jConfig

复制代码
package com.zz.app;

import com.zz.config.Swagger2Knife4jConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

@SpringBootApplication
@Import(Swagger2Knife4jConfig.class)
public class SpringbootAppApplication {

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

这样,springboot-app 启动后,Swagger 也能扫描 tiger-web 和 tiger-web2 里的 Controller 了。

结论

如果 tiger-web 和 tiger-web2 是 独立的服务,建议 方案 2,每个模块独立配置 Swagger。如果 springboot-app 统一启动所有模块,建议 方案 1 或 方案 3

子模块过多可以设置分组

通过 groupName 在 Docket 配置中进行区分。因为你的 tiger-web 和 tiger-web2 都有 Controller,可以在 Swagger2Knife4jConfig 里为每个子项目单独创建 Docket,分别设置不同的 groupName。

复制代码
package com.zz.app.swaggerConfig;

import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
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.EnableSwagger2WebMvc;

import java.util.Collections;

/**
 * Knife4j配置类
 *
 * @author tiger
 */
@Configuration
@EnableSwagger2WebMvc
@ComponentScan(basePackages = {"com.zz.*"}) // 注意必须加: 扫描 web 和 web2 模块
public class Swagger2Knife4jConfig {

    @Bean
    public Docket webApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("tiger-web")  // 分组名称
                .protocols(Collections.singleton("https"))
                .host("https://www.tiger.com")
                .apiInfo(apiInfo("tiger-web API文档"))
                .select()
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .apis(RequestHandlerSelectors.basePackage("com.zz.web.controller")) // 修改为实际的controller包路径
                .paths(PathSelectors.any())
                .build();
    }

    @Bean
    public Docket web2Api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("tiger-web2")  // 分组名称
                .protocols(Collections.singleton("https"))
                .host("https://www.tiger.com")
                .apiInfo(apiInfo("tiger-web2 API文档"))
                .select()
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                .apis(RequestHandlerSelectors.basePackage("com.zz.web2.controller")) // 修改为实际的controller包路径
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo(String title) {
        return new ApiInfoBuilder()
                .title(title)
                .description("springboot项目")
                .contact(new Contact("tiger", "https://tiger", "[email protected]"))
                .termsOfServiceUrl("https://www.tiger.com/api")
                .version("1.0")
                .build();
    }
}
相关推荐
星沁城1 小时前
236. 二叉树的最近公共祖先
java·数据结构·leetcode·二叉树
oliveira-time2 小时前
Java 1.8(也称为Java 8)
java·开发语言
极小狐4 小时前
如何使用极狐GitLab 软件包仓库功能托管 maven?
java·运维·数据库·安全·c#·gitlab·maven
.生产的驴4 小时前
SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
java·spring boot·redis·分布式·后端·爬虫·tomcat
野犬寒鸦5 小时前
MySQL索引使用规则详解:从设计到优化的完整指南
java·数据库·后端·sql·mysql
思考的橙子5 小时前
Springboot之会话技术
java·spring boot·后端
钰爱&6 小时前
【Linux】POSIX 线程信号量与互斥锁▲
java·开发语言·jvm
yt948326 小时前
Matlab实现绘制任意自由曲线
开发语言·matlab
黑匣子~7 小时前
java集成telegram机器人
java·python·机器人·telegram
oioihoii8 小时前
C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)
开发语言·c++·c++23