很多人以为这是AI模型能力不够,但在实际落地时你会发现,问题往往集中在三个环节:你喂给AI的输入结构本身就很混乱,上下文切片毫无章法,最后的校验环节形同虚设。只要把这些关键点打通,AI完全可以成为API文档生成的高效工具。
核心流程其实可以拆解为四个关键步骤,每一步都是从实战踩坑中总结出的解决方案。
第一步:只喂AST解析后的代码切片,别扔整个.ja va文件
直接把OrderController.ja va全文件丢给AI会怎样?AI会陷入信息过载——它会混淆工具类方法、日志打印逻辑、异常捕获块,甚至把@Log注解误认成权限控制,把catch块里的error message当成400响应描述。经过几次测试你会发现,AI对无关代码的“脑补”能力相当惊人。
正确的做法是:用AST工具对代码做一次预过滤,只保留包含@Controller注解的类中,标有@RequestMapping或@PostMapping的方法签名,再加上核心的业务代码块。
实际操作中,可以用Ja vaParser或者Spring Boot自带的spring-boot-configuration-processor来扫描项目,导出一份method-signature.json。从中提取出路径、HTTP动词、@RequestBody类型、@PathVariable变量名——这些都是最小必要的上下文信息。把这段干净的“代码切片”粘贴到AI对话框里,而不是丢一整份源码文件。
这一步做对之后,AI生成文档的混乱程度会直接下降一大截。
第二步:强制AI输出结构化YAML,禁用自然语言解释
很多翻车的根本原因,其实不是AI写错了,而是它给你写了一堆中文描述:“该接口用于创建订单,建议在用户登录后调用”——这些内容Swagger根本扫不到,CI/CD也解析不了。必须在Prompt层面锁死输出格式,不给AI任何自由发挥的空间。
这里分享三个实测有效的解法。
方法一:用XML标签限定输出域。
直接在Prompt开头写,结尾加上。这个方案对Claude的响应效果最稳定。
方法二:用```yaml包裹指令。
更直白的做法是,直接给AI一个完整示例,让它按这个格式输出,不要有任何额外文字。示例中包含路径定义、请求体、响应体、schema引用——相当于给它一个样板,剩下的让它自己填。
方法三:指定字段必填项。
在Prompt末尾明确写死约束条件,比如:“responses必须包含200、400、500三个状态码条目;parameters中每个字段必须标注required: true/false;schema中所有string字段必须提供example值”。AI知道这是一道“填空题”,自然不会擅自加戏。
第三步:用Swagger Editor做语法校验,再导入本地Swagger UI
AI生成的YAML看起来再完美,也一定要拿到官方工具里过一遍。步骤很简单:
① 把YAML内容粘贴到 https://editor.swagger.io ,点击“Validate”;
② 如果报错“Missing required property: paths”,说明AI漏了根节点,手动补上即可;
③ 如果提示“$ref to undefined component”,说明schema引用路径错了,回到components下确认对应schema是否存在;
④ 验证通过后,保存为openapi.yaml,放进Spring Boot项目的src/main/resources目录;
⑤ 启动应用,访问 http://localhost:8080/swagger-ui.html,确认接口路径、参数表格、Try it out按钮全部可交互。
值得留意的是,Swagger UI不支持直接加载本地YAML文件,必须通过springdoc-openapi配置自动挂载,否则页面会一片空白。这块配置踩过的人都懂。
第四步:对接CI/CD,在Git Push后自动生成并覆盖文档
手动校验做完了,下一步就是把这个流程自动化。在Ma ven的pom.xml里添加springdoc-openapi-ma ven-plugin插件,把generate目标绑定到verify阶段,配置输入文件路径和输出文件名。
然后在GitLab CI脚本里加两行:
mvn clean verify -Dspringdoc.api-docs.path=/v3/api-docscurl -X POST "http://yapi-server/api/project/123/interface/import" -F "file=@target/generated-openapi.json" -F "token=abc123"
这一套跑通之后,效果非常直观:每次git push,YApi平台上的接口列表自动刷新,前端工程师打开页面看到的就是最新的字段和示例值。联调环节里“文档又过期了”这种经典甩锅理由,从此不复存在。

