范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java中让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中新增如下引用依赖:     com.github.xiaoymin     knife4j-spring-ui     2.0.4 
  启动进程后,访问 doc.html 页面,比如 http://127.0.0.1:8088/doc.html,可以发现一个更加符合接口文档体验的新的界面:
  当然,这里我们使用了knife4j最简单的一个"换肤"的特性,而作为一款优秀的开源工具,knife4j所提供的能力远不止这些,有兴趣的可以点击此处详细了解一下。总结
  好啦,关于如何补全Swagger接口的描述内容、如何自主决定某些内容的显示与隐藏等相关的内容,这里就给大家分享到这里啦。关于本篇内容你有什么自己的想法或独到见解么?

清纯女神刘诗诗34岁身价十亿,背后的男人功不可没01hr刘诗诗1987年3月10日出生于北京市,是著名西河大鼓表演艺术家刘田利的孙女。原名刘诗施,大三的时候平江锁金导演给她取的艺名。刘诗诗出生在一个回族家庭。父母都曾是工厂的工人华为食堂曝光,想把员工当猪养来源乔诺之声作者乔诺咨询据华为人讲述,有一段时间,华为的海外员工舍不得吃。因为公司的伙食补贴都是直接打到工资里,大家想多攒点钱回来买房子,没有把这笔补贴用来改善伙食。事情终于传到了iPhone取卡针60元,iPhone抛光布145元,网友苹果从不坑穷人在苹果的秋季发布会之后最受人们关注的大概就是售价145元的天价抛光布了。这款抛光布产品信息显示为这款抛光布质地柔软,可安全有效地清洁各款Apple显示屏,包括Nanotexture山东一萌宝耍赖爸爸一招让他害羞,网友都是过来的还治不了你导语萌宝躺在地上耍赖,爸爸一招让孩子害羞捂脸,网友看到以后忍不住调侃都是这么过来的,难道爸爸还治不了你吗?近日,在山东青岛,一位爸爸带着儿子一起出来逛商场,谁知道走在路上的时候儿子南方三口之家3菜1汤晚餐,晒圈火了,网友过家常日子不要假精致俗话说,民以食为天,没有什么事情是比吃饱喝足更重要了。对于普通的三口之家来说,早餐吃得匆忙,午餐在外面解决,晚餐就不能将就了。作为上班族,虽然下班后也很累,但也要精心准备好一家三口苹果第四财季营收833。6亿美元不及预期,盘后股价转跌北京时间10月29日消息,苹果公司今日发布了2021财年第四财季业绩。报告显示,公司第四财季销售833。6亿美元,同比增长29,低于市场预期的851美元净利润为205。51亿美元,小米超过苹果!成为全球手机销量第二名,小米12爆料配超大镜头哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您小米正在不断壮大,这家公司最近超过苹果,成为2021年第二季度全球智能手机出货量的第二名,紧随三星之后,所以所有人的目光都转向北京冬奥会场馆全面完工10月28日,作为北京市冬奥工程建设的收官之作,承担着北京冬奥会冬残奥会闭幕式任务的国家体育场鸟巢改造工程完工。至此,北京2022年冬奥会北京及延庆赛区场馆和配套基础设施全面完工。一位军嫂的试管婴儿之路佚名三剑客今天题图大唐三剑客有阳光就就风雨。有幸福就会有苦难。这位军嫂的境遇让我们感到难过。但她的坚强和执着也令人敬佩。希望她能扛过所有的苦难,历经风雨花开遍地。如果有了好消息,也CBA3消息李楠甩锅,国产后卫群崛起,林书豪百发百中李楠甩锅27日晚,江苏男篮迎战北京首钢,比赛结果正如球迷们的意料,江苏男篮又输球了。联赛打了5轮,江苏男篮几乎是人见人欺,仅在23日对阵同是鱼腩的天津男篮身上拿到了一场艰难的胜利。队友犯错,怒砸篮球发泄!这样的易建联,你见过吗?太罕见了啊这是昨晚广东击败深圳队,比赛中的一幕第三节还剩8分50秒,深圳队进攻打成,广东落后。阿联这时拿球准备快发,打出熟悉的快攻。周鹏,徐杰,阿联三人在沟通时出现了问题,导致发球的阿联,违
无论腌什么酸菜,牢记2做2不碰,酸菜不烂不臭,酸香脆爽颜色金黄每年的冬季,农村老家几乎家家都要腌酸菜,腌好后还要拿出来互相赠送一点,目的是尝尝各自的成果,评说一下谁家的酸菜腌的酸,谁家的又很脆,互相取经弥补不足。而且选材不同,一些农村常见的芥拒绝大爆冷!国乒男单41击败印度选手进决赛,功勋教练挥舞双臂北京时间12月8日,国际乒联世青赛正在进行。目前,正在进行的是男单半决赛,国乒选手向鹏,曾蓓勋两人均成功晋级男单四强。今年世青赛对参赛名额有所限制,每个协会单打最多两人参赛。这样的到老挝旅游,给当地美女200块人民币会发生啥?就怕玩到走不了到老挝旅行,在当地花费200元能享受哪些服务呢?老挝导游表示,就怕你玩到不想走,接下来我们就来了解一下老挝的旅游花销。(此处已添加小程序,请到今日头条客户端查看)众所周知,现在出国我国最悲壮的大桥,火车经过必须鸣笛30秒,只为祭奠这位英雄我国的旅游资源非常丰富,尤其是我国的西北西南地区,虽然经济没有东部发达,但是却藏着非常美的景色,尤其是云南,云贵地区多山,地形非常的复杂,也因此造就了非常多的美景,大理丽江香格里拉为什么很多人经常睡到半夜就醒?学会这几个方法,让你拥有好睡眠很多人会被各种睡眠问题所困扰,比如失眠多梦嗜睡经常半夜就醒等,而长期的睡眠不足,睡眠质量差,不仅损害身体健康,还可能诱发其他疾病。根据2021运动与睡眠白皮书显示,中国约有3亿人存早晨起来喝水相当于喝细菌?医生其实大家都误解了一个您身边懂医的朋友让健康变得更简单每天1200无论你在哪里,请记得打开手机今天在刷手机,看到这样一篇文章早起喝水,相当于喝细菌,这是真的吗?对于汪护士毕竟在医院上班肯定能分清真伪一个人的奥林匹克你的抵制,我不关心对奥运会的第一印象,是1992年的巴塞罗那奥运会,记忆中那时候家里有了彩色电视机,也能够看到更多的比赛直播了,感觉这一切变化也和90年的北京亚运会有很大的关系,生活水平的上升,百姓闲聊我姓房,黄浦区两套房的房脱口秀大会看到第四季,仔细回味,印象最深的还是第三季的何广智,出场时李诞介绍他在线下已经讲了一年多,但是在线上表演还是第一次。初出场的何广智,一眼看过去,纯真朴实中似乎还带着点土,女明星军装大比拼?忍住鞠婧祎躲过赵丽颖,看到宋轶帅一脸女明星军装大比拼?忍住鞠婧祎躲过赵丽颖,看到宋轶帅一脸。很多人对于学生时代应该是最怀念的,毕竟那时候的自己真的只要做世界上最简单的事情。说道学生时代我想让大家印象最深刻的应该是大家还记得还珠格格里的小鸽子吗?6岁入行,13岁隐退,31岁说起童星,大家想到的可能都是当红明星张一山杨紫或者关晓彤这些人,可以说是大家看着长大的一批国民儿女。他们如今站在舞台上,依旧那么多人喜爱,获得普遍大众的支持。其中最最大的改变那必然知网的霸道该改改了文易之一直被诟病垄断经营连年涨价的知网,又站上了舆论的风口浪尖。拿我的知识去赚钱,89岁的中南财经政法大学退休教授赵德馨,前段时间和知网打起了官司。他起诉知网擅自收录他的100多篇