SpringBoot整合OpenApi的實踐
網(wǎng)上經(jīng)??梢钥吹絆penAPI和Swagger相關(guān)的詞匯,總是傻傻分不清,這里先簡單介紹一下Swagger個OpenAPI的聯(lián)系。
OpenAPI是規(guī)范;Swagger是實現(xiàn)規(guī)范的工具。
OpenAPI 3.0是該規(guī)范的第一個正式版本,因為它是由SmartBear Software捐贈給OpenAPI Initiative,并在2015年從Swagger規(guī)范重命名為OpenAPI規(guī)范。
OpenAPI是規(guī)范的正式名稱。該規(guī)范的開發(fā)是由OpenAPI Initiative推動的,該倡議涉及更多來自技術(shù)領(lǐng)域不同領(lǐng)域的30個組織-包括Microsoft,Google,IBM和CapitalOne。
領(lǐng)導(dǎo)Swagger工具開發(fā)的公司Smartbear Software也是OpenAPI Initiative的成員,幫助領(lǐng)導(dǎo)了規(guī)范的發(fā)展。
SpringBoot整合OpenApi
確保SpringBoot版本在2.x級以上。
OpenAPI依賴
引入OpenApi依賴
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
編寫配置類
編寫配置類,并手動裝配@EnableOpenApi
@EnableOpenApi
@Configuration
public class OpenApiConfiguration {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(apis())
.paths(PathSelectors.any())
.build()
.enable(true);
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("項目名稱")
.description("項目描述")
.termsOfServiceUrl("項目地址")
.version("API版本")
.license("公司的license")
.licenseUrl("公司的license地址")
.build();
}
private Predicate<RequestHandler> apis() {
return RequestHandlerSelectors.basePackage("controller包的路徑");
}
}
到這里SpringBoot就整合OpenAPI成功了。需要一提的是,OpenAPI不僅可以通過掃描controller包的路徑生成OpenAPI,也可以通過掃描@ApiOperation來生成OpenAPI。
改造優(yōu)化
上面的示例通過硬編碼的形式,所以無法進行代碼的復(fù)用,而且每次更新配置的時候,都需要更改代碼,比如我們的項目在開發(fā)或者測試環(huán)境時,我們希望能正常使用OpenAPI但是在生產(chǎn)環(huán)境需要禁用OpenAPI。
在工程學(xué)的角度,常用的做法是盡量通過更改配置的形式,問不是更改代碼。基于此,我們可以借助SpringBoot的配置功能,對上述代碼進行改造。
新增OpenApi配置類
@Data
@Component
@ConfigurationProperties(prefix = "example.web.swagger")
public class SwaggerProperties {
/**
* 是否swagger3啟用,默認不啟用
*/
private Boolean enable = false;
/**
* 掃描包路徑,可以不指定,系統(tǒng)會通過自動掃描{@link io.swagger.annotations.ApiOperation}
*/
private String basePackage;
/**
* 標題
*/
private String title;
/**
* 應(yīng)用描述
*/
private String description;
/**
* 服務(wù)地址
*/
private String serviceUrl;
/**
* 版本,默認V1.0.0
*/
private String version = "V1.0.0";
/**
* license
*/
private String license;
/**
* licenseUrl
*/
private String licenseUrl;
}
配置替換硬編碼
@Slf4j
@Configuration
@EnableOpenApi
public class OpenApiConfiguration {
@Resource
private SwaggerProperties swaggerProperties;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
.apis(apis())
.paths(PathSelectors.any())
.build()
.enable(isEnable());
}
private Boolean isEnable() {
Boolean enable = swaggerProperties.getEnable();
if (enable) {
log.info("\nEnable Swagger3...");
}
return enable;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.termsOfServiceUrl(swaggerProperties.getServiceUrl())
.version(swaggerProperties.getVersion())
.license(swaggerProperties.getLicense())
.licenseUrl(swaggerProperties.getLicenseUrl())
.build();
}
private Predicate<RequestHandler> apis() {
String basePackage = swaggerProperties.getBasePackage();
// 默認通過掃描`ApiOperation`如果配置了包掃描路徑,使用配置的包掃描路徑
return Strings.isNullOrEmpty(basePackage) ? withMethodAnnotation(ApiOperation.class) : basePackage(basePackage);
}
}
通過這樣的簡單改造后,我們就可以完全通過配置文件的形式配置OpenApi
示例配置
example:
web:
swagger:
enable: true
title: 演示OpenAPI
description: 演示OpenAPI
base-package: com.example.controller
OpenAPI常用注解介紹
這里通過使用代碼演示注解的使用
實體類
需要在用戶的VO實體類標注@ApiModel并說明該類的作用, 屬性上通過@ApiModelProperty解析屬性的作用,并通過required值約定該屬性是否可以為空 可以通過example說明該屬性的用例值
@Data
@ApiModel("用戶信息")
public class UserVO {
@ApiModelProperty(value = "用戶id", required = true, example = "asdf124")
private String userId;
@ApiModelProperty(value = "用戶名稱", required = true)
private String username;
@ApiModelProperty(value = "用戶年齡")
private Integer age;
}
controller類
這里主要通過用戶注冊和用戶信息接口演示。
在配上通過@Api標注該類的功能;通過@ApiOperation說明接口的功能,如果傳入的數(shù)據(jù)不是實體類,而是一個基本數(shù)據(jù)類型,可以通過@ApiParam解釋參數(shù)的作用
@RequestMapping("user")
@RestController
@Api(tags = "用戶中心")
public class UserController {
@ApiOperation("用戶注冊")
@PostMapping
public R<Void> register(@RequestBody UserVO userVO) {
// todo
return R.ok();
}
@ApiOperation("通過Id獲取用戶信息")
@GetMapping
public R<UserVO> userInfo(@ApiParam(value = "用戶id",required = true) @RequestParam String userId) {
// todo
return R.ok(new UserVO());
}
}
演示
啟動項目,通過訪問IP:PORT/swagger-ui/index.html即可看到swagger界面

到此這篇關(guān)于SpringBoot整合OpenApi的實踐的文章就介紹到這了,更多相關(guān)SpringBoot整合OpenApi內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
減小Maven項目生成的JAR包體積實現(xiàn)提升運維效率
在Maven構(gòu)建Java項目過程中,減小JAR包體積可通過排除不必要的依賴和使依賴jar包獨立于應(yīng)用jar包來實現(xiàn),在pom.xml文件中使用<exclusions>標簽排除不需要的依賴,有助于顯著降低JAR包大小,此外,將依賴打包到應(yīng)用外,可減少應(yīng)用包的體積2024-10-10
springboot aspect通過@annotation進行攔截的實例代碼詳解
這篇文章主要介紹了springboot aspect通過@annotation進行攔截的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
SpringBoot中的yaml語法及靜態(tài)資源訪問問題
這篇文章主要介紹了SpringBoot中的yaml語法及靜態(tài)資源訪問問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07
詳解Spring boot+CXF開發(fā)WebService Demo
這篇文章主要介紹了詳解Spring boot+CXF開發(fā)WebService Demo,非常具有實用價值,需要的朋友可以參考下2017-05-05
Java代理模式之靜態(tài)代理與動態(tài)代理的區(qū)別及優(yōu)缺點
代理模式是一種常用的設(shè)計模式,它允許通過引入一個代理對象來控制對目標對象的訪問,在Java中,代理模式被廣泛應(yīng)用,它可以提供額外的功能,如權(quán)限檢查、緩存、日志記錄等,本文將介紹靜態(tài)代理與動態(tài)代理的區(qū)別及優(yōu)缺點,需要的朋友可以參考下2023-06-06
Java springboot 配置文件與多環(huán)境配置與運行優(yōu)先級
這篇文章主要介紹了Java springboot如何配置文件,進行多環(huán)境配置,以及運行優(yōu)先級,感興趣的小伙伴可以借鑒一下2023-04-04

