Estoy trabajando en un servicio REST hecho con el resorte de la inicialización, que hasta hoy se documentan con springfox-swagger2: 2.7.0 (aplicación en primer lugar). La última operación que he añadido es similar al siguiente:
@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();
}
}
Ahora, el problema es que no importa qué, termina la definición Swagger generada por parecerse a esto:
"responses": {
"204": {
"description": "Returns empty content when succeeds",
"schema": {
"$ref": "#/definitions/ResponseEntity"
}
},
"403": {
"description": "You can't do that."
}
}
Siempre que esta operación vuelve nada, entiendo que la respuesta "204" no debe tener ningún schema
campo (como el otro).
He intentado especificando response = Void.class
en la @ApiParam
anotación (como se sugiere en otros hilos) sin alegría (ya que es el valor por defecto es indistinguible de no especificarlo).
También he intentado fijar genericModelSubstitutes(ResponseEntity.class)
en mi Docket
frijol y que no hizo nada.
Sé que en vez de volver ResponseEntity
yo pudiera regresar void
y lanzar y excepción en casos de someMethodReturnsTrue()
retornos de hecho false
. Un @ExceptionHandler
método podría entonces convertir esa excepción en un código de estado 403.
Creo que esto es una exageración, creo que no debería estar cambiando mi aplicación para arreglar mi documentación. Por eso me pregunto, ¿hay alguna manera de saber Springfox ignorar el valor de retorno de ese método específico y tratarlo como si fuera devuelto void
?
Gracias.
Añadir:
@ApiResponse(code = 204, response = void.class, message = "No Content")
a su @ApiResponses({ ... })
anotación. Es importante que void.class
se utiliza en lugar de Void.class
. Por lo que es diferente del valor por defecto y todavía se puede utilizar ResponseEntity
como un tipo de retorno.