SpringBoot整合OpenApi的實踐
網上經常可以看到OpenAPI和Swagger相關的詞匯,總是傻傻分不清,這裡先簡單介紹一下Swagger個OpenAPI的聯系。
OpenAPI是規范;Swagger是實現規范的工具。
OpenAPI 3.0是該規范的第一個正式版本,因為它是由SmartBear Software捐贈給OpenAPI Initiative,並在2015年從Swagger規范重命名為OpenAPI規范。
OpenAPI是規范的正式名稱。該規范的開發是由OpenAPI Initiative推動的,該倡議涉及更多來自技術領域不同領域的30個組織-包括Microsoft,Google,IBM和CapitalOne。
領導Swagger工具開發的公司Smartbear Software也是OpenAPI Initiative的成員,幫助領導瞭規范的發展。
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。
改造優化
上面的示例通過硬編碼的形式,所以無法進行代碼的復用,而且每次更新配置的時候,都需要更改代碼,比如我們的項目在開發或者測試環境時,我們希望能正常使用OpenAPI但是在生產環境需要禁用OpenAPI。
在工程學的角度,常用的做法是盡量通過更改配置的形式,問不是更改代碼。基於此,我們可以借助SpringBoot的配置功能,對上述代碼進行改造。
新增OpenApi配置類
@Data @Component @ConfigurationProperties(prefix = "example.web.swagger") public class SwaggerProperties { /** * 是否swagger3啟用,默認不啟用 */ private Boolean enable = false; /** * 掃描包路徑,可以不指定,系統會通過自動掃描{@link io.swagger.annotations.ApiOperation} */ private String basePackage; /** * 標題 */ private String title; /** * 應用描述 */ private String description; /** * 服務地址 */ 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說明接口的功能,如果傳入的數據不是實體類,而是一個基本數據類型,可以通過@ApiParam解釋參數的作用
@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界面
到此這篇關於SpringBoot整合OpenApi的實踐的文章就介紹到這瞭,更多相關SpringBoot整合OpenApi內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring boot配置 swagger的示例代碼
- Java基礎之SpringBoot整合knife4j
- 解決@Api註解不展示controller內容的問題
- Springboot集成swagger實現方式
- 解決springboot引入swagger2不生效問題