如何删除 Springfox Swagger 中操作的响应主体?
How to remove the response body of an operation in Springfox Swagger?
我正在使用 spring-boot 制作的 REST 服务中工作,迄今为止使用 springfox-swagger2:2.7.0(首先实现)对其进行了记录。我添加的最后一个操作如下所示:
@ApiOperation(value = "whatever")
@ApiResponses({
@ApiResponse(code = HttpURLConnection.HTTP_NO_CONTENT, message = "Returns empty content when succeeds"),
@ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = "You can't do that.")
})
@CrossOrigin
@PreAuthorize("hasAuthority('USER_ACCESS')")
@RequestMapping(value = "/foo", method = POST, consumes = APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public ResponseEntity postFoo(
@RequestBody
FooRequestBody requestBody) {
if (someMethodReturnsTrue()) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
现在,问题是无论如何,生成的 Swagger 定义最终看起来像这样:
"responses": {
"204": {
"description": "Returns empty content when succeeds",
"schema": {
"$ref": "#/definitions/ResponseEntity"
}
},
"403": {
"description": "You can't do that."
}
}
假设这个操作return没什么,我理解“204”响应应该没有schema
字段(和另一个一样)。
我已经尝试在 @ApiParam
注释中指定 response = Void.class
(如其他线程中所建议的那样),但并不愉快(因为它是默认值,与未指定它没有区别)。
我也试过在我的 Docket
bean 中设置 genericModelSubstitutes(ResponseEntity.class)
,但没有任何效果。
我知道我可以 return void
而不是 returning ResponseEntity
并在 someMethodReturnsTrue()
return 的情况下抛出异常确实 false
。然后 @ExceptionHandler
方法可以将该异常转换为 403 状态代码。
我认为这是矫枉过正,我认为我不应该更改我的实现来修复我的文档。这就是为什么我问,有什么办法可以告诉 Springfox 忽略那个特定方法的 return 值,并将其视为 returned void
?
谢谢。
添加:
@ApiResponse(code = 204, response = void.class, message = "No Content")
您的 @ApiResponses({ ... })
注释。重要的是使用 void.class
而不是 Void.class
。所以它与默认值不同,您仍然可以使用 ResponseEntity
作为 return 类型。
找到解决方法,
由于@ApiOperation 的默认行为是return return 类型的方法,因此对于每个状态,return 类型的方法将被returned。
如果你想发送空响应然后写
@ApiResponse(code = 204, message = "No User found for that Id",response = Object.class)
并在 SwaggerConfig 中写入
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.directModelSubstitute(Object.class, java.lang.Void.class);
}
因此,每当 Object.class 被 returned 时,swagger 会自动将其转换为 Void.class
我正在使用 spring-boot 制作的 REST 服务中工作,迄今为止使用 springfox-swagger2:2.7.0(首先实现)对其进行了记录。我添加的最后一个操作如下所示:
@ApiOperation(value = "whatever")
@ApiResponses({
@ApiResponse(code = HttpURLConnection.HTTP_NO_CONTENT, message = "Returns empty content when succeeds"),
@ApiResponse(code = HttpURLConnection.HTTP_FORBIDDEN, message = "You can't do that.")
})
@CrossOrigin
@PreAuthorize("hasAuthority('USER_ACCESS')")
@RequestMapping(value = "/foo", method = POST, consumes = APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.NO_CONTENT)
public ResponseEntity postFoo(
@RequestBody
FooRequestBody requestBody) {
if (someMethodReturnsTrue()) {
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
现在,问题是无论如何,生成的 Swagger 定义最终看起来像这样:
"responses": {
"204": {
"description": "Returns empty content when succeeds",
"schema": {
"$ref": "#/definitions/ResponseEntity"
}
},
"403": {
"description": "You can't do that."
}
}
假设这个操作return没什么,我理解“204”响应应该没有schema
字段(和另一个一样)。
我已经尝试在 @ApiParam
注释中指定 response = Void.class
(如其他线程中所建议的那样),但并不愉快(因为它是默认值,与未指定它没有区别)。
我也试过在我的 Docket
bean 中设置 genericModelSubstitutes(ResponseEntity.class)
,但没有任何效果。
我知道我可以 return void
而不是 returning ResponseEntity
并在 someMethodReturnsTrue()
return 的情况下抛出异常确实 false
。然后 @ExceptionHandler
方法可以将该异常转换为 403 状态代码。
我认为这是矫枉过正,我认为我不应该更改我的实现来修复我的文档。这就是为什么我问,有什么办法可以告诉 Springfox 忽略那个特定方法的 return 值,并将其视为 returned void
?
谢谢。
添加:
@ApiResponse(code = 204, response = void.class, message = "No Content")
您的 @ApiResponses({ ... })
注释。重要的是使用 void.class
而不是 Void.class
。所以它与默认值不同,您仍然可以使用 ResponseEntity
作为 return 类型。
找到解决方法, 由于@ApiOperation 的默认行为是return return 类型的方法,因此对于每个状态,return 类型的方法将被returned。 如果你想发送空响应然后写
@ApiResponse(code = 204, message = "No User found for that Id",response = Object.class)
并在 SwaggerConfig 中写入
@Bean
public Docket productApi() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.directModelSubstitute(Object.class, java.lang.Void.class);
}
因此,每当 Object.class 被 returned 时,swagger 会自动将其转换为 Void.class