SpringBoot如何優(yōu)雅的整合Swagger Api自動(dòng)生成文檔
前言
一個(gè)好的可持續(xù)交付的項(xiàng)目,項(xiàng)目說(shuō)明,和接口文檔是必不可少的,swagger api 就可以幫我們很容易自動(dòng)生成api 文檔,不需要單獨(dú)額外的去寫(xiě),無(wú)侵入式,方便快捷大大減少前后端的溝通方便查找和測(cè)試接口提高團(tuán)隊(duì)的開(kāi)發(fā)效率方便新人了解項(xiàng)目,剩余的時(shí)間就可以去約妹子啦
整合swagger api
這里我們自己去整合swagger api比較麻煩,要導(dǎo)入好幾個(gè)包,有大神幫我們寫(xiě)好了輪子kinfe4j直接對(duì)應(yīng)SpringBoot的啟動(dòng)項(xiàng),而且在不影響原來(lái)使用功能上界面ui做了美化功能做了增強(qiáng) 我們直接整合這個(gè)就好了
<!--api 文檔--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.1</version> </dependency>
正如官網(wǎng)所說(shuō)
自定義配置信息
為我們?yōu)閟wagger配置更多的接口說(shuō)明
package cn.soboys.core.config; import cn.hutool.core.collection.CollUtil; import cn.soboys.core.ret.ResultCode; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.ResponseBuilder; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Response; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; /** * @author kenx * @version 1.0 * @date 2021/6/21 16:02 * api 配置類(lèi) */ @Configuration public class SwaggerConfigure { @Resource private SwaggerProperty swaggerProperty; /** * 構(gòu)造api 文檔 * @return */ @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30).globalResponses(HttpMethod.POST, this.responseList()) //全局respons信息 .apiInfo(apiInfo(swaggerProperty)) //文檔信息 .select() //文檔掃描 //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) //有ApiOperation注解的controller都加入api文檔 .apis(RequestHandlerSelectors.basePackage(swaggerProperty.getBasePackage())) //包模式 .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo(SwaggerProperty swagger) { return new ApiInfoBuilder() //標(biāo)題 .title(swagger.getTitle()) //描述 .description(swagger.getDescription()) //創(chuàng)建聯(lián)系人信息 (作者,郵箱,網(wǎng)站) .contact(new Contact(swagger.getAuthor(), swagger.getUrl(), swagger.getEmail())) //版本 .version(swagger.getVersion()) //認(rèn)證 .license(swagger.getLicense()) //認(rèn)證協(xié)議 .licenseUrl(swagger.getLicenseUrl()) .build(); } /** * 全局response 返回信息 * @return */ private List<Response> responseList() { List<Response> responseList = CollUtil.newArrayList(); Arrays.stream(ResultCode.values()).forEach(errorEnum -> { responseList.add( new ResponseBuilder().code(errorEnum.getCode().toString()).description(errorEnum.getMessage()).build() ); }); return responseList; } }
抽出api文檔配置模版信息為屬性文件方便復(fù)用
package cn.soboys.core.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringBootConfiguration; /** * @author kenx * @version 1.0 * @date 2021/6/21 16:01 * api 文檔信息 */ @Data @SpringBootConfiguration public class SwaggerProperty { /** * 需要生成api文檔的 類(lèi) */ @Value("${swagger.basePackage}") private String basePackage; /** * api文檔 標(biāo)題 */ @Value("${swagger.title}") private String title; /** * api文檔 描述 */ @Value("${swagger.description}") private String description; /** * api文檔 版本 */ @Value("${swagger.version}") private String version; /** * api 文檔作者 */ @Value("${swagger.author}") private String author; /** * api 文檔作者網(wǎng)站 */ @Value("${swagger.url}") private String url; /** * api文檔作者郵箱 */ @Value("${swagger.email}") private String email; /** * api 文檔 認(rèn)證協(xié)議 */ @Value("${swagger.license}") private String license; /** * api 文檔 認(rèn)證 地址 */ @Value("${swagger.licenseUrl}") private String licenseUrl; }
簡(jiǎn)單使用
在你的Controller上添加swagger注解
@Slf4j @Api(tags = "登錄") public class LoginController { private final IUsersService userService; @PostMapping("/login") @ApiOperation("用戶登錄") public String login(@RequestBody UserLoginParams userLoginParams) { Users u = userService.login(userLoginParams); return "ok"; } }
注意如啟用了訪問(wèn)權(quán)限,還需將swagger相關(guān)uri允許匿名訪問(wèn)
/swagger**/** /webjars/** /v3/** /doc.html
重啟服務(wù),自帶api文檔訪問(wèn)鏈接為/doc.html界面如下:
相比較原來(lái)界面UI更加漂亮了,信息更完善功能更強(qiáng)大
Swagger常用注解
Api標(biāo)記
用在請(qǐng)求的類(lèi)上,表示對(duì)類(lèi)的說(shuō)明,也代表了這個(gè)類(lèi)是swagger2的資源
參數(shù):
- tags:說(shuō)明該類(lèi)的作用,參數(shù)是個(gè)數(shù)組,可以填多個(gè)。
- value="該參數(shù)沒(méi)什么意義,在UI界面上不顯示,所以不用配置"
- description = "用戶基本信息操作"
ApiOperation標(biāo)記
用于請(qǐng)求的方法上表示一個(gè)http請(qǐng)求的操作
參數(shù):
- value用于方法描述
- notes用于提示內(nèi)容
- tags可以重新分組(視情況而用)
ApiParam標(biāo)記
用于請(qǐng)求方法上對(duì)請(qǐng)求參數(shù),字段說(shuō)明;表示對(duì)參數(shù)的添加元數(shù)據(jù)(說(shuō)明或是否必填等)
參數(shù):
- name–參數(shù)名
- value–參數(shù)說(shuō)明
- required–是否必填
ApiModel標(biāo)記
用于java實(shí)體類(lèi)上表示對(duì)類(lèi)進(jìn)行說(shuō)明,用于參數(shù)用實(shí)體類(lèi)接收
參數(shù):
- value–表示對(duì)象名
- description–描述
都可省略
ApiModelProperty標(biāo)記
用于方法,字段; 表示對(duì)model屬性的說(shuō)明或者數(shù)據(jù)操作更改
參數(shù):
- value–字段說(shuō)明
- name–重寫(xiě)屬性名字
- dataType–重寫(xiě)屬性類(lèi)型
- required–是否必填
- example–舉例說(shuō)明
- hidden–隱藏
@ApiModel(value="user對(duì)象",description="用戶對(duì)象user") public class User implements Serializable{ private static final long serialVersionUID = 1L; @ApiModelProperty(value="用戶名",name="username",example="xingguo") private String username; @ApiModelProperty(value="狀態(tài)",name="state",required=true) private Integer state; private String password; private String nickName; private Integer isDeleted; @ApiModelProperty(value="id數(shù)組",hidden=true) private String[] ids; private List<String> idList; //省略get/set }
ApiIgnore標(biāo)記
用于請(qǐng)求類(lèi)或者方法上,可以不被swagger顯示在頁(yè)面上
ApiImplicitParam標(biāo)記
用于方法表示單獨(dú)的請(qǐng)求參數(shù)
ApiImplicitParams標(biāo)記
用于方法,包含多個(gè) @ApiImplicitParam
參數(shù):
- name–參數(shù)名
- value–參數(shù)說(shuō)明
- dataType–數(shù)據(jù)類(lèi)型
- paramType–參數(shù)類(lèi)型
- example–舉例說(shuō)明
@ApiOperation("查詢測(cè)試") @GetMapping("select") //@ApiImplicitParam(name="name",value="用戶名",dataType="String", paramType = "query") @ApiImplicitParams({ @ApiImplicitParam(name="name",value="用戶名",dataType="string", paramType = "query",example="xingguo"), @ApiImplicitParam(name="id",value="用戶id",dataType="long", paramType = "query")}) public void select(){ }
總結(jié)
- 可以給實(shí)體類(lèi)和接口添加注釋信息
- 接口文檔實(shí)時(shí)更新
- 在線測(cè)試
- kinfe4j 在swagger API只做增強(qiáng),不會(huì)改變?cè)腥魏问褂?,更多增加使用功?br />
點(diǎn)擊這里進(jìn)入kinfe4j官網(wǎng)文檔
到此這篇關(guān)于SpringBoot如何優(yōu)雅的整合Swagger Api自動(dòng)生成文檔的文章就介紹到這了,更多相關(guān)SpringBoot整合Swagger Api內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis注解動(dòng)態(tài)sql注入map和list方式(防sql注入攻擊)
這篇文章主要介紹了mybatis注解動(dòng)態(tài)sql注入map和list方式(防sql注入攻擊),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-11-11jdk中密鑰和證書(shū)管理工具keytool常用命令詳解
keytool JAVA是個(gè)密鑰和證書(shū)管理工具。它使用戶能夠管理自己的公鑰/私鑰對(duì)及相關(guān)證書(shū),用于(通過(guò)數(shù)字簽名)自我認(rèn)證(用戶向別的用戶/服務(wù)認(rèn)證自己)或數(shù)據(jù)完整性以及認(rèn)證服務(wù)2014-01-01lombok?子類(lèi)中如何使用@Builder問(wèn)題
這篇文章主要介紹了lombok?子類(lèi)中如何使用@Builder問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09java學(xué)習(xí)筆記_關(guān)于字符串概述
下面小編就為大家?guī)?lái)一篇java學(xué)習(xí)筆記_關(guān)于字符串概述。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05使用SpringBoot+Prometheus+Grafana實(shí)現(xiàn)可視化監(jiān)控
本文主要給大家介紹了如何使用Spring?actuator+監(jiān)控組件prometheus+數(shù)據(jù)可視化組件grafana來(lái)實(shí)現(xiàn)對(duì)Spring?Boot應(yīng)用的可視化監(jiān)控,文中有詳細(xì)的代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-02-02Spring Boot配置攔截器及實(shí)現(xiàn)跨域訪問(wèn)的方法
這篇文章主要介紹了Spring Boot配置攔截器及實(shí)現(xiàn)跨域訪問(wèn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12springboot根據(jù)實(shí)體類(lèi)生成表的實(shí)現(xiàn)方法
本文介紹了如何通過(guò)SpringBoot工程引入SpringDataJPA,并通過(guò)實(shí)體類(lèi)自動(dòng)生成數(shù)據(jù)庫(kù)表的過(guò)程,包括常見(jiàn)問(wèn)題解決方法,感興趣的可以了解一下2024-09-09