#java #swagger #vert.x #swagger-codegen
Вопрос:
Используя swagger vertx codegen, я сгенерировал несколько файлов verticle. В одном примере я пытаюсь разрешить пользователю передавать мне строку даты и времени. Моя характеристика чванства выглядит следующим образом:
/test/my/endpoint:
post:
tags:
- endpoint
summary: test
description: test
operationId: test
produces:
- application/json
parameters:
- name: from_date
in: query
description: |
The start date for the report. Must be used together with `to_date`.
required: false
type: string
format: date-time
- name: to_date
in: query
description: |
The end date for the report. Must be used together with `from_date`.
required: false
type: string
format: date-time
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/TestSchema'
'500':
description: internal server error
schema:
$ref: '#/definitions/TestSchema'
x-contentType: application/json
x-accepts: application/json
Кодген Vertx-Swagger затем в вертикали генерирует что-то вроде этого:
// in MyApiVerticle.java
final Handler<Message<JsonObject>> postMyHandler = message -> {
try {
OffsetDateTime fromDate = null;
if(message.body().getString("from_date") != null) {
fromDate = Json.mapper.readValue(message.body().getString("from_date"), OffsetDateTime.class);
} catch (Exception e) { ... }
}
Когда я пробую эту конечную точку со строкой, подобной этой:
2021-06-06T10:50:00Z
Я получаю следующую ошибку:
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): Expected space separating root-level values at [Source: 2021-06-06T10:50:00Z; line: 1, column: 6]
Отправляемый запрос выглядит следующим образом:
http request:
http://localhost:8080/api/test/my/endpoint?from_date=2021-06-06T10:50:00Zamp;to_date=2021-06-06T11:50:00Z
curl:
curl -X 'POST'
'http://localhost:8080/api/test/my/endpoint?from_date=2021-06-06T10:50:00Zamp;to_date=2021-06-06T11:50:00Z'
-H 'accept: application/json'
-d ''
Если я распечатаю message.body()
, я увижу следующее, прежде чем возникнет исключение:
{"from_date":"2021-06-06T10:50:00Z","to_date":"2021-06-06T11:50:00Z"}
Если я передам 0
оба значения from_date
и to_date
, это, похоже, сработает, и дата станет «1970-01-01T00:00Z» для обоих полей.
Как мне это исправить? Неверен ли формат строки? После того, как я немного покопался, это кажется правильным: https://swagger.io/docs/specification/data-models/data-types/
Подробное исключение:
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): Expected space separating root-level values
at [Source: 2021-06-06T10:50:00Z; line: 1, column: 6]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1586)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:521)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:450)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportMissingRootWS(ParserMinimalBase.java:466)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._verifyRootSpace(ReaderBasedJsonParser.java:1598)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._parsePosNumber(ReaderBasedJsonParser.java:1248)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:705)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3847)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3792)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2797)
at com.my.testƒƒ.api.MyApiVerticle.lambda$new$0(MyApiVerticle.java:31)
at io.vertx.core.eventbus.impl.HandlerRegistration.deliver(HandlerRegistration.java:223)
at io.vertx.core.eventbus.impl.HandlerRegistration.handle(HandlerRegistration.java:200)
at io.vertx.core.eventbus.impl.EventBusImpl.lambda$deliverToHandler$3(EventBusImpl.java:533)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:339)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:834)
Любая помощь будет оценена по достоинству!
Комментарии:
1. Пожалуйста, не могли бы вы показать полный JSON запроса, который вы отправляете?
2. @JonSkeet этот запрос на публикацию не принимает банкомат с телом JSON. Таким образом, запрос выглядит следующим образом: localhost:8080/api/тест/мой/…
3. Я далек от эксперта по чванству, но код
message.body().getString("from_date")
, похоже, пытается получитьfrom_date
свойство из тела сообщения. Я бы ожидал, что JSON{ "from_date": "2021-06-06T10:50:00Z" }
, например. Если вы не используете тело сообщения в запросе, почему ваш код ссылается на тело? Что жеmessage
в данном случае? Тот факт, что это исключение JsonParseException, когда у вас нет JSON, особенно подозрителен. Возможно, все это артефакт Свэггера и Vertx, но со стороны это выглядит очень странно.4. Это СООБЩЕНИЕ, но в нем нет тела-параметры указаны в URL.
5. @JonSkeet так что я не думаю, что это связано с телом, потому что если я делаю запрос, как это: локальный:8080/API-интерфейс/тест/мой/конечную точку?from_date=0amp;даты=0 , то в бэкэнд я получаю распечатать заявление, которое показывает мне даты был получен как «1970-01-01T00:00Z» для from_date и даты поля. Я предполагаю, что это как-то связано с форматом даты, которую я передаю