Использовать Swagger API с несколькими форматами даты и времени - PullRequest
0 голосов
/ 29 октября 2018

Я использую API, который находится вне моего контроля, с контрактом Swagger с использованием CLAR Jar Swagger версии 2.3.1 и с опцией библиотеки дат java8, язык также Java.

В API есть несколько полей даты и времени, которые все определены как:

"type": "string",
"format": "date-time"

Большинство значений включают в себя часовой пояс, однако, в частности, нет. Таким образом, мы получаем оба этих формата в полях, которые определены одинаково:

"1963-08-15T23:59:59+02:00"
"1963-08-15T23:59:59"

Это вызывает проблемы с десериализатором, поскольку он никогда не знает, какой формат обрабатывать.

Я использую OffsetDateTime в сгенерированных классах DTO, так как LocalDateTime просто не работает - сгенерированный код не включает в себя адаптер Gson (см. https://github.com/swagger-api/swagger-codegen/issues/6992).

Я попытался установить форматер для десериализатора с другими форматами, но он не работает, в основном потому, что второй формат выше исключает информацию о зоне:

ApiClient apiClient = new ApiClient();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[xxx]");
apiClient.setOffsetDateTimeFormat(dtf);

Я надеюсь, что не буду слишком сильно редактировать сгенерированный код, поскольку хотел бы иметь возможность регенерировать в будущем, и я не могу изменить значения, возвращаемые API, поскольку он является внешним.

Есть ли способ сообщить сгенерированному клиенту о десериализации различных форматов в OffsetDateTime или, возможно, по умолчанию для часового пояса установлено что-то конкретное?

1 Ответ

0 голосов
/ 29 октября 2018

Я решил эту проблему, отредактировав сгенерированный файл JSON.java и изменив класс OffsetDateTimeTypeAdapter для использования ZonedDateTime в преобразовании в read methofd:

return ZonedDateTime.parse(date, formatter).toOffsetDateTime();

Затем я добавил файл JSON.java в файл .swagger-codegen-ignore. Я сомневаюсь, что файл будет часто меняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...