如何在Springfox Swagger中删除操作的响应主体?

Iña*_*aki 5 java spring-mvc swagger-2.0 springfox openapi

我正在使用 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,无论如何,生成的 Swagger 定义最终看起来像这样:

"responses": {
  "204": {
    "description": "Returns empty content when succeeds",
    "schema": {
      "$ref": "#/definitions/ResponseEntity"
    }
  },
  "403": {
    "description": "You can't do that."
  }
}
Run Code Online (Sandbox Code Playgroud)

如果此操作不返回任何内容,我知道“204”响应应该没有schema字段(与另一个操作一样)。

我尝试在注释response = Void.class中指定@ApiParam(如其他线程中建议的那样),但没有任何喜悦(因为它是默认值,所以与不指定它没有区别)。

我也尝试过genericModelSubstitutes(ResponseEntity.class)在我的Docket豆子中设置,但没有任何效果。

我知道,如果确实返回,ResponseEntity我可以返回void并抛出异常,而someMethodReturnsTrue()不是返回false。然后,一种@ExceptionHandler方法可以将该异常转换为 403 状态代码。

我认为这太过分了,我认为我不应该改变我的实现来修复我的文档。这就是为什么我问,有没有办法告诉 Springfox 忽略该特定方法的返回值并将其视为返回值void

谢谢。

Vip*_*pta 5

找到了解决方法,由于@ApiOperation的默认行为是返回方法的返回类型,因此对于每个状态,都会返回方法的返回类型。如果你想发送空响应,那么写

@ApiResponse(code = 204, message = "No User found for that Id",response = Object.class)
Run Code Online (Sandbox Code Playgroud)

并在SwaggerConfig中写入

 @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                .directModelSubstitute(Object.class, java.lang.Void.class);          
    }
Run Code Online (Sandbox Code Playgroud)

因此,每当返回 Object.class 时,swagger 都会自动将其转换为 Void.class


Vla*_*ier 2

添加:

@ApiResponse(code = 204, response = void.class, message = "No Content")
Run Code Online (Sandbox Code Playgroud)

到你的@ApiResponses({ ... })注释。重要的是void.class使用 代替Void.class. 因此它与默认值不同,您仍然可以用作ResponseEntity返回类型。

  • 嗨,我实际上找到了一个在资源方法中返回 ResponseEntity 的解决方案,同时让它在文档中显示一个空体:https://github.com/springfox/springfox/issues/1884 (2认同)