Skip to content

OpenAPI 3.2 支持与迁移

English contract · 下载最小 JSON · 下载最小 YAML

已发布

Java 5.7.0 与 Knife4x Go v0.8.0 按本文消费合法 OpenAPI 3.2.x 文档。这不是 springdoc 生成 3.2 的承诺;当前生产依赖仍输出 3.0.x / 3.1.x。

已发布的 OpenAPI 3.0.x / 3.1.x 契约不变,见 OpenAPI 3.1 支持与迁移。Vue3 UI 继续只维护 OAS2。本文不改变任何 starter 默认配置,也不升级 springdoc 或 Java 生产依赖。

支持范围

OpenAPI 的功能集由 major.minor 定义。3.2.x 使用同一套 OpenAPI 3.2 feature set,不按 patch 拆分能力。3.2 文档走独立解析、资源图、Schema 会话、导出与变化跟踪,不降级成 3.1。

文档版本UI状态说明
Swagger / OpenAPI 2.0Vue 3兼容维护不扩展 OAS 3 能力
OpenAPI 3.0.xReact已发布支持Java 5.7.0 / Go v0.8.0
OpenAPI 3.1.xReact已发布支持Java 5.7.0 / Go v0.8.0
OpenAPI 3.2.xReact已发布支持合法 3.2 文档完整消费;不把 3.2 当 3.1 处理

规范夹具与生成器输出

Java 生产依赖仍为 springdoc 1.8.0 / 2.8.9 / Boot4 3.0.3。它们当前生成 OpenAPI 3.0.x 或 3.1.x。把 /v3/api-docs 里的 openapi 改成 3.2.0 不能当作真实 3.2 生成证据,也不构成本路线的 Java 生成验收。

来源实际输出本路线用法
Boot 2.x + springdoc 1.8.0OpenAPI 3.0.x3.0 回归
Boot 3.x / 4.x + springdoc 2.8.9 / 3.0.3OpenAPI 3.1.x3.1 回归
手写规范夹具OpenAPI 3.2.03.2 展示、调试、导出、变化跟踪与宿主承载

3.2 最小夹具与宿主夹具明确标注来源。Java 若要真实生成 3.2,需要维护者单独决定是否升级生产依赖。

产品能力矩阵

除非行内另有说明,“支持”指已发布 Java 5.7.0 / Go v0.8.0 上的完整 3.2.x feature set。

能力OAS 3.2 行为边界合入证据
版本与标准方法同一 minor feature set;QUERY 为 Path Item 固定字段不维护 patch 白名单#768 / #784
文档结构与诊断保留 3.2 对象、additionalOperations、结构诊断非规范输入拒绝,不改写成 3.1#769 / #785
资源图$self、跨文档引用、受控加载默认拒绝外部资源;指纹/导出不主动联网#770 / #787
SchemaEngine官方 3.2 方言与 JSON Schema 2020-12未知方言不回退成 3.1#771 / #788
QUERY / 自定义方法QUERY 与 COPY/Copy 等大小写保留TRACE/CONNECT/TRACK 仍被 Fetch 禁止#772 / #789
Tags / Server / Response层级 tags、server name、response summary#773 / #791
示例dataValue / serializedValue 与既有 value不是通用 JSON Schema 求解器#774 / #790
discriminator.defaultMapping判别属性可选时的默认映射提示不改变 JSON Schema 验证结果#775 / #795
XML nodeType#776 / #797
querystring / Cookie stylequerystring 使用 content,不能与有效 query 参数混用Cookie 仅预览/cURL,真实发送前阻断#777 / #793
Multipart 位置编码不读取上传文件字节#778 / #796
顺序媒体SSE、JSONL/NDJSON、JSON-seq、multipart未知媒体保留原始内容并给出 codec 诊断#779 / #799
安全方案URI 引用与 Device Authorization不注入客户端证书,不主动发 Webhook#780 / #801
单接口导出完整资源图下的 3.2 闭包3.1 导出器拒绝 3.2 文档#781 / #802
变化跟踪独立协议 oas3.2-v1与 3.0 / 3.1 基线隔离;只跟踪 paths#766 / #803
离线文档独立 3.2 HTML / Markdown / Word 快照3.1 快照拒绝 3.2#782 / #804
宿主承载WebJar doc.html、聚合 disk、Knife4x SpecURL3.2 使用规范夹具,不伪装 springdoc 输出#783

Schema 方言:

yaml
jsonSchemaDialect: https://spec.openapis.org/oas/3.2/dialect/2025-09-17

显式写出官方 3.2 方言时按该 URI 执行。根级 jsonSchemaDialect 省略时,SchemaEngine 按 OpenAPI 正文默认使用 https://spec.openapis.org/oas/3.1/dialect/base,不会改写成 3.2 方言。https://spec.openapis.org/oas/3.2/dialect/base 与其它未登记 URI 会报 UNSUPPORTED_DIALECT,不会静默当成 3.1。SchemaEngine 还执行 https://json-schema.org/draft/2020-12/schema

3.0 / 3.1 / 3.2 回归矩阵

主题3.0.x3.1.x3.2.x
入口版本既有 3.0 路径既有 3.1 路径独立 3.2 路径,不降级
标准方法无 QUERY 固定字段同 3.0Path Item 增加 query
自定义方法additionalOperations保留大小写;保留方法不可放入该对象
query 字段出现在 3.1 文档忽略,不当成 QUERY作为 QUERY 操作
Schema 方言OAS 3.0 Schemaoas/3.1/dialect/base显式 oas/3.2/dialect/2025-09-17;省略则回落 oas/3.1/dialect/base
示例value / externalValue同左并含 JSON Schema examples增加 dataValue / serializedValue
变化跟踪oas3.0-v1oas3.1-v1oas3.2-v1
离线导出3.0 快照3.1 快照拒绝 3.23.2 快照拒绝 3.1
生成器springdoc 1.8.0 → 3.0springdoc 2.8.9 / 3.0.3 → 3.1无当前生产生成器;只用规范夹具
失败路径OAS2 仍由 Vue3 处理未知方言/资源失败保持不可用querystring 与 query 混用等结构错误给出诊断

可执行矩阵见 front/ui-react/src/schema/oas32HostAcceptanceMatrix.test.ts,并保留既有 3.0/3.1 测试。

浏览器限制

OpenAPI 能表达的契约,不等于浏览器 JavaScript 都能发送。

场景文档展示浏览器调试
QUERY / COPY展示并保留方法拼写Fetch 可发送(仍受 CORS);离线导出仍可能标注 BROWSER_EXECUTION_UNSUPPORTED
TRACE / CONNECT / TRACK可展示Fetch 禁止发送
显式 Cookie 参数预览与 cURL真实发送前阻断
GET / HEAD 带 bodySchema / 示例 / cURLFetch 禁止带 body
Webhook展示、导出不从文档页主动发送
mutualTLS展示安全方案不注入客户端证书
未知顺序媒体保留原始内容 + codec 诊断不假装已解码
外部 $ref / $self / OAuth metadata URL显示位置默认拒绝;需对发现的精确 URI 授权,且不授予自动联网

宿主入口

已发布的 React WebJar、starter、聚合 disk 与 Knife4x 可以承载合法 3.2 JSON:

  • GET /doc.html 仍返回 webjars/knife4j-ui-react/
  • starter 的真实 /v3/api-docs 仍是当前 springdoc 的 3.0/3.1 输出;smoke 通过独立的 /synthetic/oas32.json 提供规范夹具,不改生成器版本字符串。
  • 聚合 disk 可同时挂 OpenAPI 3.1 文档和标注来源的 3.2 规范夹具;swagger-instance 原样返回文件内容。disk 路由的 swagger-version 仍写 "3.0"(相对 Swagger 2 的 OpenAPI 3 家族标签),不要把它改成 "3.2" 冒充新的已发布配置项。
  • Knife4x NewHandler 只校验 SpecURL 为 HTTP(S),不解析 OpenAPI 版本;嵌入 UI 加载 3.2 JSON,并拒绝 Swagger 2。入口仍不接受 YAML。

可见 UI 的无头验收:

bash
node front/ui-react/scripts/run-oas32-host-acceptance.mjs

该脚本只监听 127.0.0.1,使用仓库内规范夹具与已嵌入的 React 资源,不访问真实第三方凭据或 PII 服务。

从 OpenAPI 3.1 迁移

让文档真正成为 3.2,不要只改版本字符串。

QUERY 与自定义方法

yaml
paths:
  /health:
    get:
      summary: Read
    query:
      summary: Query
    additionalOperations:
      COPY:
        summary: Copy

3.1 文档里名为 query 的字段不会被当成 QUERY。GETQUERYPOST 等标准方法不能放进 additionalOperations

querystring 不能与 query 混用

yaml
# 合法:QUERY 只使用 querystring
parameters:
  - name: filter
    in: querystring
    content:
      application/json:
        schema:
          type: object

# 非法:同一有效参数集同时出现 query 与 querystring

示例字段

yaml
# OpenAPI 3.1 Media Type
examples:
  healthy:
    value:
      status: ok

# OpenAPI 3.2
examples:
  healthy:
    dataValue:
      status: ok

valuedataValue / serializedValue / externalValue 互斥。

方言

未声明 jsonSchemaDialect 时,3.2 文档仍使用正文默认 https://spec.openapis.org/oas/3.1/dialect/base。要按 3.2 方言执行,须显式写出 https://spec.openapis.org/oas/3.2/dialect/2025-09-17。未知方言(含 oas/3.2/dialect/base)会被拒绝,不会默认为 3.1。

最小有效夹具

它们包含 3.2 方言、QUERY、COPY、const、可空联合、SSE itemSchemadataValue 示例。更完整的宿主夹具在 front/ui-react/src/test-fixtures/oas32-normative/

规范依据

让 OpenAPI 文档更清晰,让接口联调更顺手。