Горячая передача даты в заголовке с помощью почтальона? - PullRequest
2 голосов
/ 18 сентября 2019

У меня есть метод POST, который принимает переменную Header, которая отображается на java.time.OffsetDateTime в конечной точке Java.Но когда я пытаюсь передать дату для переменной Header в Postman в формате UTC, например «2019-09-18T20: 15: 32.162Z» или в метке времени, например 1568835908, я получаю

"status": 400,
"error": "Bad Request",
"message": "Failed to convert value of type 'java.lang.String' to required type 'java.time.OffsetDateTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@io.swagger.annotations.ApiParam @org.springframework.web.bind.annotation.RequestHeader java.time.OffsetDateTime] for value '1568835908'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [1568835908]

Я знаю, что янеправильно передаю дату в заголовке почтальона.Какой правильный путь?

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

RFC 1123 & RFC 822

Согласно этой записи , связанной с этим вызовом библиотеки JavaScript , инструмент Почтальон ожидает значения даты и времени вустаревший формат, используемый в ранних интернет-протоколах.Строки выглядят так:

Ср, 14 июня 2017 г. 07:00:00 GMT

Этот устаревший формат был определен в RFC 1123 и RFC822. Помните, что современные протоколы в настоящее время принимают взамен ISO 8601 , включая классы java.time .

К счастью, класс DateTimeFormatter имеет константу, предопределенную заранееэтот формат: DateTimeFormatter.RFC_1123_DATE_TIME.

Instant instant = Instant.parse( "2019-09-18T20:15:32.162Z" ) ;
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
String output = odt.format( DateTimeFormatter.RFC_1123_DATE_TIME ) ;

См. этот код, запущенный на IdeOne.com .

вывод: ср., 18 сентября 2019 20:15:32 GMT

И разбор.

OffsetDateTime odt2 = OffsetDateTime.parse( output , DateTimeFormatter.RFC_1123_DATE_TIME ) ;

odt2.toString (): 2019-09-18T20: 15: 32Z

Опять же, этот формат ужасен и его следует избегать.Он предполагает английский язык и предполагает определенные культурные нормы для аббревиатур / заглавных букв и тому подобное.Сложно разобрать на машине.По возможности избегайте этого формата, вместо этого используйте форматы ISO 8601 для передачи значений даты и времени в виде текста.Но если вам необходимо взаимодействовать с устаревшим кодом, который еще не обновлен до современных протоколов и форматов, вы можете сгенерировать и проанализировать такой текст, используя этот предопределенный форматер.

0 голосов
/ 20 сентября 2019

Устранена проблема путем добавления @DateTimeFormat из org.springframework.format.annotation.DateTimeFormat, т.е. @DateTimeFormat (iso = DateTimeFormat.ISO.DATE_TIME) в объявлении аргумента метода.

...