基于SpringBoot3从零配置SpringDoc

为了方便调试,更好的服务于前后端分离式的工作模式,我们给项目引入Swagger。

系列文章指路👉

系列文章-基于SpringBoot3创建项目并配置常用的工具和一些常用的类

1. SpringFox

首先想到的肯定是SpringFox
pom1
引入之后项目启动报错:
java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
err1

  1. github SpringFox已经两年没有更新了。
  2. SpringFox对SpringBoot3.0不适配,要使用必须降低SpringBoot版本,这显然不是我们的风格
    果断弃用。

2. SpringDoc

更新很快,且支持OpenAPI 3、SpringBoot 3。

切换到SpringDoc后有两点不太舒服:

  1. 之前使用SpringFox较多,注解一下全换成SpringDoc风格的不太习惯
  2. MybatisPlus代码机生成实体类暂不支持SpringDoc注解,生成后需要手动添加(随着表的增多和表结构的复杂化,这部分工作量是很大的),希望苞米豆大大们支持一下。

2023-05-10更新: MybatisPlus最新的代码生成器(3.5.3.1)支持了生成SpringDoc注解 🎉

2.1 引入依赖

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.1.0</version>
        </dependency>

2.2 配置文件

@Configuration
public class YaSwaggerConfig {

    private License license() {
        return new License()
                .name("MIT")
                .url("https://opensource.org/licenses/MIT");
    }

    private Info info(){
        return new Info()
                .title("Ya API")
                .description("A test project for Mr.Ya.")
                .version("v1.0.0")
                .license(license());
    }
    private ExternalDocumentation externalDocumentation() {
        return new ExternalDocumentation()
                .description("这是一个额外的描述。")
                .url("https://shijizhe.github.io/");
    }

    @Bean
    public OpenAPI springShopOpenAPI() {
        return new OpenAPI()
                .info(info())
                .externalDocs(externalDocumentation());
    }
}

2.3 语法

SpringFoxSpringDoc
@Api@Tag
@ApiOperation(value = “foo”, notes = “bar”)@Operation(summary = “foo”, description = “bar”)
@ApiParam@Parameter
@ApiResponse(code = 404, message = “foo”)@ApiResponse(responseCode = “404”, description = “foo”)
@ApiModel@Schema
@ApiModelProperty@Schema
@ApiIgnore@Parameter(hidden = true)or@Operation(hidden = true)or@Hidden
@ApiImplicitParam@Parameter
@ApiImplicitParams@Parameters

2.4 使用示例

一些使用示例:

@Tag 用于标识controller

@Tag(name = "FruitController", description = "水果相关接口")
@Slf4j
@RestController
@RequestMapping("/goods/fruit")
public class FruitController {
}

@Operation 用于标识方法

    @PutMapping("/update")
    @Operation(summary = "update", description = "更新水果信息")
    @Parameter(name = "fruit",description = "需要更新的水果")
    public Object update(Fruit fruit) {
        return fruitService.updateById(fruit);
    }

@Schema 用于标识实体类和实体类的属性

@Schema(description = "水果")
public class Fruit implements Serializable {
    private static final long serialVersionUID = 1L;

    @Schema(description = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @Schema(description = "编码")
    private String frCode;
    
    @Schema(description = "名称")
    private String frName;

    @Schema(description = "价格")
    private BigDecimal frPrice;
}

@ApiResponse 用于标识请求的响应

    @GetMapping("/list2")
    @Operation(summary  = "list2", description = "列表查询2")
    @ApiResponse(description = "列表查询用户返回",content = {
            @Content(
                    array= @ArraySchema(schema = @Schema(implementation = YaUser.class))
            )
    })
    public Object list2() {
        // 使用mybatis-plus
        return  yaUserService.list();
    }

@Parameters和@Parameter 用于标识请求参数

@Parameter的name需要和变量的命名一致

    @PutMapping("/update2")
    @Operation(summary = "update2", description = "更新水果信息2")
    @Parameters({
            @Parameter(name = "code",description = "水果编码"),
            @Parameter(name = "name",description = "水果名称"),
            @Parameter(name = "price",description = "水果价格")
    })
    public Object update2( String code, String name, Integer price) {
        UpdateWrapper<Fruit> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
                .eq(Fruit::getFrCode,code)
                .set(Fruit::getFrName,name)
                .set(Fruit::getFrPrice,price);
        return fruitService.update(wrapper);
    }

@Parameter 放到函数形参前面

    @GetMapping("/hello")
    @Operation(summary  = "hello", description = "hello")
    public Object hello(@Parameter(description = "需要打招呼的人",example="xiaoming") String userName) {
        return "hello" + userName;
    }

2.5 使用自带的swagger-ui查看:

http://localhost:8080/swagger-ui/index.html#/
swagger

3. 引入Knife4j

引入Knife4j优化Swagger样式:

3.1 引入依赖

Knife4j提供的starter已经引用springdoc-openapi的jar,应该将SpringDoc的依赖注释掉


<!--       
        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
            <version>2.1.0</version>
        </dependency>-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>

3.2 xml配置

直接使用官网提供的示例即可:

springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.ya.boottest

knife4j:
  enable: true
  setting:
    language: zh_cn

3.3 展示

确实比swagger-ui好用和美观!
在这里插入图片描述

4. 文档分组

  group-configs:
    - group: 'default'
      paths-to-match: '/**'
      packages-to-scan: com.ya.boottest
    - group: 'common'
      paths-to-match: '/common/**'
      packages-to-scan: com.ya.boottest
    - group: 'goods'
      paths-to-match: '/goods/**'
      packages-to-scan: com.ya.boottest

在这里插入图片描述

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
1 Spring基本特征 6 2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化(简单工厂模式) 14 3.3.3初始化(创建)bean时机 15 Lazy-init初始化bean的时机拓展: 15 3.4 Bean的作用域 16 Scope单例多例作用域拓展: 16 3.4.1 singleton(默认值) 16 3.4.2 prototype 17 3.4.3 Request 17 3.4.4 Session 18 3.4.5 Global session 18 3.4.6 指定Bean的初始化方法和销毁方法 18 Bean的初始化和销毁拓展: 18 Spring的IOC总结: 20 3.5 依赖注入(DI) 20 3.5.1 使用构造器注入 20 3.5.2 使用属性setting方法进行注入 21 3.5.3 装配list集合 22 3.5.4 装配set集合 22 3.5.5 装配map 22 3.5.6 装配Properties 23 3.6 注解注入 23 注解注入拓展: 23 3.6.1 @Autowired 26 3.6.2 @Qualifier 27 3.6.3 @Resource 27 3.6.4 @PostConstruct 28 3.6.5 @PreDestroy 28 注解注入拓展: 28 3.7扫描注入 30 注解扫描拓展: 32 Mvc用注解写: 34 Spring容器IOC和di的整个启动过程: 38 3.8 spring中的继承 38 拓展spring为类中的属性赋值: 40 小结: 47 面向接口编程: 47 4 面向切面编程 52 4.1 代理模式 52 代理模式拓展: 52 4.1.1 JDK动态代理 58 JDK动态代理拓展: 59 4.1.2 CGLIB做代理 66 CGLIB动态代理拓展: 68 4.1.3 Spring的动态代理 71 4.2 AOP编程 71 4.2.1概念: 71 SpringAOP概念拓展: 73 之前实现了目标方法的动态调用,现在来实现切面的动态调用。 74 4.2.2 AOP实现的两种模式 78 4.2.2.1 xml形式 78 XML形式拓展: 81 异常通知处理例子: 91 不用spring异常通知,另一种处理异常 96 4.2.2.2Aop注解形式(了解) 99 注解注入拓展: 103 5 Spring数据库 106 5.1 Spring+JDBC 106 5.1.1 Jdbc编程特点 106 5.1.2引入DataSource 106 5.1.3 核心类JdbcTemplate 106 5.1.4 使用JdbcTemplate 106 5.1.5 继承JdbcDaoSupport 107 5.1.6 使用properties文件 107 5.1.7 RowMapper的使用 107 拓展: 108 DataSource注入的三种方式: 108 5.1.8声明式事务管理 116 5.1.8.1Spring的事务管理器 117 5.1.8.2Spring事务的传播属性 117 5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 HibernateTemplate模板 131 5.2.2 声明式事务 131 配置XML文件 131 拓展: 132 注解形式: 137 拓展: 138 6 Struts2+spring+hibernate 141 6.1 需要添加的jar包 141 6.2 Spring融合web服务器 141 6.3 struts.xml文件 143 6.4 OpenInSessionView 143 拓展: 144 实例: 146

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雅痞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值