如何注解DTO以使其结构正常显示在SwaggerUI的Schema区域
核心配置修改方案
你遇到的问题是Swagger3(OpenAPI3)对请求体类型识别异常,核心错误有两处:
@Operation下的requestBody的@Content注解未显式指定schema属性,仅配置示例会被Swagger默认识别为字符串类型的请求体- 不需要在方法的
@RequestBody参数上额外加@Parameter注解,该注解是给路径参数、查询参数等非请求体参数使用的,加在这里会干扰Swagger的类型识别
控制器修改示例
@RequestMapping(value = "/{myPathVar}", method = RequestMethod.POST) @Operation(summary = "Create something.", parameters = { @Parameter(in = ParameterIn.PATH, name = "myPathVar", description = "Some path variable. Swagger uses this description.") }, requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody( description = "My description here.", content = @Content( // 新增这行指定请求体对应的DTO类 schema = @Schema(implementation = MyDto.class), examples = @ExampleObject("{\"A\" : \"a\",\"B\" : {\"b\" : \"foo\", \"bb\" : \"bar\"}}")))) @ApiResponse(content = @Content(schema = @Schema(implementation = MyReturningType.class))) public MyReturningType doSomethingCool( @Parameter(description = "Some description Swagger ignores.", example = "123") @PathVariable(value = "myPathVar") int myPathVar, // 删掉原本加在这里的@Parameter注解,仅保留@RequestBody @RequestBody MyDto dto) { // do something cool }
DTO类配置示例
public class MyDto { // 字段上添加@Schema注解配置描述、示例等信息 @Schema(description = "测试整数字段", example = "100") private int someInt; @Schema(description = "测试字符串字段", example = "测试内容") private String someString; @Schema(description = "测试通用对象字段") private Object someObject; // 必须添加所有字段的getter、setter方法,否则Swagger无法识别字段结构 public int getSomeInt() { return someInt; } public void setSomeInt(int someInt) { this.someInt = someInt; } public String getSomeString() { return someString; } public void setSomeString(String someString) { this.someString = someString; } public Object getSomeObject() { return someObject; } public void setSomeObject(Object someObject) { this.someObject = someObject; } }
验证要点
- 确保项目使用的是OpenAPI3(springdoc)相关依赖,而非旧版Swagger2依赖
- 启动项目后打开SwaggerUI,找到对应接口,请求体的Schema区域就会自动展示MyDto的所有字段结构、描述和示例
内容的提问来源于stack exchange,提问作者81n0n4b1bK
相关产品推荐
相关产品推荐

