1. 概述

Swagger 是目前主流的 REST API 文档规范,不仅能自动生成接口文档,还能提供参数的示例值,极大提升前后端协作效率。

但在实际使用中,有一个常见的“踩坑点”:当你想在接口请求体中传一个字符串数组(String[]List<String>)时,Swagger 默认并不会展示清晰的示例数据。这会让调用方一脸懵:到底该怎么传?

比如在 Swagger Editor 中,默认生成的数组参数示例是这样的:

swagger description array without example 1

⚠️ 看起来是不是有点抽象?根本看不出数组里该填啥。

本文就来解决这个问题——如何为字符串数组类型的请求体参数添加清晰的示例值


2. 问题场景:Swagger 中的字符串数组参数

当你的接口接收一个字符串数组作为 request body 时,例如:

["apple", "banana", "cherry"]

Swagger 默认的 schema 生成机制并不会自动填充 example 字段,导致前端或测试人员无法直观了解请求格式。

目标是让文档展示出类似下面这样清晰的示例:

swagger description array 1

✅ 这样一目了然,调用方直接照着填就行。

下面介绍两种解决方案:原生 YAML 配置 和 Spring Boot 项目中常用的 Springdoc 注解方式。


3. 使用 YAML 手动定义示例

如果你是手写 OpenAPI/Swagger YAML 文件,可以直接在 parameters 中指定 example

parameters:
  - in: body
    description: ""
    required: true
    name: name
    schema:
      type: array
      items:
        type: string
      example: ["str1", "str2", "str3"]

关键点:

  • type: array 表示这是一个数组
  • items.type: string 定义元素类型为字符串
  • example 字段显式提供示例值,Swagger UI 就能正确渲染

效果如上图所示,现在用户一看就知道该怎么传参了。


4. 使用 Springdoc 实现(Spring Boot 场景)

大多数 Java 项目使用的是 Spring Boot + Springdoc(即 springdoc-openapi),通过注解来自动生成文档。

4.1 数据模型中添加 @Schema 注解

在 DTO 类中,使用 @Schema 注解明确指定数组类型和示例值:

@Schema
public class Foo {
    private long id;
    
    @Schema(
        name = "name", 
        type = "array", 
        example = "[\"str1\", \"str2\", \"str3\"]"
    )
    private List<String> name;
    
    // getter & setter
}

⚠️ 注意:

  • example 必须是合法的 JSON 字符串格式,所以要用转义引号
  • type = "array" 明确声明类型,避免推断错误

4.2 控制器接口标注 @Parameter

为了让 Swagger 知道这个参数来自哪个模型,还需要在 Controller 方法上使用 @Parameters@Parameter 注解:

@RequestMapping(method = RequestMethod.POST, value = "/foos")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
@Parameters({ 
    @Parameter(name = "foo", description = "List of strings") 
})
public Foo create(@RequestBody final Foo foo) {
    // 业务逻辑
    return foo;
}

✅ 这样 Springdoc 就能把 Foo 类中的 @Schema 示例正确映射到 UI 上。


5. 总结

方式 适用场景 是否推荐
YAML 手动编写 API 文档独立维护 ✅ 适合标准化团队
Springdoc 注解 Spring Boot 项目 ✅✅ 强烈推荐

核心要点:

  • ❌ Swagger 默认不为数组生成示例,容易造成沟通成本
  • ✅ 使用 example 字段(YAML)或 @Schema(example = "...")(Java)可解决
  • ⚠️ 示例值必须是合法 JSON 格式,注意转义
  • 推荐在所有涉及集合参数的接口中都显式添加示例,提升文档可用性

示例代码已托管至 GitHub:https://github.com/eugenp/tutorials/tree/master/spring-boot-modules/spring-boot-swagger-2


原始标题:Specify an Array of Strings as Body Parameters in Swagger