Я использую 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;
}