JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容
大家好,又见面啦。
在前一篇文档《JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率》中,我们探讨了如何通过自定义注解的方式扩展swagger的能力让Swagger支持自动从指定的枚举类生成接口文档中的字段描述的实现思路。
其实swagger作为一个被广泛使用的在线接口文档辅助工具,上手会用很容易,但想用好却还是需要一定功夫的。所以呢,本篇文档就和大家一起来聊一聊如何用好swagger,让其真正的成为我们项目交付过程中的神兵利器。
更改接口文档总标题与描述
默认的情况下,Swagger的界面整个文档的名称以及描述内容都是通用值,这会让人拿到文档之后比较困惑,无法知晓这是哪个项目哪个系统哪个服务提供的接口,也不知道接口是哪个团队负责,哪位开发人员维护的。
比如下面这样:
为了体现出接口文档的专业性,让人更容易知晓此接口文档所属系统
、对应版本
、维护团队
等信息,我们可以在代码中根据需要自定义相关的内容。
比如:
@Bean
public Docket createRestApi() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("资源管理系统接口文档")
.description("资源管理模块对外供APP/WEB端调用的接口详细文档描述")
.version("v1.0.0")
.contact(new Contact("架构悟道", "https://juejin.cn/user/1028798616709294","veezean@outlook.com"))
.termsOfServiceUrl("https://juejin.cn/user/1028798616709294")
.license("Apache License")
.licenseUrl("http://xxx")
.build();
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo).select().build();
}
重新启动并查看界面,可以发现界面上相关内容已经变更为我们自定义的内容了,是不是比改动前显得更加明晰与专业了?
上述swagger中支持自定义的描述性的字段信息,梳理如下:
字段 | 含义描述 |
---|---|
title | 接口文档的文档标题 |
description | 接口文档的详细整体描述 说明 |
version | 接口文档对应的版本 信息 |
termsOfServiceUrl | 此接口文档的提供团队对应的团队url 地址 |
contact | 负责此部分接口的联系人信息,包含姓名 、邮箱 、主页url 地址等 |
license | 指定接口所遵循的License协议 版本 |
licenseUrl | 此接口所遵循的License协议对应的详细介绍url地址 |
按需显示/隐藏相关接口内容
手动编写接口文档的时候,我们可以根据实际情况灵活的去控制需要写入到文档中的接口内容、以及接口的请求响应体中的字段信息 —— 因为并不是系统中提供的所有的接口都需要体现在接口文档中暴露给调用方去知晓的,比如有一些系统状态监控类的接口,只需要内部使用即可。
对于Swagger而言,生成接口文档的时候,默认是扫描所有的@Controller
中的全部接口方法全部显示到文档中,但其也贴心地考虑到了实际应用中的这种按需隐藏或者展示接口内容的诉求,并提供了多种不同的方式来支持。
下面一起来看下。
针对单个接口进行隐藏
在单个接口方法的上方添加 @ApiOperation
注解说明,并指定 hidden = true
即可将该接口从swagger界面能上隐藏:
@GetMapping("/test")
@ApiOperation(value = "内部测试接口", hidden = true)
public String test() {
return "OK";
}
启动进程,查看Swagger界面,发现该接口没有出现在界面上:
隐藏整个Controller类中的接口
如果整个Controller
类下面所有的接口都需要隐藏,则可以在Conntroller类上添加上@ApiIgnore
注解可以了。
@RestController
@RequestMapping("/test")
@ApiIgnore
public class TestController {
// ... ignore ...
}
改动后重启进程,再打开swagger界面,发现TestController
整个类的接口都没有显示。
这里补充一句,因为用于描述Controller类的接口含义的注解@Api
中也有个hidden
属性,而且看其源码注释说明,如果设置hidden=true
,应该也是将该Controller类整体隐藏。但是实际上测试发现并没有生效,这个实际使用的时候要小心这一点(基于swagger 2.7.0
版本试验,不确定是否为BUG)。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Api {
/**
* Hides the operations under this resource.
*
* @return true if the api should be hidden from the swagger documentation
*/
boolean hidden() default false;
}
仅显示指定package路径下的接口
我们的项目里面经常会依赖或者引用一些三方jar包,而这些三方jar中有的时候也会提供一些接口,也会出现在我们的接口文档中,这样就会显得接口文档中存在很多不确定的内容。
比如:
因为这部分逻辑并非业务代码中提供的,所以我们没法按照上面的方式,修改源码添加hidden=true
的方式来控制其不显示。这个时候,就需要按照package
进行白名单控制的能力了。swagger还支持根据给定的basePackage
以及paths
进行组合控制,仅显示给定包下指定路径下的接口。
@Bean
public Docket createRestApi() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("资源管理系统接口文档")
.description("资源管理模块对外供APP/WEB端调用的接口详细文档描述")
.version("v1.0.0")
.build();
ApiSelectorBuilder selectorBuilder = (new Docket(DocumentationType.SWAGGER_2)).apiInfo(apiInfo).select();
selectorBuilder.apis(RequestHandlerSelectors.basePackage("com.jiagouwudao.resmanage"));
selectorBuilder.paths(PathSelectors.any());
return selectorBuilder.build();
}
这样就可以保证出现在接口文档里面的都是我们自己定义的接口了。重新启动并刷新界面,会发现,只有指定package目录下的Controller接口显示在swagger界面上了。
隐藏响应中不愿暴露的属性
在项目开发过程中,如果我们的代码没有做强制的VO
、DO
隔断,出于减少编码量考虑,可能会使用同一个对象进行内部处理以及外部交互。比如:
定义一个OperateLog对象,为数据库中T_OPERATE_LOG表所对应的实体类,用于记录每个用户的操作行为;同时也作为recordOperateLog接口的请求Body体,用于传递需要记录的用户操作信息。
在上面的例子中:
- 作为数据表实体类进行逻辑处理的时候,需要用到唯一主键id信息
- 作为
recordOperateLog
接口的请求Body体时,调用方是不需要指定这条记录的ID值的(ID值会在存储到DB的时候自动由DB生成唯一自增主键)
这种场景下,我们就希望提供出去的接口文档中,在对recordOperateLog
接口的请求body体中字段说明的时候,就不要体现出id
字段,避免让调用方产生疑惑,不知道id调用的时候应该如何赋值。我们可以通过在指定字段上添加@ApiModelProperty
注解并指定hidden = true
来将其从接口文档中隐藏掉。
比如:
@Data
@ApiModel("操作记录信息")
public class OperateLog {
@ApiModelProperty(value = "记录唯一ID,无实际意义", hidden = true)
private long id;
@ApiModelProperty("操作类型,取值说明: 1,新增;2,更新;3,删除;4,查询")
private int operateType;
@ApiModelProperty("操作用户")
private String user;
@ApiModelProperty(value = "操作详情")
private String detail;
}
则界面中的接口文档不会显示id的有关信息(注意:仅接口文档中不体现,不会影响具体请求或者响应中此字段的实际值)。
关闭生产环境的swagger
考虑到生产环境的安全性,对于一些比较重要的系统,我们一般不太愿意将生产环境的接口文档暴露出来,避免对系统的运行埋下隐患。
在SpringBoot项目中,我们会为不同的环境提供不同的配置文件, 然后在启动的时候使用 --spring.active.profile
来指定加载哪一份配置。
如果需要使Swagger可以被访问,我们可以通过代码中添加@EnableSwagger2注解的方式来实现。若限制仅在开发或测试环境上允许swagger访问而生产环境不允许打开,则只需要让这个添加了@EnableSwagger2
注解的类根据当前的运行环境来决定是否加载就可以了。借助SpringBoot提供的@Profile
注解,我们可以这样来实现:
@Configuration
@EnableSwagger2
@Profile({"DEV", "TEST"})
public class SwaggerConfig {
}
这样,就可以让SwaggerConfig
类在profile=PROD的
时候不会被加载,也就不会开启swagger的开关。使用 --spring.active.profile=PROD
启动进程,尝试访问swagger界面,会发现无法打开:
给Swagger换个皮肤
默认的swagger界面所有内容都罗列居中显示,然后需要一层层的展开去,操作上面不太方便,整体界面风格也不太符合一个“文档”的样子。为了提升使用体验,可以借助开源的knife4j
框架来让swagger变得更加好用。
使用方式很简单,在已有的swagger依赖的基础上,在pom.xml
中新增如下引用依赖:
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>2.0.4</version>
</dependency>
启动进程后,访问 doc.html
页面,比如 http://127.0.0.1:8088/doc.html,可以发现一个更加符合接口文档体验的新的界面:
当然,这里我们使用了knife4j
最简单的一个“换肤”的特性,而作为一款优秀的开源工具,knife4j所提供的能力远不止这些,有兴趣的可以点击此处详细了解一下。
总结
好啦,关于如何补全Swagger接口的描述内容、如何自主决定某些内容的显示与隐藏等相关的内容,这里就给大家分享到这里啦。关于本篇内容你有什么自己的想法或独到见解么?欢迎在评论区一起交流探讨下吧。
另外:
- 关于本文中涉及的演示代码的完整示例,我已经整理并提交到github中,如果您有需要,可以自取:https://github.com/veezean/JavaBasicSkills
我是悟道,聊技术、又不仅仅聊技术~
如果觉得有用,请点赞 + 关注让我感受到您的支持。也可以关注下我的公众号【架构悟道】,获取更及时的更新。
期待与你一起探讨,一起成长为更好的自己。
JAVA中让Swagger产出更加符合我们诉求的描述文档,按需决定显示或者隐藏指定内容的更多相关文章
- 在.net core web api项目中安装swagger展示api接口(相当于生成api文档)
1, 建立或打开项目后,在“程序包管理器控制台”中执行以下命令添加包引用: Install-Package Swashbuckle.AspNetCore 2,在项目中打开Startup.cs文件,找 ...
- 求你别再用swagger了,给你推荐几个在线文档生成神器
前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在线文档 支持全文搜索 支持在线调试功能 界面优美 说实话,这个需求看起来简 ...
- flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8
flexpaper上传带中文名字的文档,在页面显示若出现404错误时,请在server.xml文件中进行编码utf-8
- 在 jQuery 中使用滑入滑出动画效果,实现二级下拉导航菜单的显示与隐藏效果
查看本章节 查看作业目录 需求说明: 在 jQuery 中使用滑入滑出动画效果,实现二级下拉导航菜单的显示与隐藏效果 用户将光标移动到"最新动态页"或"帮助查询" ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...
- 使用swagger作为restful api的doc文档生成——从源码中去提取restful URL接口描述文档
初衷 记得以前写接口,写完后会整理一份API接口文档,而文档的格式如果没有具体要求的话,最终展示的文档则完全决定于开发者的心情.也许多点,也许少点.甚至,接口总是需要适应新需求的,修改了,增加了,这份 ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制
Swashbuckle.AspNetCore3.0 介绍 一个使用 ASP.NET Core 构建的 API 的 Swagger 工具.直接从您的路由,控制器和模型生成漂亮的 API 文档,包括用于探 ...
随机推荐
- zabbix监控mysql主从同步
获取主从复制sql线程和I/O线程状态是否为yes #!/bin/bash HOSTNAME="数据库IP" PORT="端口" USERNAME=" ...
- Entry键值对对象和Map集合遍历键值对方式
我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在IMap 中是一一对应关系, 这一对对象又称做Map 中的一个Entry(项).Entry将键值对的对应 ...
- LDAP+Gitea统一认证Git服务器账户管理openLdap和微软的ad
很多时候我们需要管理多个内容管理系统,比如Jira.Jenkins.GitEA/Gitlab等等各种管理系统,我们需要每一套管理系统每个人都管理一套密码,每套系统每套密码简直是一种灾难,于是LDAP可 ...
- redis 集群 slots are covered by nodes.
原因数据数据损坏.需要修复 1.检测 redis-cli --cluster check 127.0.0.1:7000 2.检测结果 slots are covered by nodes3.进行修复 ...
- CF1705A Mark the Photographer 题解
题意: 给定一队人的身高,将其分成两队,问能否实现前面的人均低于后面的人至少 \(x\) 个单位长度. 做法: 将这队人的身高进行排序,\(h_1 \sim h_n\) 即为第一队,\(h_{n+1} ...
- mysql8.0二进制安装遇到的问题
公司新项目需要用CentOS8.0以上的系统和mysql8.0:于是在虚拟机上开始操作测试: 一实验环境 1.系统版本:CentOS8.32.数据库版本:mysql-8.0.233.数据库下载链接:h ...
- 2022-7-18 第五组 pan 面向对象
面向过程 向过程就是:面向过程,其实就是面向着具体的每一个步骤和过程,把每一个步骤和过程完成,然后由这些功能方法相互调用,完成需求. 面向对象 什么是面向对象: 面向对象思想就是不断的创建对象,使用对 ...
- 序列化和返序列化的概述和对象的序列化流ObjectOutputStream
序列化和返序列化的概述 对象的序列化流ObjectOutputStream Person类: package com.yang.Test.ObjectStreamStudy; import java. ...
- 主线程和创建多线程程序的第一种方式_创建Thread类的子类
/** * 主线程:执行主方法的线程(main) * 单线程程序:在java程序中只有一个线程 * 执行从main方法开始,从上倒下依次执行 */ public class Demo01MainThr ...
- python jinjia2 使用语法
简介 对于jinjia2来说,模板仅仅是文本文件,可以生成任何基于文本的文件格式,例如HTML.XML.CSV.LaTex 等等,以下是基础的模板内容: <!DOCTYPE html> & ...