精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

終結 Swagger!SpringDoc OpenAPI 3 接管 API 文檔王座全攻略

開發 前端
在一次接口聯調過程中,電商平臺的接口文檔竟導致服務啟動失敗,堆棧信息中赫然寫著:java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'basic-error-controller'。

一次慘痛的生產事故,逼我放棄 Swagger2

在一次接口聯調過程中,電商平臺的接口文檔竟導致服務啟動失敗,堆棧信息中赫然寫著:

java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'basic-error-controller'

這次事故的根源并不是業務邏輯,而是文檔工具 Swagger2 強行掃描了 /error 路徑,造成了控制器注冊沖突。更糟糕的是:

  • 不支持 OpenAPI 3.0 的 callbacks,文檔無法覆蓋 webhook 回調;
  • 注解嚴重入侵代碼,很多 Controller 30% 以上內容是文檔注解;
  • UI 遲緩、響應式項目兼容性差……

所以我們正式切換至 SpringDoc,并因此徹底擁抱 OpenAPI 3.0 標準。

Swagger2 的七宗罪 與 SpringDoc 的全方位對位

問題點

Swagger2

SpringDoc

注解污染

重度侵入

零侵入、自動推導

OpenAPI 支持

僅限 2.0

完整支持 3.0.3

WebFlux 兼容性

啟動失敗

深度集成

UI 體驗

笨重、緩慢

輕量定制,支持 Swagger UI/Redoc

安全方案

基礎支持

完整 OAuth2 支持

分組能力

多級分組配置靈活

枚舉展示

顯示數值

智能展示說明

SpringDoc 的零注解智能文檔引擎

控制器映射自動識別(無需添加文檔注解)

@RestController
@RequestMapping("/api/v1/products")
public class ProductController {


    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.findById(id);
    }


    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Product createProduct(@RequestBody @Valid Product product) {
        return productService.save(product);
    }
}

SpringDoc 會自動生成對應的 OpenAPI 文檔結構,真正實現文檔與業務解耦。

 參數解析與請求頭識別智能化

@PostMapping("/search")
public Page<Product> searchProducts(
        @RequestParam String keyword,
        @RequestParam(defaultValue = "0") int page,
        @RequestParam(defaultValue = "10") int size,
        @RequestHeader("X-Client-Type") ClientType clientType) {
    // 搜索邏輯
}

生成文檔參數自動識別 query 和 header 類型,無需添加額外注解。

遷移實踐指南 —— 從 Swagger2 平滑切換到 SpringDoc

依賴更替(從臃腫到現代)

<!-- 移除 Swagger2 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>


<!-- 添加 SpringDoc Starter -->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.5.0</version>
</dependency>

如需支持 WebFlux:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
    <version>2.5.0</version>
</dependency>

注解遷移參考表

Swagger2 注解

SpringDoc 替代

示例

@Api

無需替代

-

@ApiOperation

方法名推導

getProduct()

@ApiParam

@Parameter

@Parameter(description="ID")

@ApiModelProperty

@Schema

@Schema(description="商品名")

@ApiIgnore

@Hidden

@Hidden public void internal()

配置類遷移示例

@Configuration
public class OpenApiConfig {


    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
            .info(new Info()
                .title("訂單系統 API")
                .version("1.0.0")
                .contact(new Contact().name("技術支持").email("support@company.com"))
            )
            .externalDocs(new ExternalDocumentation()
                .description("完整文檔")
                .url("https://docs.company.com"));
    }
}

企業級 API 文檔能力構建

安全方案(OAuth2)

@SecurityScheme(
    name = "OAuth2",
    type = SecuritySchemeType.OAUTH2,
    flows = @OAuthFlows(
        authorizationCode = @OAuthFlow(
            authorizationUrl = "https://auth.company.com/oauth/authorize",
            tokenUrl = "https://auth.company.com/oauth/token",
            scopes = {
                @Scope(name = "read", description = "只讀權限"),
                @Scope(name = "write", description = "寫權限")
            }
        )
    )
)
public class OpenApiConfig {}

全局參數與統一響應結構

@Bean
public OpenAPI customOpenAPI() {
    return new OpenAPI()
        .components(new Components()
            .addParameters("versionHeader", new Parameter()
                .in("header")
                .name("X-API-Version")
                .required(true)
                .schema(new StringSchema().example("v1")))
            .addResponses("NotFound", new ApiResponse()
                .description("資源不存在")
                .content(new Content().addMediaType(
                    MediaType.APPLICATION_JSON_VALUE,
                    new MediaType().schema(new Schema<ProblemDetail>())
                ))
            )
        );
}

多版本文檔管理:

springdoc.api-docs.enabled=true
springdoc.api-docs.path=/api-docs
springdoc.swagger-ui.urls[0].name=v1
springdoc.swagger-ui.urls[0].url=/api-docs/v1
springdoc.swagger-ui.urls[1].name=v2
springdoc.swagger-ui.urls[1].url=/api-docs/v2

版本化配置類:

@Configuration
@Profile("v1")
@GroupedOpenApi(name = "v1", pathsToMatch = "/api/v1/**")
public class OpenApiV1Config {}


@Configuration
@Profile("v2")
@GroupedOpenApi(name = "v2", pathsToMatch = "/api/v2/**")
public class OpenApiV2Config {}

三種 UI 渲染方案深度對比

 Swagger UI 增強配置

springdoc.swagger-ui.deepLinking=true
springdoc.swagger-ui.persistAuthorization=true
springdoc.swagger-ui.filter=true
springdoc.swagger-ui.theme=material

極簡主義的 ReDoc 接入

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.redoc.ly/redoc/latest/redoc.standalone.js"></script>
</head>
<body>
  <div id="redoc-container"></div>
  <script>
    Redoc.init('/api-docs', {
      scrollYOffset: 50,
      theme: { colors: { primary: { main: '#FF6F61' } } }
    }, document.getElementById('redoc-container'));
  </script>
</body>
</html>

自定義 UI 渲染

@Controller
public class CustomDocController {


    @GetMapping("/custom-docs")
    public String customDocs(Model model) {
        OpenAPI openApi = OpenAPIService.getOpenAPI();
        Map<String, Object> docData = new HashMap<>();
        docData.put("title", openApi.getInfo().getTitle());
        docData.put("endpoints", extractEndpoints(openApi));
        model.addAttribute("docData", docData);
        return "custom-doc-view";
    }
}

上線前的最佳實踐

文檔自動發布流水線對接(Jenkins/GitLab CI)

精細化訪問控制

@Configuration
public class OpenApiSecurityConfig {


    @Bean
    public SecurityFilterChain apiDocsFilterChain(HttpSecurity http) throws Exception {
        http
            .securityMatcher("/v3/api-docs/**", "/swagger-ui/**")
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/v3/api-docs/**").hasRole("DEVELOPER")
                .requestMatchers("/swagger-ui/**").authenticated()
            )
            .httpBasic();
        return http.build();
    }
}

性能優化建議

springdoc.model-converter.enabled=false
springdoc.override-with-generic-response=false
springdoc.cache.disabled=false
springdoc.cache.ttl=600000
springdoc.show-actuator=false

尾聲:SpringDoc 帶來的不只是文檔,更是效率革命

在切換到 SpringDoc 之后,我們獲得了切實可見的收益:

 接口開發效率提升 40%  聯調時間減少 70%  API 缺陷率下降 65%

它不再是一個文檔工具,而是你后端系統工程化的重要基石。

是時候讓 SpringDoc 成為你項目中最值得信賴的一部分。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2010-04-23 14:04:23

Oracle日期操作

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2013-06-08 11:13:00

Android開發XML解析

2009-02-20 11:43:22

UNIXfish全攻略

2009-12-14 14:32:38

動態路由配置

2009-10-19 15:20:01

家庭綜合布線

2014-03-19 17:22:33

2025-08-14 07:40:05

2015-03-04 13:53:33

MySQL數據庫優化SQL優化

2022-10-21 11:30:42

用戶生命周期分析

2009-10-12 15:06:59

2020-12-28 10:50:09

Linux環境變量命令

2009-07-04 11:26:12

unix應急安全攻略

2010-10-11 13:54:03

Windows Ser

2009-11-10 12:08:15

2009-07-17 17:43:49

Jruby開發Web

2009-02-12 10:12:00

NAT配置

2010-08-25 14:36:02

DHCP服務器

2009-12-17 16:15:00

CCNA640-810
點贊
收藏

51CTO技術棧公眾號

日本天码aⅴ片在线电影网站| 在线观看国产区| 盗摄系列偷拍视频精品tp| 国产精品欧美极品| 999在线观看免费大全电视剧| 国产亚洲精品码| 自拍偷拍欧美一区| 欧美一区二区三区视频| 亚洲中文字幕无码中文字| 最新真实国产在线视频| 豆国产96在线|亚洲| 青草青草久热精品视频在线观看| 三级黄色片在线观看| 99精品在免费线中文字幕网站一区 | 国产高潮在线观看| 国产精品美女久久久| 色婷婷综合久久久久中文字幕1| 久久久无码人妻精品无码| 成人爽a毛片免费啪啪| 亚洲六月丁香色婷婷综合久久| 精品一区二区视频| 精品国产av一区二区| 久久综合伊人| 97在线视频免费观看| 成人在线观看小视频| 亚洲另类春色校园小说| 日韩欧美中文字幕一区| 丝袜制服一区二区三区| 国产精品电影| 亚洲精品va在线观看| 亚洲一区二区四区| 国产小视频福利在线| 99久久99久久精品免费观看| 成人欧美在线视频| 国产免费www| 性欧美xxxx大乳国产app| 色综合天天狠天天透天天伊人| 女人裸体性做爰全过| 伊人久久大香线蕉综合网站 | 天堂网在线播放| 韩国av一区二区三区在线观看| 国产成人91久久精品| 日韩免费视频网站| 韩国在线一区| 欧美日本中文字幕| 一级片一级片一级片| 欧美一级本道电影免费专区| 亚洲女成人图区| 精品无码在线视频| 国产乱人伦精品一区| 日韩一区二区免费在线观看| 午夜xxxxx| 激情综合婷婷| 日韩亚洲欧美一区二区三区| 午夜免费一级片| 亚洲欧美综合久久久久久v动漫| 在线免费观看日本欧美| 国产无套粉嫩白浆内谢的出处| 中文字幕在线看片| 色婷婷久久综合| 日韩欧美在线免费观看视频| 日韩精品一区二区三区| 日本乱人伦aⅴ精品| 可以在线看的黄色网址| **欧美日韩在线观看| 在线观看中文字幕不卡| 中文字幕网av| 999精品嫩草久久久久久99| 欧美剧情片在线观看| 亚洲精品在线视频播放| 精品国产亚洲一区二区三区| 日韩女优制服丝袜电影| 欧美激情一区二区三区p站| 久久97久久97精品免视看秋霞| 亚洲国产精品悠悠久久琪琪| 日本免费福利视频| 国产欧美高清视频在线| 久久精品这里热有精品| 国产一级在线观看视频| 亚洲一区二区动漫| 国产精品中文久久久久久久| 国产精品无码AV| 成人小视频免费在线观看| 久久久7777| 在线视频91p| 亚洲在线视频免费观看| 116极品美女午夜一级| 素人啪啪色综合| 日韩免费看网站| 久久精品老司机| 97精品在线| 国内精品免费午夜毛片| 999视频在线| 国产一区二区精品久久91| 国产日韩二区| yw在线观看| 一区二区三区久久久| 蜜臀av午夜一区二区三区| 在线不卡一区| 亚洲精品按摩视频| 国产日产在线观看| 一道本一区二区| 国产日韩中文字幕| 天堂在线资源网| 国产精品国产三级国产普通话三级 | 特种兵之深入敌后| 伊人久久大香线蕉综合网站 | 成年人视频免费在线播放| 欧洲视频一区二区| 精品国产一区在线| 婷婷综合网站| 日本一本a高清免费不卡| 精品久久无码中文字幕| 久久久久久免费毛片精品| 国产内射老熟女aaaa| 成人免费看黄| 精品精品国产高清一毛片一天堂| 欧洲性xxxx| 国产一区91| 成人动漫视频在线观看完整版 | 又色又爽又黄无遮挡的免费视频| 国产v日产∨综合v精品视频| 亚洲一区bb| 欧美成人免费电影| 亚洲成成品网站| 国产女人18水真多毛片18精品| 狂野欧美性猛交xxxx巴西| 国产精品国产三级国产专区53| 日本在线免费网| 日本丶国产丶欧美色综合| 秘密基地免费观看完整版中文 | 国产素人在线观看| 91精品国产自产精品男人的天堂| 日韩在线免费视频观看| 国产精品第6页| 久久久久久久久久久电影| 精品欧美一区免费观看α√| 丁香婷婷成人| 欧美精品第一页在线播放| 国产色片在线观看| 亚洲色图制服丝袜| 国产乱女淫av麻豆国产| 爽成人777777婷婷| 国产精品直播网红| 欧美成人hd| 欧美日韩在线一区二区| 精品成人无码一区二区三区| 天堂一区二区在线免费观看| 欧美一区二区三区电影在线观看| 亚洲天堂av在线| 亚洲精品视频免费在线观看| 成人午夜淫片100集| 97se亚洲国产综合自在线不卡 | 日韩欧美卡一卡二| 欧美又粗又大又长| 国产91综合网| 久久视频这里有精品| 欧洲亚洲成人| 秋霞午夜一区二区| 国产对白叫床清晰在线播放| 欧美性猛交xxxx黑人交| 国产wwwwxxxx| 国产成人精品一区二| 中文字幕在线亚洲三区| 欧美成年网站| 性欧美暴力猛交69hd| 香港一级纯黄大片| 欧洲在线/亚洲| 潘金莲一级黄色片| 粉嫩绯色av一区二区在线观看| 欧美成人一区二区在线观看| 国产欧美日韩| 亚洲www在线| 波多野结衣视频一区二区| 亚洲精品一区二区网址| 中文字幕 人妻熟女| 成人免费在线视频观看| 女人扒开腿免费视频app| 一区二区三区高清视频在线观看| 欧美日本国产精品| 91精品麻豆| 久久久久国产一区二区三区| 男女污污视频在线观看| 8x8x8国产精品| 五月天综合在线| 国产欧美日韩久久| 精品国产午夜福利在线观看| 亚洲精品社区| 亚洲欧洲另类精品久久综合| 日本精品在线观看| 日本成人在线视频网址| 精品国产99久久久久久| 亚洲精品国产福利| 国产一区二区三区成人| 亚洲福利一区二区| 精品丰满少妇一区二区三区| 成人国产免费视频| 777一区二区| 一本不卡影院| 裸体大乳女做爰69| 亚洲素人在线| 18成人免费观看网站下载| 欧美大片1688| 欧美激情一区二区三区久久久| 国产三级在线看| 亚洲第一男人天堂| 国产乱码精品一区二三区蜜臂 | 中文字幕日韩经典| 性感美女久久精品| 操她视频在线观看| 久久这里只有精品6| 麻豆传媒在线看| 欧美aaa在线| 黄色一级片播放| 欧美高清一区| 亚洲精品日韩成人| 在线日韩一区| 国产经典一区二区三区| 祥仔av免费一区二区三区四区| 韩日欧美一区二区| 影音先锋中文在线视频| 综合网中文字幕| 理论视频在线| 日韩成人中文字幕| 亚洲精品97久久中文字幕| 欧美日韩国产免费| 亚洲精品一区二三区| 精品人伦一区二区三区蜜桃网站| 欧美人妻精品一区二区三区| 国产精品久久久99| 快灬快灬一下爽蜜桃在线观看| 91亚洲精品久久久蜜桃网站 | 久久天天躁日日躁| 91高清在线| 亚洲性夜色噜噜噜7777| 手机福利在线| 亚洲精品国产精品国自产观看浪潮| 99久久久久久久| 91精品国产欧美日韩| 亚洲一区二区人妻| 欧美色精品在线视频| 天堂网免费视频| 日韩欧美中文在线| 亚洲欧美偷拍视频| 色综合久久99| 中文字幕日本视频| 欧美日韩一区视频| 亚洲熟女乱色一区二区三区久久久| 欧洲视频一区二区| 在线观看黄色网| 欧美久久久久久蜜桃| 91资源在线视频| 日韩一级黄色片| 黄频网站在线观看| 亚洲第一中文字幕| 日韩精品123| 亚洲性生活视频| 视频三区在线| 欧美大尺度在线观看| 日韩激情av| 91爱爱小视频k| 欧美无毛视频| 国产精品专区一| 国产色99精品9i| 国产99视频精品免费视频36| 精品资源在线| 日韩在线国产| 亚洲大全视频| 九色自拍视频在线观看| 亚洲欧美bt| 日日噜噜夜夜狠狠| 国产高清久久久| 久久久午夜精品福利内容| 99精品视频一区| 人人妻人人澡人人爽| 亚洲欧美怡红院| 久久婷婷国产麻豆91| 好吊成人免视频| 91久久久久国产一区二区| 日韩免费一区二区| 国产在线91| 欧美日本高清一区| 中文字幕一区久| 国产又爽又黄的激情精品视频| 欧州一区二区三区| 精品一区二区三区免费毛片| 91亚洲人成网污www| 久久国产精品网| 蓝色福利精品导航| 91九色蝌蚪porny| 国产三级一区二区| 久久久久成人精品无码| 日本高清无吗v一区| 亚洲AV无码精品色毛片浪潮| 亚洲男人的天堂在线播放| 国产精品一区二区三区视频网站| 91黑丝在线观看| 四虎成人精品一区二区免费网站| 国产区欧美区日韩区| 四虎国产精品免费观看| 浮妇高潮喷白浆视频| 国产一区三区三区| 亚洲AV无码片久久精品| 夜夜亚洲天天久久| 亚洲在线精品视频| 亚洲精品日韩久久久| v片在线观看| 国产精品777| 久久亚洲黄色| 欧美日韩午夜爽爽| 免费看精品久久片| 特级西西人体wwwww| 亚洲精品综合在线| 一区二区视频播放| 亚洲欧美中文在线视频| 成人性生交大片免费看网站 | 日韩精选在线| 国产精品va在线观看无码| 蜜桃在线一区二区三区| 国产麻豆天美果冻无码视频 | 成人性生活视频免费看| 精品一区二区在线看| av中文字幕免费观看| 黄色一区二区在线| 精品人妻一区二区三区日产乱码| 中文字幕在线国产精品| 日本不卡一二三| 久久久水蜜桃| 在线看片一区| 年下总裁被打光屁股sp| 亚洲色图19p| 国产成人av免费| 亚洲欧美国产精品专区久久| 国产伦理精品| 国内视频一区二区| 99精品99| 中国免费黄色片| 亚洲国产欧美日韩另类综合| 亚洲精品97久久中文字幕无码| 欧美精品免费在线观看| 国产电影一区二区| 黄色一级片网址| 国产一区视频在线看| 久草综合在线视频| 91麻豆精品国产自产在线| 欧洲不卡视频| 91社区国产高清| 欧美在线免费| 久久久男人的天堂| 亚洲成a人v欧美综合天堂下载 | 成人av在线播放网址| 欧美极品视频在线观看| 日韩亚洲欧美成人一区| 污视频网站在线免费| 成人黄色在线免费观看| 精品成人免费| 三级男人添奶爽爽爽视频| 欧美日韩免费区域视频在线观看| 亚洲av激情无码专区在线播放| 2023亚洲男人天堂| 欧美最新另类人妖| 亚洲一区精品视频在线观看| 亚洲精品高清在线| 蜜桃视频污在线观看| 2019中文字幕免费视频| 深爱激情久久| 一女二男3p波多野结衣| 亚洲欧美日韩国产另类专区| 亚洲精选一区二区三区| 97视频在线看| 精品国产一区二区三区小蝌蚪| 亚洲最大天堂网| 亚洲第一在线综合网站| 秋霞av在线| 国产日韩欧美在线观看| 欧美视频二区| 免费在线观看你懂的| 欧美日韩一区小说| 高h视频在线播放| 免费日韩电影在线观看| 蜜臀久久99精品久久久画质超高清| 国产福利视频网站| 日韩av影视综合网| 高清av一区| 欧妇女乱妇女乱视频| 久久久另类综合| 国产免费一区二区三区最新不卡| 高清一区二区三区四区五区| 成人aaaa| 一级黄色片毛片| 欧美色男人天堂| a级片免费在线观看| 亚洲图片都市激情| gogogo免费视频观看亚洲一| 国产偷人爽久久久久久老妇app| 欧美成人精品h版在线观看| 亚洲宅男网av| 日本女人性视频| 色av一区二区| 青春草视频在线|