Должен ли я быть в состоянии определить ресурс POST с необязательным телом сообщения? - PullRequest
0 голосов
/ 10 июня 2019

Я использую OpenApi3, чтобы определить мой API, и https://mvnrepository.com/artifact/org.openapitools/openapi-generator-gradle-plugin, чтобы генерировать пружинные REST-контроллеры и модели из определения API.

Я хочу иметь конечную точку, которая принимает опционально тело запроса в формате JSON.Упрощенный пример:

  /foo/{id}/bar:
      post: # ok
          parameters:
              - in: path
                name: id
                schema:
                    type: string
          requestBody:
              required: false
              content:
                  application/json:
                      schema:
                          type: object
                          properties:
                              bazuu:
                                  type: string
          responses:
              '200':
                  description: ok

Согласно https://swagger.io/docs/specification/describing-request-body/,

Тела запроса являются необязательными по умолчанию

Я все еще добавилдополнительный required: false, чтобы попытаться сделать это тело запроса необязательным (напрасно).Попытка вызова этой конечной точки без тела запроса приводит к:

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<java.lang.Void> org.my.restapi.openapi.FooApiController.fooIdBarPost(java.lang.String,org.my.restapi.openapi.model.InlineObject11)

Это потому, что генератор создает параметр bazuu как @Valid @RequestBody InlineObject11 inlineObject11.Если я вручную изменю аннотацию RequestBody на required = false, моя конечная точка также принимает запросы без тела.

Одно исправленное вручную:

@ApiOperation(value = "", nickname = "fooIdBarPost", notes = "", authorizations = {
    @Authorization(value = "ApiKeyAuth")
}, tags={  })
@ApiResponses(value = { 
    @ApiResponse(code = 200, message = "ok") })
@RequestMapping(value = "/foo/{id}/bar",
    consumes = { "application/json" },
    method = RequestMethod.POST)
default ResponseEntity<Void> fooIdBarPost(@ApiParam(value = "",required=true) @PathVariable("id") String id,@ApiParam(value = ""  )  @Valid @RequestBody(required = false) InlineObject11 inlineObject11) {
    return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

}

и класс оболочки

@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2019-06-10T12:43:04.880+03:00[Europe/Helsinki]")

public class InlineObject11   {
  @JsonProperty("bazuu")
  private String bazuu;

  public InlineObject11 bazuu(String bazuu) {
    this.bazuu = bazuu;
    return this;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...