Ошибка весенней загрузки при прохождении времени формата (гггг-ММ-дд'ТХЧ: мм: сс Z) в параметре запроса - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь передать зонированное время даты в формате "2020-02-26T11: 02: 41 +0000" в качестве параметра запроса моему контроллеру весенней загрузки.

  public ResponseEntity<?> getStatistics(
  @ApiParam(value = "startDate", example = "2020-02-26T11:02:41 +0000")
  @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss 'Z'") @RequestParam(value = "startDate",
      required = false) ZonedDateTime startDate)

Я получаю это исключение, пока ударяя по API

Caused by: java.lang.IllegalArgumentException: Parse attempt failed for value [2020-02-26T11:02:41  0000]
at org.springframework.format.support.FormattingConversionService$ParserConverter.convert(FormattingConversionService.java:206)
at org.springframework.format.support.FormattingConversionService$AnnotationParserConverter.convert(FormattingConversionService.java:321)
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:40)


Caused by: java.time.format.DateTimeParseException: Text '2020-02-26T11:02:41  0000' could not be parsed at index 20
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)

Что именно мне здесь не хватает? Кажется, весна не может разобрать строку в datetime

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Четыре предложения:

  1. Вы пытаетесь использовать формат ISO 8601, что очень хорошая идея. В этом есть одна ошибка: ISO 8601 не принимает пробел между временем и смещением UT C. Я предлагаю удалить это.
  2. Поскольку ваша строка имеет смещение UT C, +0000 и нет часового пояса, вам не нужно использовать ZonedDateTime для нее в Java, а OffsetDateTime более корректно , который я предлагаю вам использовать.
  3. Одной из причин вашей ошибки, кажется, является то, что ваша строка была декодирована URL. Я не знаю, как исправить эту проблему в ваших настройках, но либо убедитесь, что строка имеет URL-адрес, закодированный в источнике, чтобы декодирование URL восстанавливало правильную строку, либо избегайте декодирования URL.
  4. Другая причина потому что ваша ошибка - та, которая уже была указана в ответе 夢 の の 夢. В строке шаблона формата указан литерал Z, поскольку вы заключили его в одинарные кавычки. Вместо этого я предлагаю xx в шаблоне формата для смещения на четыре ди git (если между часами и минутами смещения нет двоеточия).

Кодировка URL, также известный как процент encoding, используется для кодирования строк параметров URL в соответствии с синтаксисом URL или URI и обеспечения их правильной передачи даже в ограниченном наборе символов. Помимо прочего, поскольку URL не может содержать пробел, кодировка URL заменяет пробел на +, знак плюс. Таким образом, декодирование URL преобразует все плюсы обратно в пробелы. Это то, что случилось с вашей строкой. Только ваш знак плюс должен был присутствовать как часть вашего смещения, +0000. Так что это больше не может быть проанализировано. Ваше сообщение об исключении ссылается на index 20, именно там должен был стоять знак плюс.

Ссылки

1 голос
/ 27 марта 2020

Вы передаете литерал 'Z' как смещение зоны. Измените на yyyy-MM-dd'T'HH:mm:ssZ и затем введите 2020-02-26T11:02:41+0000, чтобы исправить это.

...