springfox-swagger2不同状态码响应模型配置失效问题及解决
Springfox Swagger2: 204无内容响应错误引用200模型问题解决
嘿,这个问题我之前也碰到过!这是Springfox Swagger2的一个常见小坑:当你的方法返回ResponseEntity<AccessResponse>时,框架会默认把所有响应的Schema都绑定到泛型里的AccessResponse,哪怕你在@ApiResponse里明确指定204状态要用Void.class,也会被这个默认逻辑覆盖掉。
问题根源
Springfox在解析方法返回类型时,会优先提取ResponseEntity的泛型类型作为全局默认响应Schema,而不会逐个响应去读取@ApiResponse里指定的response类型。所以哪怕你给204配置了Void.class,框架还是会用方法返回泛型的AccessResponse来填充。
可行的解决方案
1. 给204的@ApiResponse添加responseContainer参数
这是最简单的修复方式,只需要在204对应的@ApiResponse里加上responseContainer = "Void",明确告诉框架这个响应是无内容的:
@ApiResponses({ @ApiResponse(code = 200, message = "okay, there you go", response = AccessResponse.class), @ApiResponse(code = 204, message = "I got nothing for you", response = Void.class, responseContainer = "Void") })
这样Springfox就能正确识别该响应不需要返回实体模型了。
2. 自定义Swagger全局响应配置
如果上面的方法不生效,你可以通过Docket配置手动覆盖204的响应定义,禁用默认的响应消息避免干扰:
@Configuration public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("your.application.package")) .paths(PathSelectors.any()) .build() .useDefaultResponseMessages(false) // 关闭默认响应消息,防止冲突 .globalResponses(HttpMethod.GET, List.of( new ResponseBuilder() .code("204") .description("I got nothing for you") .build() // 这里不指定schema,自然就是无内容 )); } }
3. 升级Springfox版本
这个问题在Springfox 2.9.2及以上的版本中已经被官方修复了。如果你还在使用旧版本,直接升级到最新的稳定版,可能不需要做任何额外配置,就能让@ApiResponse里的Void.class生效。
验证效果
修改完成后重新生成Swagger文档,你会看到204的响应部分不再引用AccessResponse模型:
"responses":{ "200":{ "description":"okay, there you go", "schema":{"$ref":"#/definitions/AccessResponse"} }, "204":{ "description":"I got nothing for you" } }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

