【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】

时间:2023-02-09 16:19:51

目前,大多数公司都采用了前后端分离的开发模式,为了解决前后端人员的沟通问题,后端人员在开发接口的时候会选择使用swagger2来生成对应的接口文档,swagger2提供了强大的页面调试功能,这样可以有效解决前后端人员沟通难的问题。

下面我们使用SpringBoot结合swagger2生成Restful API文档。


一 搭建项目,引入依赖

新建一个​​spring-boot-swaager​​的项目,引入swaager2的依赖,由于swagger2的ui不是很美观,这里将使用开源的​​swagger-bootstrap-ui​​做为ui。

引入依赖

<!-- swaager2依赖 -->    
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- swaager2ui -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>

项目中配置swagger相关信息

@Configuration
@EnableSwagger2
public class configuration {

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

private ApiInfo apiInfo(){
return new ApiInfoBuilder()
// 标题
.title("某某项目接口文档")
// 描述
.description("swagger2接口文档使用演示")
// 版本
.version("1.0")
// 许可证
.license("MIT")
// 许可证地址
.licenseUrl("www.xx.com")
// 服务端地址
.termsOfServiceUrl("https://www.cnblogs.com/zhixie/")
// 联系信息
.contact(new Contact("java旅途","https://www.cnblogs.com/zhixie/","binzh303@163.com"))
.build();
}
}

访问路径,查看生成效果

文章中使用的这个ui,接口文档地址为​​ip:port/doc.html​​,生成的文档信息如下:

【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】

二 编写Restful接口

新建实体类


@ApiModel("用户实体类")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty(value = "年龄")
private int age;
}

新建Restful接口

@Api(tags = "用户接口")
@RestController
@RequestMapping("person")
public class PersonController {

@ApiOperation(value = "获取用户列表",notes = "根据name获取用户列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "name",value = "用户姓名",dataType = "String",required = true),
@ApiImplicitParam(name = "age",value = "年龄",dataType = "int",required = true)
})
@GetMapping("/{name}")
public Person getPerson(@PathVariable("name") String name,@RequestParam int age){
return new Person(name,age);
}

@ApiOperation(value = "新增用户",notes = "根据用户实体类新增用户")
@ApiImplicitParam(name = "person",value = "用户实体类",dataType = "Person",required = true)
@PostMapping("add")
public int addPerson(@RequestBody Person person){
if(StringUtils.isEmpty(person)){
return -1;
}
return 1;
}

@ApiOperation(value = "更新用户信息",notes = "根据用户实体更新用户信息")
@ApiImplicitParam(name = "person",value = "用户实体类",dataType = "Person",required = true)
@PutMapping("update")
public int updatePerson(@RequestBody Person person){
if(StringUtils.isEmpty(person)){
return -1;
}
return 1;
}

@ApiOperation(value = "删除用户信息",notes = "根据用户名删除用户信息")
@ApiImplicitParam(name = "name",value = "用户姓名",dataType = "String",required = true)
@DeleteMapping("/{name}")
public int deletePerson(@PathVariable(name = "name") String name){
if(StringUtils.isEmpty(name)){
return -1;
}
return 1;
}
}

三 swagger文档简介

我就直接用图来表示了,这样看着也更加直观

【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】

【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】

swagger2注解对应到文档上的表现形式如上。swagger2支持在线调试,打开某个具体的接口,根据提示填写对应的参数,点击发送就可返回响应结果。


【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】

此是spring-boot-route系列的第五篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。


》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

接下来讲解:

【spring-boot-route(六)整合JApiDocs生成接口文档】

上一篇文章中介绍了使用Swagger生成接口文档,非常方便,功能也十分强大。如果非要说Swaager有什么缺点,想必就是注解写起来比较麻烦。如果我说有一款不用写注解,就可以生成文档的工具,你心动了吗?他就是我们今天的主角——JApiDocs。

下面我们一起来看看如何使用!

一、添加依赖


<dependency>
<groupId>io.github.yedaxia</groupId>
<artifactId>japidocs</artifactId>
<version>1.3</version>
</dependency>

二、配置生成参数

我们新建一个项目,然后随便写一个main方法,增加生成文档的配置,然后运行main方法。


DocsConfig config = new DocsConfig();
config.setProjectPath("F:\\Java旅途\\japi-docs"); // 项目根目录
config.setProjectName("japi-docs"); // 项目名称
config.setApiVersion("V1.0"); // 声明该API的版本
config.setDocsPath("F:\\test"); // 生成API 文档所在目录
config.setAutoGenerate(Boolean.TRUE); // 配置自动生成
Docs.buildHtmlDocs(config); // 执行生成文档

三、编码规范

由于JApiDocs是通过解析Java源码来实现的,因此如果要想实现想要的文档,还是需要遵循一定的规范。

3.1 类注释、方法注释和属性注释

如果我们想生成类的注释,我们可以直接在类上加注释,也可以通过加@description来生成。


/**
* 用户接口类
*/
@RequestMapping("/api/user")
@RestController
public class UserController {}

/**
* @author Java旅途
* @Description 用户接口类
* @Date 2020-06-15 21:46
*/
@RequestMapping("/api/user")
@RestController
public class UserController {}

如果我们想生成方法的注释,只能直接加注释,不能通过加@description来生成。


/**
* 查询用户
* @param age 年龄
* @return R<User>
*/
@GetMapping("/list")
public R<User> list(@RequestParam int age){

User user = new User("Java旅途", 18);
return R.ok(user);
}

JApiDocs可以自动生成实体类,关于实体类属性的注释有三种方式,生成的效果都是一样的,如下:


/**
* 用户名称
*/
private String name;
/**
* 用户年龄
*/
private int age;


// 用户名称
private String name;
// 用户年龄
private int age;


private String name;// 用户名称
private int age;// 用户年龄

他除了支持咱们常用的model外,还支持IOS的model生成效果如下:

【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】


【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】


3.2 请求参数

如果提交的表单是 ​​application/x-www-form-urlencoded​​ 类型的​​key/value​​格式,则我们通过@param注解来获取参数,在参数后面添加注释,示例如下:


/**
* @param age 年龄
*/
@GetMapping("/list")
public R<User> list(@RequestParam int age){
User user = new User("Java旅途", 18);
return R.ok(user);
}

生成的文档效果如下:

请求参数

参数名

类型

必须

描述

age

int


年龄

如果提交的表单是 ​​application/json​​ 类型的​​json​​数据格式,如下:


/**
* @param user
* @return
*/
@PostMapping("/add")
public R<User> add(@RequestBody User user){
return R.ok(user);
}

生成的文档效果如下:

请求参数


{
"name": "string //用户名称",
"age": "int //用户年龄"
}

3.3 响应结果

我们知道,如果​​Controller​​声明了​​@RestController​​,SpringBoot会把返回的对象直接序列成Json数据格式返回给前端。 JApiDocs也利用了这一特性来解析接口返回的结果,但由于JApiDocs是静态解析源码的,因此你要明确指出返回对象的类型信息,JApiDocs支持继承、泛型、循环嵌套等复杂的类解析。

因此我们不需要再写注释,它会根据我们的返回结果进行解析,效果如下:

返回结果:


{
"code": "int",
"msg": "string",
"data": {
"name": "string //用户名称",
"age": "int //用户年龄"
}
}

最终,我们生成的接口文档,如下:

【Spring-boot-route(五)整合Swagger生成接口文档+(六)整合JApiDocs生成接口文档】


四、高级配置

4.1 @ApiDoc

如果你不希望把所有的接口都导出,我们可以在配置中设置config.setAutoGenerate(Boolean.FALSE);然后再想要生成的接口上添加@ApiDoc。

@ApiDoc有以下三个属性:

  • result: 这个可以直接声明返回的对象类型,如果你声明了,将会覆盖SpringBoot的返回对象
  • url: 请求URL,扩展字段,用于支持非SpringBoot项目
  • method: 请求方法,扩展字段,用于支持非SpringBoot项目


@ApiDoc(result = User.class, url = "/api/user/view", method = "post")

4.2 @Ignore

如果你不想导出对象里面的某个字段,可以给这个字段加上​​@Ignore​​注解,这样JApiDocs导出文档的时候就会自动忽略掉了。


public class User {
@Ignore
private int age;
}

五、总结

JApiDocs就介绍到这里了,优势劣势大家很容易就看出来了。几乎不需要注释即可生成接口文档,仅有的几个注释我们也可以通过ide来自动生成。但是JApiDocs不具备Swagger在线调试功能。如果有一天JApiDocs支持在线调试后,那时候肯定会有一大波追随者,毕竟写代码的谁喜欢写多余的注解!