精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产一区在线观| 国产亚洲视频在线| 国产欧美123| 国产成人精品亚洲精品色欲| 亚洲精品系列| 一区二区三区www| 亚洲精品一二三四| 亚洲伊人av| 亚洲摸摸操操av| 欧美亚洲另类在线一区二区三区| 国产又黄又粗又硬| 亚洲精品色图| 最新国产成人av网站网址麻豆| 一区二区在线免费观看视频| 韩国成人漫画| 亚洲一区二区三区四区的| 日本不卡在线播放| 亚洲产国偷v产偷v自拍涩爱| 日韩av一二三| 91精品国产91久久| 久久av红桃一区二区禁漫| 国产精品毛片av| 欧美日韩五月天| av之家在线观看| www红色一片_亚洲成a人片在线观看_| 93久久精品日日躁夜夜躁欧美| 国产在线999| 日韩精品1区2区| 欧美激情aⅴ一区二区三区| 亚洲人成亚洲人成在线观看| 精品一区二区三区四区五区六区| 欧美大陆国产| 色狠狠色狠狠综合| www.玖玖玖| 福利小视频在线| 亚洲精品乱码久久久久久| 性欧美.com| 国产资源在线观看| 久久亚洲综合色| 精品国产一区二区三区麻豆小说 | 欧美日韩在线观看一区二区三区| www.久久伊人| 国产一区二区三区免费观看| 国产精品美乳一区二区免费| 秋霞精品一区二区三区| 亚洲欧洲日本mm| 久久久久免费视频| 女同久久另类69精品国产| 国产免费播放一区二区| 日韩精品中文字幕视频在线| 亚洲av成人片无码| 亚洲精品v亚洲精品v日韩精品| 在线播放91灌醉迷j高跟美女| 三级a在线观看| 国产精品毛片久久久久久久久久99999999 | 国产有色视频色综合| 成人小说亚洲一区二区三区| 国产成人精品亚洲午夜麻豆| 99电影网电视剧在线观看| 国产欧美日韩综合精品一区二区三区| 久久精品国产成人一区二区三区| 国产精品主播视频| 中文字幕人妻互换av久久| 日本aⅴ免费视频一区二区三区| 国产精品九九久久久久久久| 国产亚洲欧美日韩高清| 欧美aⅴ一区二区三区视频| 国产91在线播放精品91| 一级一级黄色片| 久久精品国产色蜜蜜麻豆| 成人福利在线观看| 亚洲春色一区二区三区| av电影天堂一区二区在线观看| 极品尤物一区二区三区| 噜噜噜噜噜在线视频| 中文字幕乱码亚洲精品一区 | 137大胆人体在线观看| 国产精品的网站| 在线观看18视频网站| 欧美videos另类精品| 欧美日韩国产激情| 欧美精品无码一区二区三区| 国产韩日精品| 日韩女优毛片在线| 女尊高h男高潮呻吟| 波多野结衣的一区二区三区| 久久久精品中文字幕| 欧美精品入口蜜桃| 麻豆91精品| 亚洲在线视频福利| 五月天丁香视频| 国产精品免费免费| 日韩精品在线观看av| 超碰一区二区| 欧美一区二区三区四区高清| 国产视频久久久久久| 欧美精品色图| 欧美激情精品久久久久久黑人| 国产精品777777| 久久久久久久欧美精品| 91在线免费网站| 日本黄在线观看| 亚洲欧美日韩综合aⅴ视频| 日韩精品一区二区免费| 91成人抖音| 亚洲电影免费观看高清| 成人午夜免费影院| 亚洲精品美女91| 91久热免费在线视频| 亚洲日本在线播放| 亚洲色图欧洲色图| 欧美成人xxxxx| 日韩中文一区二区| 国产亚洲精品久久久久动| 激情视频在线播放| 捆绑调教一区二区三区| 精品欧美一区二区久久久伦| 国产剧情在线| 欧美日韩国产高清一区| 丰满少妇一区二区三区| 好看不卡的中文字幕| 欧美在线免费看| 亚洲成人一级片| 中文字幕在线观看一区| 男人亚洲天堂网| 亚洲国产精品18久久久久久| 久久久国产一区二区三区四区小说| 亚洲成年人专区| 欧美aaa视频| 亚洲激情第一页| 精品99久久久久成人网站免费| 秋霞电影一区二区| 久久久久一区二区| 草草影院在线| 精品日韩在线观看| 538精品在线视频| 久久成人免费日本黄色| 欧洲一区二区在线| 欧美伦理91| 亚洲成人网av| 精品无码黑人又粗又大又长| 国产精品18久久久久久久久| 国产精品jizz在线观看老狼| 国产国产一区| 中文字幕日韩欧美| 中文字幕久久久久| 欧美国产视频在线| 十八禁视频网站在线观看| 日本成人a网站| 97久久精品国产| 天堂网2014av| 欧美日韩精品在线| 你懂的在线观看网站| 狠狠干成人综合网| 国产精品久久精品视| 美足av综合网| 亚洲成人免费网站| 久久久久久久久久免费视频| 91香蕉视频黄| 少妇性l交大片| 欧美xxxx中国| 成人写真福利网| 先锋影音在线资源站91| 精品剧情v国产在线观看在线| 精品少妇久久久| 成人黄色网址在线观看| 9久久9毛片又大又硬又粗| 老司机aⅴ在线精品导航| 97国产在线视频| 欧美人体大胆444www| 色婷婷综合久色| 污污视频网站在线免费观看| 国产做a爰片久久毛片| 青青草免费在线视频观看| 午夜视频在线观看精品中文| 韩国欧美亚洲国产| 国产视频精品久久| 欧美日韩成人一区| 久久国产精品国语对白| 成人美女视频在线观看18| www.浪潮av.com| 菠萝蜜一区二区| 91超碰在线免费观看| 91视频欧美| 中文国产成人精品| 国产xxxx孕妇| 欧美性生交xxxxx久久久| 在线观看免费小视频| 国产一区二区三区观看| 国产av天堂无码一区二区三区| 国产乱码精品一区二区亚洲| 成人两性免费视频| av免费不卡国产观看| 尤物九九久久国产精品的分类| 国内精品偷拍视频| 欧美性极品xxxx娇小| 99热在线观看精品| 99久久er热在这里只有精品15| 美女黄色片视频| 午夜性色一区二区三区免费视频 | 高h震动喷水双性1v1| 精品高清一区二区三区| jizzjizzjizz国产| av网站免费线看精品| 天天干天天草天天| 一区二区三区福利| 异国色恋浪漫潭| 亚洲欧美tv| 国产精品初高中精品久久| 成人网ww555视频免费看| 久久91亚洲精品中文字幕| 邻家有女韩剧在线观看国语| 精品国产伦一区二区三区免费| 波多野结衣日韩| 亚洲.国产.中文慕字在线| 中文字幕第69页| 久久亚洲综合色| 超碰caoprom| 国产精品一区二区在线观看不卡 | 精品国产乱码一区二区| 亚洲色图.com| a级黄色免费视频| 26uuu欧美| av2014天堂网| 国产成+人+日韩+欧美+亚洲| 成人日韩在线视频| 日日夜夜一区二区| 日韩精品 欧美| 国产精品第十页| 日韩视频一二三| 国产精品传媒精东影业在线| 日韩视频精品| 精品免费av| 欧美在线视频二区| 亚洲三级网址| 久久99精品久久久久久三级| 成人看片黄a免费看视频| 成人福利网站在线观看11| 精品欧美日韩精品| 国产成人在线视频| 六月婷婷综合| 国产成人+综合亚洲+天堂| 女人高潮被爽到呻吟在线观看| 欧美激情视频三区| 日本三级在线观看网站| 欧美剧在线观看| 日韩一区国产在线观看| 国产99对白在线播放| 欧美日韩精品系列| 97人妻精品视频一区| 91黄色激情网站| av首页在线观看| 欧洲av在线精品| 加勒比在线一区| 在线精品视频免费观看| 在线永久看片免费的视频| 欧美午夜无遮挡| 黄色片视频免费| 色播五月激情综合网| 波多野结衣激情视频| 欧美综合亚洲图片综合区| 中文字幕免费高清网站| 在线视频国内自拍亚洲视频| av首页在线观看| 欧美日本韩国一区二区三区视频| 97精品人妻一区二区三区在线| 欧美一区二区视频观看视频| www.色视频| 亚洲韩国青草视频| 你懂的视频在线播放| 国产一区二区三区久久精品 | 国产免费裸体视频| 亚洲精品专区| 免费在线观看的毛片| 日本 国产 欧美色综合| 中文字幕在线视频一区二区| 成人午夜免费电影| 免费观看av网站| 国产精品视频你懂的| 91杏吧porn蝌蚪| 亚洲精品久久久蜜桃| 久久久久久久久久免费视频| 欧美三级中文字| 亚洲乱熟女一区二区| 精品无人区太爽高潮在线播放| 色综合久久影院| 欧美高清性猛交| 成人看片网页| 99在线观看| 欧美人与牛zoz0性行为| 美国av在线播放| 一级成人国产| 99中文字幕在线| 久久丝袜美腿综合| 欧美偷拍第一页| 欧美日韩国产精品一区| 中文字幕你懂的| 亚洲精品福利在线观看| 暖暖日本在线观看| 97在线免费视频| 中文字幕综合| 欧美性天天影院| 欧美激情在线| 九色porny自拍| 91一区二区在线观看| 国精品人伦一区二区三区蜜桃| 午夜精品久久久久影视| 91在线视频国产| 亚洲午夜久久久久久久| 日韩精品亚洲人成在线观看| 国产精品久久久久久久av电影| 超碰在线一区| 99久久久无码国产精品性色戒| 国产农村妇女精品一区二区| 人妻换人妻仑乱| 亚洲国产激情av| 一级免费在线观看| 欧美一区二区精品在线| 91在线视频| 日韩免费av一区二区| 成人知道污网站| 看全色黄大色大片| 欧美bbbbb| 日本xxxxxxxxx18| 亚洲国产精品尤物yw在线观看| 国产内射老熟女aaaa∵| 国产亚洲精品久久久久久| 中文字幕在线高清| 成人性色av| 牛牛国产精品| 久久久久久久高清| 欧美激情一区不卡| 免费av中文字幕| 亚洲欧洲午夜一线一品| 嗯啊主人调教在线播放视频 | 色哟哟网站在线观看| 国产精品理论片在线观看| 无码人妻精品一区二区三区不卡 | 亚洲少妇在线| 亚洲一区二区三区四区av| 亚洲一区二区欧美日韩| 99精品久久久久久中文字幕| 精品国产欧美一区二区五十路 | 欧美日韩国产经典色站一区二区三区| 福利在线观看| 国产精品av电影| 大色综合视频网站在线播放| 成人性生生活性生交12| 国产三级欧美三级日产三级99| 不卡av电影在线| 亚洲午夜色婷婷在线| 国产精品亚洲d| 亚洲视频在线二区| 麻豆精品视频在线观看免费| 亚洲天堂精品一区| 欧美酷刑日本凌虐凌虐| 麻豆系列在线观看| 91亚洲午夜在线| 欧美69视频| 久久久久久久人妻无码中文字幕爆| 亚洲成年人网站在线观看| 三级在线观看网站| 68精品久久久久久欧美| 亚洲人和日本人hd| 91精品无人成人www| 中文字幕亚洲在| 亚洲不卡免费视频| 韩剧1988在线观看免费完整版| 香蕉一区二区| 亚洲一区二区蜜桃| 中文字幕日本不卡| 免费av网站观看| 日本高清+成人网在线观看| av亚洲在线观看| 久久成年人网站| 亚洲成人自拍偷拍| caoporn国产精品免费视频| 成人黄色在线播放| 一区精品久久| 夜夜春很很躁夜夜躁| 欧美欧美欧美欧美| a毛片不卡免费看片| 欧美精品一区二区三区在线四季 | 亚洲最大激情中文字幕| 99riav1国产精品视频| 国产精品美女高潮无套| 欧美一级在线观看| 性欧美xxx69hd高清| 一区二区三区久久网| 成人晚上爱看视频| jizz国产在线| 久久久久国产精品www| 欧美日韩伦理| 日本成人在线免费| 91福利社在线观看| a免费在线观看| 日韩aⅴ视频一区二区三区| 国产一区二区三区四区五区入口 | 国产日韩av一区二区| 亚洲综合一区中|