Неожиданный символ («-» (код 45)): Ожидаемое пространство, разделяющее значения корневого уровня в [Источник: 2021-06-06T10:50:00Z; строка: 1, столбец: 6]

#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 и даты поля. Я предполагаю, что это как-то связано с форматом даты, которую я передаю