当前位置:   article > 正文

SpringBoot——SpringBoot生成接口文档

springboot生成接口文档

摘要

SpringBoot开发Restful接口,有什么API规范吗?如何快速生成API文档呢?Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。本文主要介绍OpenAPI规范,以及Swagger技术栈基于OpenAPI规范的集成方案。

一、OpenAPI规范(OAS)

OpenAPI规范(OAS)定义了一个标准的、语言无关的 RESTful API 接口规范,它可以同时允许开发人员和操作系统查看并理解某个服务的功能,而无需访问源代码,文档或网络流量检查(既方便人类学习和阅读,也方便机器阅读)。正确定义 OAS 后,开发者可以使用最少的实现逻辑来理解远程服务并与之交互。

此外,文档生成工具可以使用 OpenAPI 规范来生成 API 文档,代码生成工具可以生成各种编程语言下的服务端和客户端代码,测试代码和其他用例。官方GitHub地址: OpenAPI-Specification在新窗口打开

1.1 Swagger 文档

Swagger 是一个用于生成、描述和调用 RESTful 接口的 Web 服务。通俗的来讲,Swagger 就是将项目中所有(想要暴露的)接口展现在页面上,并且可以进行接口调用和测试的服务。

从上述 Swagger 定义我们不难看出 Swagger 有以下 3 个重要的作用:

  • 将项目中所有的接口展现在页面上,这样后端程序员就不需要专门为前端使用者编写专门的接口文档;
  • 当接口更新之后,只需要修改代码中的 Swagger 描述就可以实时生成新的接口文档了,从而规避了接口文档老旧不能使用的问题;
  • 通过 Swagger 页面,我们可以直接进行接口调用,降低了项目开发阶段的调试成本。

Swagger3完全遵循了 OpenAPI 规范。Swagger 官网地址:https://swagger.io/在新窗口打开

Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则是这项技术的具体实现。 就好比 Spring 中的 IOC 和 DI 的关系 一样,前者是思想,而后者是实现。

1.2 Knife4J 文档

本质是Swagger的增强解决方案,前身只是一个SwaggerUI(swagger-bootstrap-ui)

Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!

Knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码+前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j

更名后主要专注的方面

  • 前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活
  • 提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分。

二、SpringBoot接口文档实战

2.1 Swagger3配置

2.1.1 POM 文件

根据上文介绍,我们引入springfox依赖包,最新的是3.x.x版本。和之前的版本比,只需要引入如下的starter包即可。

  1. <dependency>
  2. <groupId>io.springfox</groupId>
  3. <artifactId>springfox-boot-starter</artifactId>
  4. <version>3.0.0</version>
  5. </dependency>

2.1.2 Swagger Config

我们在配置中还增加了一些全局的配置,比如全局参数等

  1. package com.zhuangxiaoyan.springboot.swagger.config;
  2. import io.swagger.annotations.ApiOperation;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.http.HttpMethod;
  6. import springfox.documentation.builders.*;
  7. import springfox.documentation.oas.annotations.EnableOpenApi;
  8. import springfox.documentation.schema.ScalarType;
  9. import springfox.documentation.service.*;
  10. import springfox.documentation.spi.DocumentationType;
  11. import springfox.documentation.spring.web.plugins.Docket;
  12. import tech.pdai.springboot.swagger.constant.ResponseStatus;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.stream.Collectors;
  16. /**
  17. * swagger config for open api.
  18. *
  19. * @author xjl
  20. */
  21. @Configuration
  22. @EnableOpenApi
  23. public class SwaggerConfig {
  24. /**
  25. * @return swagger config
  26. */
  27. @Bean
  28. public Docket openApi() {
  29. return new Docket(DocumentationType.OAS_30)
  30. .groupName("Test group")
  31. .apiInfo(apiInfo())
  32. .select()
  33. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  34. .paths(PathSelectors.any())
  35. .build()
  36. .globalRequestParameters(getGlobalRequestParameters())
  37. .globalResponses(HttpMethod.GET, getGlobalResponse());
  38. }
  39. /**
  40. * @return global response code->description
  41. */
  42. private List<Response> getGlobalResponse() {
  43. return ResponseStatus.HTTP_STATUS_ALL.stream().map(
  44. a -> new ResponseBuilder().code(a.getResponseCode()).description(a.getDescription()).build())
  45. .collect(Collectors.toList());
  46. }
  47. /**
  48. * @return global request parameters
  49. */
  50. private List<RequestParameter> getGlobalRequestParameters() {
  51. List<RequestParameter> parameters = new ArrayList<>();
  52. parameters.add(new RequestParameterBuilder()
  53. .name("AppKey")
  54. .description("App Key")
  55. .required(false)
  56. .in(ParameterType.QUERY)
  57. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  58. .required(false)
  59. .build());
  60. return parameters;
  61. }
  62. /**
  63. * @return api info
  64. */
  65. private ApiInfo apiInfo() {
  66. return new ApiInfoBuilder()
  67. .title("Swagger API")
  68. .description("test api")
  69. .contact(new Contact("pdai", "http://pdai.tech", "suzhou.daipeng@gmail.com"))
  70. .termsOfServiceUrl("http://xxxxxx.com/")
  71. .version("1.0")
  72. .build();
  73. }
  74. }

2.1.3 controller接口

  1. package com.zhuangxiaoyan.springboot.swagger.controller;
  2. import io.swagger.annotations.Api;
  3. import io.swagger.annotations.ApiImplicitParam;
  4. import io.swagger.annotations.ApiOperation;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.bind.annotation.*;
  7. import tech.pdai.springboot.swagger.entity.param.UserParam;
  8. import tech.pdai.springboot.swagger.entity.vo.AddressVo;
  9. import tech.pdai.springboot.swagger.entity.vo.UserVo;
  10. import java.util.Collections;
  11. import java.util.List;
  12. /**
  13. * @author xjl
  14. */
  15. @Api
  16. @RestController
  17. @RequestMapping("/user")
  18. public class UserController {
  19. /**
  20. * http://localhost:8080/user/add .
  21. *
  22. * @param userParam user param
  23. * @return user
  24. */
  25. @ApiOperation("Add User")
  26. @PostMapping("add")
  27. @ApiImplicitParam(name = "userParam", type = "body", dataTypeClass = UserParam.class, required = true)
  28. public ResponseEntity<String> add(@RequestBody UserParam userParam) {
  29. return ResponseEntity.ok("success");
  30. }
  31. /**
  32. * http://localhost:8080/user/list .
  33. *
  34. * @return user list
  35. */
  36. @ApiOperation("Query User List")
  37. @GetMapping("list")
  38. public ResponseEntity<List<UserVo>> list() {
  39. List<UserVo> userVoList = Collections.singletonList(UserVo.builder().name("dai").age(18)
  40. .address(AddressVo.builder().city("SZ").zipcode("10001").build()).build());
  41. return ResponseEntity.ok(userVoList);
  42. }
  43. }

2.1.4 运行测试

2.2 Knife4J配置

这里展示目前使用Java生成接口文档的最佳实现: SwaggerV3(OpenAPI)+ Knife4J。

2.2.1 POM文件

  1. <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter -->
  2. <dependency>
  3. <groupId>com.github.xiaoymin</groupId>
  4. <artifactId>knife4j-spring-boot-starter</artifactId>
  5. <version>3.0.3</version>
  6. </dependency>

2.2.2 yml配置

  1. server:
  2. port: 8080
  3. knife4j:
  4. enable: true
  5. documents:
  6. - group: Test Group
  7. name: My Documents
  8. locations: classpath:wiki/*
  9. setting:
  10. # default lang
  11. language: en-US
  12. # footer
  13. enableFooter: false
  14. enableFooterCustom: true
  15. footerCustomContent: MIT | zhuangxiaoyan
  16. # header
  17. enableHomeCustom: true
  18. homeCustomLocation: classpath:wiki/README.md
  19. # models
  20. enableSwaggerModels: true
  21. swaggerModelName: My Models

2.2.3 注入配置

  1. package com.zhuangxiaoyan.springboot.knife4j.config;
  2. import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
  3. import io.swagger.annotations.ApiOperation;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.http.HttpMethod;
  8. import springfox.documentation.builders.*;
  9. import springfox.documentation.oas.annotations.EnableOpenApi;
  10. import springfox.documentation.schema.ScalarType;
  11. import springfox.documentation.service.*;
  12. import springfox.documentation.spi.DocumentationType;
  13. import springfox.documentation.spring.web.plugins.Docket;
  14. import tech.pdai.springboot.knife4j.constant.ResponseStatus;
  15. import java.util.ArrayList;
  16. import java.util.List;
  17. import java.util.stream.Collectors;
  18. /**
  19. * swagger config for open api.
  20. *
  21. * @author xjl
  22. */
  23. @Configuration
  24. @EnableOpenApi
  25. public class OpenApiConfig {
  26. /**
  27. * open api extension by knife4j.
  28. */
  29. private final OpenApiExtensionResolver openApiExtensionResolver;
  30. @Autowired
  31. public OpenApiConfig(OpenApiExtensionResolver openApiExtensionResolver) {
  32. this.openApiExtensionResolver = openApiExtensionResolver;
  33. }
  34. /**
  35. * @return swagger config
  36. */
  37. @Bean
  38. public Docket openApi() {
  39. String groupName = "Test Group";
  40. return new Docket(DocumentationType.OAS_30)
  41. .groupName(groupName)
  42. .apiInfo(apiInfo())
  43. .select()
  44. .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  45. .paths(PathSelectors.any())
  46. .build()
  47. .globalRequestParameters(getGlobalRequestParameters())
  48. .globalResponses(HttpMethod.GET, getGlobalResponse())
  49. .extensions(openApiExtensionResolver.buildExtensions(groupName))
  50. .extensions(openApiExtensionResolver.buildSettingExtensions());
  51. }
  52. /**
  53. * @return global response code->description
  54. */
  55. private List<Response> getGlobalResponse() {
  56. return ResponseStatus.HTTP_STATUS_ALL.stream().map(
  57. a -> new ResponseBuilder().code(a.getResponseCode()).description(a.getDescription()).build())
  58. .collect(Collectors.toList());
  59. }
  60. /**
  61. * @return global request parameters
  62. */
  63. private List<RequestParameter> getGlobalRequestParameters() {
  64. List<RequestParameter> parameters = new ArrayList<>();
  65. parameters.add(new RequestParameterBuilder()
  66. .name("AppKey")
  67. .description("App Key")
  68. .required(false)
  69. .in(ParameterType.QUERY)
  70. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  71. .required(false)
  72. .build());
  73. return parameters;
  74. }
  75. /**
  76. * @return api info
  77. */
  78. private ApiInfo apiInfo() {
  79. return new ApiInfoBuilder()
  80. .title("My API")
  81. .description("test api")
  82. .contact(new Contact("pdai", "http://xjl.tech", "suzhou.daipeng@gmail.com"))
  83. .termsOfServiceUrl("http://xxxxxx.com/")
  84. .version("1.0")
  85. .build();
  86. }
  87. }

2.2.4 ResponseStatus封装

  1. package com.zhaungxiaoyan.springboot.knife4j.constant;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Getter;
  4. import java.util.Arrays;
  5. import java.util.Collections;
  6. import java.util.List;
  7. /**
  8. * @author xjl
  9. */
  10. @Getter
  11. @AllArgsConstructor
  12. public enum ResponseStatus {
  13. SUCCESS("200", "success"),
  14. FAIL("500", "failed"),
  15. HTTP_STATUS_200("200", "ok"),
  16. HTTP_STATUS_400("400", "request error"),
  17. HTTP_STATUS_401("401", "no authentication"),
  18. HTTP_STATUS_403("403", "no authorities"),
  19. HTTP_STATUS_500("500", "server error");
  20. public static final List<ResponseStatus> HTTP_STATUS_ALL = Collections.unmodifiableList(
  21. Arrays.asList(HTTP_STATUS_200, HTTP_STATUS_400, HTTP_STATUS_401, HTTP_STATUS_403, HTTP_STATUS_500
  22. ));
  23. /**
  24. * response code
  25. */
  26. private final String responseCode;
  27. /**
  28. * description.
  29. */
  30. private final String description;
  31. }

2.2.5 Controller接口

  1. package com.zhuangxiaoyan.springboot.knife4j.controller;
  2. import io.swagger.annotations.Api;
  3. import io.swagger.annotations.ApiImplicitParam;
  4. import io.swagger.annotations.ApiImplicitParams;
  5. import io.swagger.annotations.ApiOperation;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RestController;
  10. import tech.pdai.springboot.knife4j.entity.param.AddressParam;
  11. /**
  12. * Address controller test demo.
  13. *
  14. * @author xjl
  15. */
  16. @Api(value = "Address Interfaces", tags = "Address Interfaces")
  17. @RestController
  18. @RequestMapping("/address")
  19. public class AddressController {
  20. /**
  21. * http://localhost:8080/address/add .
  22. *
  23. * @param addressParam param
  24. * @return address
  25. */
  26. @ApiOperation("Add Address")
  27. @PostMapping("add")
  28. @ApiImplicitParams({
  29. @ApiImplicitParam(name = "city", type = "query", dataTypeClass = String.class, required = true),
  30. @ApiImplicitParam(name = "zipcode", type = "query", dataTypeClass = String.class, required = true)
  31. })
  32. public ResponseEntity<String> add(AddressParam addressParam) {
  33. return ResponseEntity.ok("success");
  34. }
  35. }

2.2.6 运行测试

三、SpringBoot接口文档Smart-Doc

上文我们看到可以通过Swagger系列可以快速生成API文档, 但是这种API文档生成是需要在接口上添加注解等,这表明这是一种侵入式方式; 那么有没有非侵入式方式呢, 比如通过注释生成文档? 本文主要介绍非侵入式的方式及集成Smart-doc案例。我们构建知识体系时使用Smart-doc这类工具并不是目标,而是要了解非侵入方式能做到什么程度和技术思路, 最后平衡下来多数情况下多数人还是会选择Swagger+openapi技术栈的。

3.1 Smart-Doc背景

既然有了Swagger, 为何还会产生Smart-Doc这类工具呢? 本质上是Swagger侵入性和依赖性。

我们来看下目前主流的技术文档工具存在什么问题:

  1. 侵入性强,需要编写大量注解,代表工具如:swagger,还有一些公司自研的文档工具
  2. 强依赖性,如果项目不想使用该工具,业务代码无法编译通过。
  3. 代码解析能力弱,使用文档不齐全,主要代表为国内众多开源的相关工具。
  4. 众多基于注释分析的工具无法解析jar包里面的注释(sources jar包),需要人工配置源码路径,无法满足DevOps构建场景。
  5. 部分工具无法支持多模块复杂项目代码分析。

3.2 Smart-Doc的特征

smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中。你只需要按照java-doc标准编写注释, smart-doc就能帮你生成一个简易明了的Markdown、HTML5、Postman Collection2.0+、OpenAPI 3.0+的文档。

  • 零注解、零学习成本、只需要写标准JAVA注释。
  • 基于源代码接口定义自动推导,强大的返回结构推导。
  • 支持Spring MVC、Spring Boot、Spring Boot Web Flux(controller书写方式)、Feign。
  • 支持Callable、Future、CompletableFuture等异步接口返回的推导。
  • 支持JavaBean上的JSR303参数校验规范,包括分组验证。
  • 对JSON请求参数的接口能够自动生成模拟JSON参数。
  • 对一些常用字段定义能够生成有效的模拟值。
  • 支持生成JSON返回值示例。
  • 支持从项目外部加载源代码来生成字段注释(包括标准规范发布的jar包)。
  • 支持生成多种格式文档:Markdown、HTML5、Asciidoctor、Postman Collection、OpenAPI 3.0。 Up- 开放文档数据,可自由实现接入文档管理系统。
  • 支持导出错误码和定义在代码中的各种字典码到接口文档。
  • 支持Maven、Gradle插件式轻松集成。
  • 支持Apache Dubbo RPC接口文档生成。
  • debug接口调试html5页面完全支持文件上传,下载(@download tag标记下载方法)测试。

3.3 Smart-Doc的实战

添加maven的插件

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. <plugin>
  8. <groupId>com.github.shalousun</groupId>
  9. <artifactId>smart-doc-maven-plugin</artifactId>
  10. <version>2.4.8</version>
  11. <configuration>
  12. <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
  13. <configFile>./src/main/resources/smart-doc.json</configFile>
  14. <!--指定项目名称,推荐使用动态参数,例如${project.description}-->
  15. <!--如果smart-doc.json中和此处都未设置projectName,2.3.4开始,插件自动采用pom中的projectName作为设置-->
  16. <!--<projectName>${project.description}</projectName>-->
  17. <!--smart-doc实现自动分析依赖树加载第三方依赖的源码,如果一些框架依赖库加载不到导致报错,这时请使用excludes排除掉-->
  18. <excludes>
  19. <!--格式为:groupId:artifactId;参考如下-->
  20. <!--也可以支持正则式如:com.alibaba:.* -->
  21. <exclude>com.alibaba:fastjson</exclude>
  22. </excludes>
  23. <!--includes配置用于配置加载外部依赖源码,配置后插件会按照配置项加载外部源代码而不是自动加载所有,因此使用时需要注意-->
  24. <!--smart-doc能自动分析依赖树加载所有依赖源码,原则上会影响文档构建效率,因此你可以使用includes来让插件加载你配置的组件-->
  25. <includes>
  26. <!--格式为:groupId:artifactId;参考如下-->
  27. <!--也可以支持正则式如:com.alibaba:.* -->
  28. <include>com.alibaba:fastjson</include>
  29. </includes>
  30. </configuration>
  31. <executions>
  32. <execution>
  33. <!--如果不需要在执行编译时启动smart-doc,则将phase注释掉-->
  34. <phase>compile</phase>
  35. <goals>
  36. <!--smart-doc提供了html、openapi、markdown等goal,可按需配置-->
  37. <goal>html</goal>
  38. </goals>
  39. </execution>
  40. </executions>
  41. </plugin>
  42. </plugins>
  43. </build>

其中./src/main/resources/smart-doc.json是配置文件。

  1. {
  2. "serverUrl": "http://127.0.0.1", //服务器地址,非必须。导出postman建议设置成http://{{server}}方便直接在postman直接设置环境变量
  3. "pathPrefix": "", //设置path前缀,非必须。如配置Servlet ContextPath 。@since 2.2.3
  4. "isStrict": false, //是否开启严格模式
  5. "allInOne": true, //是否将文档合并到一个文件中,一般推荐为true
  6. "outPath": "D://md2", //指定文档的输出路径
  7. "coverOld": true, //是否覆盖旧的文件,主要用于markdown文件覆盖
  8. "createDebugPage": true,//@since 2.0.0 smart-doc支持创建可以测试的html页面,仅在AllInOne模式中起作用。
  9. "packageFilters": "",//controller包过滤,多个包用英文逗号隔开,2.2.2开始需要采用正则:com.test.controller.*
  10. "md5EncryptedHtmlName": false,//只有每个controller生成一个html文件时才使用
  11. "style":"xt256", //基于highlight.js的代码高设置,可选值很多可查看码云wiki,喜欢配色统一简洁的同学可以不设置
  12. "projectName": "pdai-springboot-demo-smart-doc",//配置自己的项目名称,不设置则插件自动获取pom中的projectName
  13. "skipTransientField": true,//目前未实现
  14. "sortByTitle":false,//接口标题排序,默认为false,@since 1.8.7版本开始
  15. "showAuthor":true,//是否显示接口作者名称,默认是true,不想显示可关闭
  16. "requestFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  17. "responseFieldToUnderline":true,//自动将驼峰入参字段在文档中转为下划线格式,//@since 1.8.7版本开始
  18. "inlineEnum":true,//设置为true会将枚举详情展示到参数表中,默认关闭,//@since 1.8.8版本开始
  19. "recursionLimit":7,//设置允许递归执行的次数用于避免一些对象解析卡主,默认是7,正常为3次以内,//@since 1.8.8版本开始
  20. "allInOneDocFileName":"index.html",//自定义设置输出文档名称, @since 1.9.0
  21. "requestExample":"true",//是否将请求示例展示在文档中,默认true,@since 1.9.0
  22. "responseExample":"true",//是否将响应示例展示在文档中,默认为true,@since 1.9.0
  23. "ignoreRequestParams":[ //忽略请求参数对象,把不想生成文档的参数对象屏蔽掉,@since 1.9.2
  24. "org.springframework.ui.ModelMap"
  25. ],
  26. "dataDictionaries": [{ //配置数据字典,没有需求可以不设置
  27. "title": "http状态码字典", //数据字典的名称
  28. "enumClassName": "tech.pdai.springboot.smartdoc.constant.ResponseStatus", //数据字典枚举类名称
  29. "codeField": "responseCode",//数据字典字典码对应的字段名称
  30. "descField": "description"//数据字典对象的描述信息字典
  31. }],
  32. "errorCodeDictionaries": [{ //错误码列表,没有需求可以不设置
  33. "title": "title",
  34. "enumClassName": "tech.pdai.springboot.smartdoc.constant.ResponseStatus", //错误码枚举类
  35. "codeField": "responseCode",//错误码的code码字段名称
  36. "descField": "description"//错误码的描述信息对应的字段名
  37. }],
  38. "revisionLogs": [{ //文档变更记录,非必须
  39. "version": "1.1", //文档版本号
  40. "revisionTime": "2022-07-01 22:12:01", //文档修订时间
  41. "status": "update", //变更操作状态,一般为:创建、更新等
  42. "author": "pdai", //文档变更作者
  43. "remarks": "init user api" //变更描述
  44. },{ //文档变更记录,非必须
  45. "version": "1.2", //文档版本号
  46. "revisionTime": "2022-07-01 22:12:02", //文档修订时间
  47. "status": "update", //变更操作状态,一般为:创建、更新等
  48. "author": "pdai", //文档变更作者
  49. "remarks": "add address api" //变更描述
  50. }
  51. ],
  52. "customResponseFields": [{ //自定义添加字段和注释,一般用户处理第三方jar包库,非必须
  53. "name": "code",//覆盖响应码字段
  54. "desc": "响应代码",//覆盖响应码的字段注释
  55. "ownerClassName": "org.springframework.data.domain.Pageable", //指定你要添加注释的类名
  56. "ignore":true, //设置true会被自动忽略掉不会出现在文档中
  57. "value": "00000"//设置响应码的值
  58. }],
  59. "requestHeaders": [{ //设置请求头,没有需求可以不设置
  60. "name": "token",//请求头名称
  61. "type": "string",//请求头类型
  62. "desc": "desc",//请求头描述信息
  63. "value":"token请求头的值",//不设置默认null
  64. "required": false,//是否必须
  65. "since": "-",//什么版本添加的改请求头
  66. "pathPatterns": "/app/test/**",//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
  67. "excludePathPatterns":"/app/page/**"//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求头高级配置?sort_id=4178978
  68. },{
  69. "name": "appkey",//请求头
  70. "type": "string",//请求头类型
  71. "desc": "desc",//请求头描述信息
  72. "value":"appkey请求头的值",//不设置默认null
  73. "required": false,//是否必须
  74. "pathPatterns": "/test/add,/testConstants/1.0",//正则表达式过滤请求头,url匹配上才会添加该请求头,多个正则用分号隔开
  75. "since": "-"//什么版本添加的改请求头
  76. }],
  77. "requestParams": [ //设置公共参数,没有需求可以不设置
  78. {
  79. "name": "configPathParam",//请求名称
  80. "type": "string",//请求类型
  81. "desc": "desc",//请求描述信息
  82. "paramIn": "path", // 参数所在位置 header-请求头, path-路径参数, query-参数
  83. "value":"testPath",//不设置默认null
  84. "required": false,//是否必须
  85. "since": "2.2.3",//什么版本添加的该请求
  86. "pathPatterns": "/app/test/**",//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求高级配置?sort_id=4178978
  87. "excludePathPatterns":"/app/page/**"//请看https://gitee.com/smart-doc-team/smart-doc/wikis/请求高级配置?sort_id=4178978
  88. }],
  89. "responseBodyAdvice":{ //自smart-doc 1.9.8起,非必须项,ResponseBodyAdvice统一返回设置(不要随便配置根据项目的技术来配置),可用ignoreResponseBodyAdvice tag来忽略
  90. "className":"tech.pdai.springboot.smartdoc.entity.ResponseResult" //通用响应体
  91. }
  92. }

可以通过Maven命令生成文档

  1. //生成html
  2. mvn -Dfile.encoding=UTF-8 smart-doc:html

在IDEA中,也可以通过maven插件构建

smart-doc 还支持生成如下类型的文档:

  1. //生成markdown
  2. mvn -Dfile.encoding=UTF-8 smart-doc:markdown
  3. //生成adoc
  4. mvn -Dfile.encoding=UTF-8 smart-doc:adoc
  5. //生成postman json数据
  6. mvn -Dfile.encoding=UTF-8 smart-doc:postman
  7. // 生成 Open Api 3.0+, Since smart-doc-maven-plugin 1.1.5
  8. mvn -Dfile.encoding=UTF-8 smart-doc:openapi

博文参考

SpringBoot接口 - 如何生成接口文档之集成Smart-Doc | Java 全栈知识体系

SpringBoot接口 - 如何生成接口文档之Swagger技术栈 | Java 全栈知识体系

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/647754
推荐阅读
相关标签
  

闽ICP备14008679号