#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. Пожалуйста, не полагайтесь на внешнюю ссылку для части вашего ответа «как». Ответы должны быть автономными и содержать ссылки только на другие сайты для справки. Если этот сайт исчезнет или переместится в будущем, этот ответ все равно должен быть полезен для других.