OpenAPI Swagger codegen Spring Boot: проверка перечисления в качестве переменной пути

#spring-boot #swagger-codegen

#spring-boot #swagger-codegen

Вопрос:

Я использую swagger 2.0

Моя конечная точка

   /api/ideas/{idea_id}/{field}:
put:
  tags:
    - ideas
  operationId: UpdateIdeaField
  description: Update a field in an idea
  parameters:
    - name: idea_id
      in: path
      type: integer
      required: true
    - name: field
      in: path
      required: true
      type: string
      enum: [division,executive_sponsor,platform_contact]
  

Мне бы хотелось, чтобы при использовании недопустимого перечисления он выдавал 400. Однако прямо сейчас с недопустимым перечислением он принимает его.

Что генерирует swagger codegen

     @ApiOperation(value = "", nickname = "updateIdeaField", notes = "Update a field in an idea", response = IdeaVM.class, authorizations = {
    @Authorization(value = "openId", scopes = {
        
        })
}, tags={ "ideas", })
@ApiResponses(value = { 
    @ApiResponse(code = 200, message = "Idea updated", response = IdeaVM.class),
    @ApiResponse(code = 400, message = "Bad Request", response = ProblemVM.class),
    @ApiResponse(code = 401, message = "Unauthorized", response = ProblemVM.class),
    @ApiResponse(code = 403, message = "Forbidden", response = ProblemVM.class),
    @ApiResponse(code = 404, message = "Not Found", response = ProblemVM.class),
    @ApiResponse(code = 422, message = "Unprocessable Entity", response = ProblemVM.class),
    @ApiResponse(code = 200, message = "Something went wrong", response = ProblemVM.class) })
@RequestMapping(value = "/api/ideas/{idea_id}/{field}",
    produces = { "application/json", "application/problem json" }, 
    method = RequestMethod.PUT)
default ResponseEntity<IdeaVM> _updateIdeaField(@ApiParam(value = "",required=true) @PathVariable("idea_id") Integer ideaId,@ApiParam(value = "",required=true, allowableValues = ""division", "executive_sponsor", "platform_contact"") @PathVariable("field") String field) {
    return updateIdeaField(ideaId, field);
}

// Override this method
default ResponseEntity<IdeaVM> updateIdeaField(Integer ideaId,String field) {
    if(getObjectMapper().isPresent() amp;amp; getAcceptHeader().isPresent()) {
        if (getAcceptHeader().get().contains("application/json")) {
            try {
                return new ResponseEntity<>(getObjectMapper().get().readValue("{  "submitted_date" : "2019-10-03T22:45:465Z",  "gp_status" : "IN_REVIEW",  "challenge_id" : 897,  "account_executive" : "0f4c0f7e-18ce-4b7c-bd48-f4121790dd90",  "platform_contact" : "Walter Waldo",  "public_id" : "201e6466-6924-11ea-bc55-0242ac130003",  "entered_gate_date" : "2019-10-03T22:45:465Z",  "division" : "Asett Managment",  "idea_type" : "201e6466-6924-11ea-bc55-0242ac130003",  "read_only" : false,  "collaborators" : [ "b4bd2cc9-def8-4b85-86d3-40fb0225542a", "400f3605-864a-4cb1-8968-03c831fc49e8" ],  "publication_date" : "2019-10-03T22:45:465Z",  "rank" : 1576844,  "id" : 1,  "views_count" : 201,  "pending_collaborators" : [ "john.smith1@companydomain.com", "john.smith2@companydomain.com" ],  "brief" : "We want to explore and ideate solutions which can be utilised to increase last minute bookings",  "owner" : "0f4c0f7e-18ce-4b7c-bd48-f4121790dd90",  "image_link" : "https",  "idea_description" : {    "answers" : [ {      "answer" : "The Answer to the Ultimate Question of Life, the Universe, and Everything is... 42",      "question_id" : 1    }, {      "answer" : "The Answer to the Ultimate Question of Life, the Universe, and Everything is... 42",      "question_id" : 1    } ]  },  "creation_date" : "2019-10-03T22:45:465Z",  "modified_date" : "2019-10-03T22:45:465Z",  "killed_on_hold_date" : "2019-10-03T22:45:465Z",  "executive_sponsor" : "Wally Waldo",  "tags" : [ "Cancellation", "Last minute bookins", "Delays", "Satisfaction" ],  "total_invested" : 132000,  "likes_count" : 126,  "review_date" : "2019-10-03T22:45:465Z",  "mentors" : [ "b4bd2cc9-def8-4b85-86d3-40fb0225542a", "400f3605-864a-4cb1-8968-03c831fc49e8" ],  "followers_count" : 7,  "name" : "Last minute booking promotions",  "is_public" : false,  "gate" : {    "active" : true,    "id" : 1,    "display_name" : "Discovery",    "key" : "gate_discovery",    "order" : 1  },  "status" : "DRAFT"}", IdeaVM.class), HttpStatus.NOT_IMPLEMENTED);
            } catch (IOException e) {
                log.error("Couldn't serialize response for content type application/json", e);
                return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
    } else {
        log.warn("ObjectMapper or HttpServletRequest not configured in default IdeasApi interface so no example is generated");
    }
    return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
}
  

Я ценю любую помощь

Предложение Olehs заключается в следующем, сгенерированный результат остается тем же. Поле представляет собой строку в сгенерированном интерфейсе, и я могу отправлять недопустимые перечисления

   /api/ideas/{idea_id}/{field}:
put:
  tags:
    - ideas
  operationId: UpdateIdeaField
  description: Update a field in an idea
  parameters:
    - name: idea_id
      in: path
      type: integer
      required: true
    - name: field
      in: path
      required: true
      type: string
      schema:
        $ref: '#/definitions/MyEnum'
    - in: body
      name: value
      required: true
      schema:
        $ref: '#/definitions/UpdateIdeaFieldRequest'
  

Комментарии:

1. любое решение для этого?

Ответ №1:

вы пытались создать отдельный объект enum?

 MyEnum:
  type: string
  enum:
 - value1
 - value2
  
 /api/ideas/{idea_id}/{field}:
put:
  tags:
    - ideas
  operationId: UpdateIdeaField
  description: Update a field in an idea
  parameters:
    - name: idea_id
      in: path
      type: integer
      required: true
    - name: field
      in: path
      required: true
      schema:
        $ref: '#/definitions/MyEnum'
    - in: body
      name: value
      required: true
      schema:
        $ref: '#/definitions/UpdateIdeaFieldRequest'
  

а затем просто используйте $ref это перечисление

Комментарии:

1. Итак, я попробовал следующее, и оно по-прежнему отображается как строка в сгенерированном коде, и все то же самое. Я могу отправить недопустимое перечисление

2. в вашем примере вы все еще используете схему тип. используйте только схему

3. Если я удаляю схему, она не генерируется.

4. вы не получили) оставьте схему, но введите удаленный тип в объявлении параметра « — name: поле в: требуется путь: true schema: $ref: ‘#/definitions/MyEnum’ «

5. извините, не могли бы вы отредактировать свой OP для правильного форматирования

Ответ №2:

вы можете попробовать создать пользовательский конвертер для преобразования строки в перечисление, как показано здесь: https://www.baeldung.com/spring-enum-request-param#clone

Комментарии:

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