SpringDoc基本使用的方法示例
SpringDoc 是基于 Spring Boot 的現(xiàn)代化 API 文檔生成工具,通過(guò)自動(dòng)化掃描代碼和注解,生成符合 OpenAPI 3.0+ 規(guī)范 的交互式文檔,并集成 Swagger UI 提供可視化測(cè)試界面。以下是其核心詳解:
核心特性與優(yōu)勢(shì)
開(kāi)箱即用
僅需添加依賴,無(wú)需復(fù)雜配置即可自動(dòng)生成文檔,支持 Spring WebMvc、WebFlux、Spring Security 及 Jakarta EE。
注解驅(qū)動(dòng)
使用 JSR-303 規(guī)范注解(如
@Tag
、@Operation
)替代 SpringFox 專屬注解,降低學(xué)習(xí)成本。動(dòng)態(tài)兼容性
完美適配 Spring Boot 2.6+ 及 3.x(含 JDK 17+),解決 SpringFox 因停維護(hù)導(dǎo)致的不兼容問(wèn)題。
多格式輸出
支持 JSON/YAML/HTML 格式文檔,并提供分組功能,可按模塊劃分接口(如公開(kāi) API 與內(nèi)部 API)。
集成與配置
依賴引入(Spring Boot 3.x)
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.5.0</version> <!-- 官方穩(wěn)定版,兼容 Spring Boot 3.3.x:cite[2]:cite[8] --> </dependency>
基礎(chǔ)配置(application.yml)
springdoc: swagger-ui: # 開(kāi)啟 swagger-ui 文檔展示 enabled: true # UI訪問(wèn)路徑 path: /swagger-ui.html # 標(biāo)簽排序方式 tags-sorter: alpha # 操作排序方式 operations-sorter: alpha # 保持認(rèn)證狀態(tài) persistAuthorization: true # 禁用示例接口 disable-swagger-default-url: true api-docs: # 開(kāi)啟 OpenAPI 展示 enabled: true # OpenAPI JSON路徑 path: /v3/api-docs default-consumes-media-type: application/json default-produces-media-type: application/json cache: # 關(guān)閉文檔緩存 disabled: false # 顯示actuator端點(diǎn) show-actuator: false # 推薦保持默認(rèn),顯示結(jié)構(gòu)化參數(shù) # default-flat-param-object: true # 允許在文檔中展示 Spring MVC 的 ModelAndView 返回類型 model-and-view-allowed: true # 推薦關(guān)閉以確保文檔精確性 override-with-generic-response: false
全局信息配置類(可選)
@Configuration @OpenAPIDefinition( info = @Info(title = "項(xiàng)目API文檔", version = "1.0", description = "SpringBoot接口文檔") ) public class SpringDocConfig { // 無(wú)需額外代碼 }
注解使用
常用注解
場(chǎng)景 | SpringDoc 注解 | 示例 |
---|---|---|
控制器描述 | @Tag(name="模塊", description="") | @Tag(name="用戶管理", description="用戶CRUD") |
接口方法描述 | @Operation(summary="", description="") | @Operation(summary="創(chuàng)建用戶", description="需管理員權(quán)限") |
參數(shù)描述 | @Parameter(description="") | @Parameter(description="用戶ID", required=true) |
模型屬性描述 | @Schema(description="") | public class User { @Schema(description="用戶名") private String name; }l |
解析對(duì)象屬性為查詢參數(shù) | @ParameterObject | public BizResponse getUserPage(@ParameterObject UserPageForm form) {} |
提示:
- @Hidden 可隱藏接口或參數(shù);
- 支持 Spring Security 的 @PreAuthorize 注解,自動(dòng)在文檔中標(biāo)記權(quán)限需求。
控制層注解使用示例
@RestController @RequestMapping("/api/users") @Tag(name = "用戶管理", description = "用戶相關(guān)操作API") public class UserController{ @Operation(summary = "獲取用戶信息", description = "通過(guò)用戶id獲取用戶信息") @Parameters({ @Parameter(in = ParameterIn.PATH, name = "id", description = "用戶uid", required = true) }) @ApiResponse(responseCode = "404", description = "User not found") @GetMapping("/{id}") public ResponseEntity<User> getUserById(@PathVariable Long id){ // 實(shí)現(xiàn)代碼 return new ResponseEntity(new User(10001,"feng","ADMIN"), HttpStatusCode.valueOf(200)); } @Operation(summary = "獲取用戶列表-分頁(yè)") @GetMapping("/userPage.do") public BizResponse getUserPage(@ParameterObject UserPageForm form) { return BizResponse.ok(userServer.getUserPage(form)); } @Operation(summary = "文件上傳") @PostMapping(name = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public BizResponse<FileInfoVo> fileUpload( @Parameter(description = "文件", content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE, schema = @Schema(type = "string", format = "binary"))) @RequestParam MultipartFile file) { FileInfo fileInfo = fileStorageService.of(file).setPath(uploadFilePath).upload(); return BizResponse.ok(fileInfo); } }
模型注解使用示例
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Size; @data public clas sUser{ @Schema(description = "用戶ID", example = "1001") private Integer id; @Schema(description = "用戶名", example = "john_doe", requiredMode = RequiredMode.REQUIRED) @Size(min = 3, max = 20, message = "用戶名長(zhǎng)度必須在3到20個(gè)字符之間") private String username; @Schema(description = "用戶角色", allowableValues = {"ADMIN", "USER", "GUEST"}) private String role; @Schema(description = "郵箱", example = "john_doe@mail.com") @Email private String email; @Schema(description = "最近登錄時(shí)間", example = "2025-07-15 12:25:32", type = "string") private Date lastLoginTime; @Schema(description = "出生年月日", example = "2025-07-15", type = "string") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date birthDate; }
文件上傳注解使用示例
文件上傳必須聲明以下配置,否則 SpringDoc 無(wú)法識(shí)別為文件類型,文件參數(shù)不會(huì)顯示為文件上傳控件
@PostMapping
必須配置consumes = MediaType.MULTIPART_FORM_DATA_VALUE
MultipartFile
參數(shù)必須明確聲明format = "binary"
單文件上傳
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "上傳文件") public ResponseEntity<String> uploadFile( @Parameter( description = "文件參數(shù)", required = true, content = @Content( // 關(guān)鍵:嵌套Content注解 mediaType = MediaType.APPLICATION_OCTET_STREAM_VALUE, schema = @Schema(type = "string", format = "binary") // 明確格式 ) ) @RequestParam("file") MultipartFile file) { // 業(yè)務(wù)邏輯 }
多文件上傳(數(shù)組形式)
@Parameter( description = "多文件上傳", content = @Content( mediaType = MediaType.MULTIPART_FORM_DATA_VALUE, array = @ArraySchema( // 聲明數(shù)組類型 schema = @Schema(type = "string", format = "binary") ) ) ) @RequestParam("files") MultipartFile[] files
混合參數(shù)(文件+表單數(shù)據(jù))
@RequestBody( description = "混合參數(shù)請(qǐng)求", content = @Content( mediaType = MediaType.MULTIPART_FORM_DATA_VALUE, encoding = { @Encoding(name = "file", contentType = "image/jpeg"), // 指定文件類型 @Encoding(name = "remark", contentType = "text/plain") // 文本參數(shù) } ) ) @RequestPart("file") MultipartFile file, @RequestPart("remark") String remark
分組與擴(kuò)展功能
分組配置
按模塊隔離接口
@Bean public GroupedOpenApi publicApi() { return GroupedOpenApi.builder() .group("公開(kāi)接口") .pathsToMatch("/api/public/**") .build(); } @Bean public GroupedOpenApi adminApi() { return GroupedOpenApi.builder() .group("管理接口") .pathsToMatch("/api/admin/**") .addOpenApiMethodFilter(method -> method.isAnnotationPresent(PreAuthorize.class)) .build(); }
訪問(wèn) Swagger UI 右上角切換分組
生產(chǎn)環(huán)境安全建議
通過(guò)配置動(dòng)態(tài)關(guān)閉文檔
springdoc: swagger-ui: enabled: false # 生產(chǎn)環(huán)境禁用 UI api-docs: enabled: false # 禁用 OpenAPI 端點(diǎn):cite[1]
從 SpringFox 遷移指南
SpringFox 注解 | SpringDoc 替代方案 |
---|---|
@Api | @Tag |
@ApiOperation | @Operation(summary="", description="") |
@ApiModelProperty | @Schema(description="") |
@ApiParam | @Parameter |
@ApiIgnore | @Hidden |
遷移優(yōu)勢(shì):
- 支持 Spring Boot 3.x 和 JDK 17+;
- 注解更簡(jiǎn)潔,符合 OpenAPI 3 規(guī)范
最佳實(shí)踐與常見(jiàn)問(wèn)題
依賴沖突
排除舊版 Swagger 依賴(如
springfox-swagger2
),避免與 SpringDoc 沖突1。攔截器導(dǎo)致文檔無(wú)法訪問(wèn)
若項(xiàng)目使用 Spring Security,需放行文檔路徑:
http.authorizeRequests().antMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll();
文檔生成失敗排查
檢查控制器是否被掃描:確保
@RestController
位于springdoc.packages-to-scan
指定路徑下
總結(jié)
SpringDoc 憑借 零配置啟動(dòng)、注解簡(jiǎn)潔 和 深度兼容 Spring 生態(tài) 的優(yōu)勢(shì),已成為 Spring Boot API 文檔的首選工具。其核心價(jià)值在于:
- 自動(dòng)化 - 減少手動(dòng)維護(hù)文檔的成本;
- 標(biāo)準(zhǔn)化 - 嚴(yán)格遵循 OpenAPI 3 規(guī)范;
- 可擴(kuò)展 - 分組、安全控制靈活適配復(fù)雜項(xiàng)目。
- 訪問(wèn)
http://localhost:8080/swagger-ui.html
即可查看交互式文檔(默認(rèn)路徑)
到此這篇關(guān)于SpringDoc基本使用的方法示例的文章就介紹到這了,更多相關(guān)SpringDoc使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java如何使用自己的maven本地倉(cāng)庫(kù)詳解
這篇文章主要給大家介紹了關(guān)于java如何使用自己的maven本地倉(cāng)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07為什么SpringMVC中請(qǐng)求的body不支持多次讀取
這篇文章主要介紹了為什么SpringMVC中請(qǐng)求的body不支持多次讀取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Spring MVC中使用Controller如何進(jìn)行重定向
這篇文章主要介紹了Spring MVC中使用Controller如何進(jìn)行重定向操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09