You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebFlux函数式集成OpenAPI3 版本校验与Swagger冲突问题

问题根因

全局兜底路由.andOther(route(RequestPredicates.all(), errorHandler::invalidVersion))使用了全路径匹配规则,WebFlux函数式路由按定义顺序从上到下匹配,springdoc-openapi生成的Swagger相关接口(默认路径为/v3/api-docs/**、/swagger-ui/**、/swagger-ui.html、/webjars/**)未被前置的版本路由规则覆盖,请求这些路径时会直接命中版本校验兜底逻辑,返回invalid version错误。移除兜底路由后Swagger可正常访问,但版本校验能力会全局失效。

修复方案
  • 给版本校验相关的路由配置增加Swagger路径白名单,不要用RequestPredicates.all()做无差别全匹配。
  • 第一步:定义路径断言,排除所有Swagger相关路径,代码参考如下:
// 版本校验白名单:Swagger文档相关路径
private static final List<String> DOC_WHITELIST = List.of(
        "/v3/api-docs",
        "/swagger-ui",
        "/swagger-ui.html",
        "/webjars"
);

// 自定义断言:匹配所有不在白名单内的请求
RequestPredicate validCheckPredicate = RequestPredicates.all()
        .and(request -> {
            String requestPath = request.uri().getPath();
            return DOC_WHITELIST.stream().noneMatch(requestPath::startsWith);
        });
  • 第二步:替换所有版本校验逻辑里的全匹配断言:
    1. 把内层的.andOther(route(RequestPredicates.all(), handler::validate))替换为.andOther(route(validCheckPredicate, handler::validate))
    2. 把最外层的.andOther(route(RequestPredicates.all(), errorHandler::invalidVersion))替换为.andOther(route(validCheckPredicate, errorHandler::invalidVersion))
  • 路由顺序不需要调整,保持原有版本路由在前、校验兜底在后的逻辑即可。
验证结果

配置修改重启服务后:

  • Swagger文档页面、OpenAPI元数据接口可以正常访问加载,不会触发版本校验错误
  • 业务接口的版本校验逻辑不受影响,版本不合法的请求依然会正常返回对应错误提示

内容的提问来源于stack exchange,提问作者Srivi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:18:15