百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用smart-doc自动生成接口文档,解放java开发者

bigegpt 2025-02-04 12:50 8 浏览

1、接口文档面对的困境

我工作几年,接口文档用过好几种方式了。从最开始的word文档,到后来的swagger和confluence编写接口文档,再到后来侵入性很小的jApiDoc,最后到现在的smart-doc工具。

对比下他们的优缺点:

方式

好处

缺点

word文档和confluence

有文档留存(好像也不算好处)

费时费力、多人编写不便

swagger

1、不用专门写文档

2、通过连接直接访问

3、在线测试,有点像简化的postman

注释太多,写得想打人

jApiDoc

1、引入jar包,一键生成html接口文档

2、侵入小,添加简单注释就行

1、功能单一,只能接口文档

2、作者好久没有维护了

smart-doc

1、引入maven插件,一键生成HTML接口文档

2、作者很活跃,社区也很活跃,反应问题很快就有新版本解决

3、能生成常用的html,markdown、postman接口文档

4、侵入小,添加简单注释就行

5、适配单服务、微服务等多种环境

1、需要抽两个小时看下官方文档

2、JApiDocs简介

前面我介绍过一种工具,叫做JApiDocs,这个工具我也使用了一段时间,用起来还是不错的,能满足基本要求,文档链接地址

3、前言

被写接口文档难受了好久,使用swagger要加各种稀奇古怪的注释,十分繁琐,突然看到JApiDocs 的介绍,只需要在接口上加上点注释,就能够生成接口文档。突然来了希望,通过看文档自己使用之后,把踩过的坑记录下来

生成的接口文档页面展示:

查询接口

新增接口

? 官方说明文档:

文档内容,说明、使用范文很齐全,特别适合我们使用,我会举个例子,大家如果要使用的话,还是抽一两个小时看看官方文档,会有很大帮助,文档地址如下:

smart-doc官方文档地址:
https://gitee.com/smart-doc-team/smart-doc/wikis/smart-doc%20maven%E6%8F%92%E4%BB%B6?sort_id=1791450

4、快速使用

添加插件


    com.github.shalousun
    smart-doc-maven-plugin
    2.0.8
    
        
        ./src/main/resources/smart-doc.json
        
        测试
        
        
            
          com.alibaba:fastjson
        
        
        
        
            
            com.alibaba:fastjson
        
    
    
        
            
            compile
            
                
                html
            
        
    


在Resources下新增一个接口文档配置文件

看着配置很多,大部分时候我们使用默认配置就行了,并且每个配置作者都给加好了注释,一看就懂了

?文档内容如下

{
  "serverUrl": "http://127.0.0.1:8072/test", //设置服务器地址,非必须
  "isStrict": false, //是否开启严格模式
  "allInOne": true,  //是否将文档合并到一个文件中,一般推荐为true
  "outPath": "src/main/resources/static/doc", //指定文档的输出路径
  "coverOld": true,  //是否覆盖旧的文件,主要用于mardown文件覆盖
  "packageFilters": "",//controller包过滤,多个包用英文逗号隔开
  "style":"xt256", //基于highlight.js的代码高亮设置,喜欢配色统一简洁的同学可以不设置
  "createDebugPage": true,//@since 2.0.0 smart-doc支持创建可以测试的html页面,仅在AllInOne模式中起作用。
  "md5EncryptedHtmlName": false,//只有每个controller生成一个html文件是才使用
  "projectName": "这里修改项目名",//配置自己的项目名称
  "skipTransientField": true,//目前未实现
  "showAuthor":true,//是否显示接口作者名称,默认是true,不想显示可关闭
  "requestFieldToUnderline":false, //自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7 版本开始
  "responseFieldToUnderline":false,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7 版本开始
  "inlineEnum":true,//设置为true会将枚举详情展示到参数表中,默认关闭,//@since 1.8.8版本开始
  "recursionLimit":7,//设置允许递归执行的次数用于避免栈溢出,默认是7,正常为3次以内,//@since 1.8.8版本开始
  "displayActualType":false,//配置true会在注释栏自动显示泛型的真实类型短类名,@since 1.9.6
  "ignoreRequestParams":[ //忽略请求参数对象,把不想生成文档的参数对象屏蔽掉,@since 1.9.2
    "org.springframework.ui.ModelMap"
  ],
  "dataDictionaries": [ //配置数据字典,没有需求可以不设置
    {
      "title": "http状态码字典", //数据字典的名称
      "enumClassName": "com.power.common.enums.HttpCodeEnum", //数据字典枚举类名称
      "codeField": "code",//数据字典字典码对应的字段名称
      "descField": "message"//数据字典对象的描述信息字典
    }
  ],

  "errorCodeDictionaries": [{ //错误码列表,没有需求可以不设置
    "title": "title",
    "enumClassName": "com.power.common.enums.HttpCodeEnum", //错误码枚举类,如果是枚举是在一个类中定义则用$链接类BaseErrorCode$Common
    "codeField": "code",//错误码的code码字段名称
    "descField": "message"//错误码的描述信息对应的字段名
  }],

  "revisionLogs": [ //设置文档变更记录,没有需求可以不设置
    {
      "version": "1.0", //文档版本号
      "status": "update", //变更操作状态,一般为:创建、更新等
      "author": "author", //文档变更作者
      "remarks": "desc" //变更描述
    },
    {
      "version": "1.0", //文档版本号
      "status": "update", //变更操作状态,一般为:创建、更新等
      "author": "author", //文档变更作者
      "remarks": "desc" //变更描述
    }
  ],
  "customResponseFields": [ //自定义添加字段和注释,api-doc后期遇到同名字段则直接给相应字段加注释,非必须
    {
      "name": "code",//覆盖响应码字段
      "desc": "响应代码",//覆盖响应码的字段注释
      "ownerClassName": "org.springframework.data.domain.Pageable", //指定你要添加注释的类名
      "value": "00000"//设置响应码的值
    }
  ],
  "requestHeaders": [ //设置请求头,没有需求可以不设置
    {
      "name": "Authorization",
      "type": "string",
      "desc": "desc",
      "required": false,
      "value":"Bearer ebb616e4-b23f-4b60-b9dc-f8393393bd39",
      "since": "-"
    }
  ],
  "rpcApiDependencies":[{ // 项目开放的dubbo api接口模块依赖,配置后输出到文档方便使用者集成
    "artifactId":"SpringBoot2-Dubbo-Api",
    "groupId":"com.fj",
    "version":"1.0.0"
  }],
  "rpcConsumerConfig":"src/main/resources/consumer-example.conf",//文档中添加dubbo consumer集成配置,用于方便集成方可以快速集成
  "apiObjectReplacements": [{ // 自smart-doc 1.8.5开始你可以使用自定义类覆盖其他类做文档渲染,使用全类名
    "className": "org.springframework.data.domain.Pageable",
    "replacementClassName": "com.power.doc.model.PageRequestDto" //自定义的PageRequestDto替换Pageable做文档渲染
  }]//,
//  "apiConstants": [{//从1.8.9开始配置自己的常量类,smart-doc在解析到常量时自动替换为具体的值,如:http://localhost:8080/testConstants/+ApiVersion.VERSION中的ApiVersion.VERSION会被替换
//    "constantsClassName": "com.power.doc.constants.RequestParamConstant"
//  }],
//  "responseBodyAdvice":{ //自smart-doc 1.9.8起,ResponseBodyAdvice统一返回设置,可用ignoreResponseBodyAdvice tag来忽略
//    "className":"com.fj.utils.BaseResult" //通用响应体
//  }//,
//  "sourceCodePaths": [ //设置代码路径,smart-doc默认会自动加载src/main/java, 没有需求可以不设置 1.0.0以后版本此配置不再生效
//    {
//      "path": "src/main/java",
//      "desc": "测试"
//    }
//  ]
}

在controller上加上对应的注解

只需要表明每个参数的含义,每个方法是干什么的,就能够准确生成接口文档,相比较swagger可是简单多了,然后他有swagger接口测试的替代功能,直接生成能够导入postman的json文件,很方便,后面我会演示。

package com.fj.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fj.entity.User;
import com.fj.service.IUserService;
import com.fj.utils.BaseResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户接口文档
 *
 * @author system
 * @since 2021-01-15
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    public IUserService userService;

    /**
     * 分页查询
     *
     * @param pageNum     页号
     * @param pageSize    页面大小
     * @param searchValue 搜索值
     * @return BaseResult>
     */
    @GetMapping(value = "/getByPage")
    public BaseResult> getByPage(@RequestParam Integer pageNum,
                                            @RequestParam Integer pageSize,
                                            String searchValue) {
        Page userPageResult = userService.getByPage(pageNum, pageSize, searchValue);
        return new BaseResult<>(200, "success", userPageResult.getRecords(), userPageResult.getTotal());
    }

    /**
     * 通过id获取详情
     *
     * @param id 主键id
     * @return BaseResult
     */
    @GetMapping("/getById")
    public BaseResult getById(@RequestParam Integer id) {
        User user = userService.getById(id);
        return new BaseResult<>(200, "success", user);
    }

    /**
     * 更新
     *
     * @param user 实体
     * @return BaseResult
     */
    @PutMapping("/updateById")
    public BaseResult update(@RequestBody User user) {
        userService.updateById(user);
        return BaseResult.ok();
    }

    /**
     * 新增
     *
     * @param user 实体
     * @return BaseResult
     */
    @PostMapping("/add")
    public BaseResult add(@RequestBody User user) {
        userService.add(user);
        return BaseResult.ok();
    }

    /**
     * 通过id删除
     *
     * @param id 主键id
     * @return BaseResult
     */
    @DeleteMapping("/deleteById")
    public BaseResult deleteById(@RequestParam Integer id) {
        userService.removeById(id);
        return BaseResult.ok();
    }

}

注意点1:查询返回类型加上泛型

    /**
     * 分页查询
     *
     * @param pageNum     页号
     * @param pageSize    页面大小
     * @param searchValue 搜索值
     * @return BaseResult>
     */
    @GetMapping(value = "/getByPage")
    public BaseResult> getByPage

注意这里的返回类型是list,所以加上了list的泛型

注意点2:返回实体上加上字段含义

大概就是这样子,现在有很多工具可以生成这种把数据库注释加到代码里面的实体,常见的就是mybatis的generator,还有mybatis-plus的生成实体的方法。

@Data
@EqualsAndHashCode(callSuper = false)
public class User extends Model {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 姓名
     */
    private String name;

    /**
     * 1删除0正常
     */
    private Integer isDelete;
}

这里不加注释也不会报错,只是生成的字段没了注释,看着很尴尬,如下图,createTime没加注释,虽然也没啥问题,但是不够规范。

?通过插件生成接口文档

双击生成HTML文件,当然也可以生成adoc文件和markdown文件

在smart-doc.json中我配置的存储路径是在:
src/main/resources/static/doc

运行成功之后生成接口文档:

访问debug-all.html,大功告成

踩过的坑

1、生成的接口文档没有对实体字段的注释

?解决:官方文档明确说明对所有的controller都要介绍描述注解,这是因为后台接口代码返回的是BaseResult,没有加上泛型

解决方法:修改baseResult,修改泛型就ok了

@Data
public class BaseResult {

    /**
     * 定义jackson对象
     */
    private static final ObjectMapper MAPPER = new ObjectMapper();
    /**
     * 响应业务状态,正常为200
     */
    private Integer status;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应中的数据
     */
    private T data;

    /**
     * 数据总条数
     */
    private Long totalCount;

    private static BaseResult build(Integer status, String msg, Object data) {
        return new BaseResult<>(status, msg, data);
    }

    public static BaseResult ok(Object data) {
        return new BaseResult<>(data);
    }

    public static BaseResult ok() {
        return new BaseResult<>(null);
    }

    public BaseResult() {

    }

    /**
     * @param status 状态
     * @param msg    提示信息
     * @return BaseResult
     */
    public static BaseResult build(Integer status, String msg) {
        return new BaseResult<>(status, msg, null);
    }

    public BaseResult(Integer status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public BaseResult(Integer status, String msg, T data, Long totalCount) {
        this.status = status;
        this.msg = msg;
        this.data = data;
        this.totalCount = totalCount;
    }

    public BaseResult(Integer status, String msg) {
        this.status = status;
        this.msg = msg;
    }

    public BaseResult(T data) {
        this.status = 200;
        this.msg = "success";
        this.data = data;
    }

2、关于参数是否必填坑

必填参数加上@RequestParam注解就行了

    /**
     * 分页查询
     *
     * @param pageNum     页号
     * @param pageSize    页面大小
     * @param searchValue 搜索值
     * @return BaseResult>
     */
    @GetMapping(value = "/getByPage")
    public BaseResult> getByPage(
      																			@RequestParam Integer pageNum,
                                            @RequestParam Integer pageSize,
                                            String searchValue)

生成文档之后是这样的

6、生成postman测试接口文件

生成文件和接口文档是在同一个目录下面

把这个json文件导入到postman

可以看到信息比我们自己写的要完整,还给参数贴心加上了默认值

是不是比swagger用着更爽

强烈推荐大家使用,我们公司通过我的推广,已经用了大半年了,两个字——很爽。

?

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...