Как удалить тело ответа операции в Springfox Swagger?

Я работаю в службе REST, созданной с помощью spring -boot, которая до сих пор документирована с помощью 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."
  }
}

Если эта операция ничего не возвращает, я понимаю, что в ответе «204» не должно быть поля schema (как и в другом).

Я попытался указать response = Void.class в аннотации @ApiParam (как предлагается в других потоках) без особого удовольствия (поскольку это значение по умолчанию, оно неотличимо от того, чтобы не указывать его).

Я также пробовал установить genericModelSubstitutes(ResponseEntity.class) в свой Docket bean, но ничего не сделал.

Я знаю, что вместо возврата ResponseEntity я мог бы вернуть void и выбросить и исключить, если someMethodReturnsTrue() действительно вернет false. Затем метод @ExceptionHandler может превратить это исключение в код состояния 403.

Я думаю, что это перебор, я думаю, мне не следует менять свою реализацию, чтобы исправить мою документацию. Вот почему я спрашиваю, есть ли способ указать Springfox игнорировать возвращаемое значение этого конкретного метода и рассматривать его, как если бы он возвращал void?

Спасибо.


person Iñaki    schedule 03.09.2018    source источник


Ответы (2)


Добавлять:

@ApiResponse(code = 204, response = void.class, message = "No Content")

к вашей @ApiResponses({ ... }) аннотации. Важно то, что void.class используется вместо Void.class. Таким образом, оно отличается от значения по умолчанию, и вы по-прежнему можете использовать ResponseEntity в качестве возвращаемого типа.

person Vladas Maier    schedule 12.10.2018
comment
Это не работает. По-прежнему показывает тело ResponseEntity. Вы должны фактически сделать тип возвращаемого значения метода ресурса недействительным, чтобы удалить тело ответа из документов. К сожалению, я не могу найти способ получить ResponseEntity (например, только с заголовками), который в документации не отображается как тело. : / - person etech; 09.03.2019
comment
Привет, я действительно нашел решение для возврата ResponseEntity в методе ресурса, при этом в документации отображается пустое тело: github.com/springfox/springfox/issues/1884 - person etech; 09.03.2019

Обнаружено обходное решение. По умолчанию @ApiOperation возвращает возвращаемый тип метода, поэтому для каждого статуса будет возвращен возвращаемый тип метода. Если вы хотите отправить пустой ответ, напишите

@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, swagger автоматически преобразует его в Void.class.

person Vipin Gupta    schedule 25.06.2019