Spring JSON конвертер преобразует формат даты «гггг-мм-дд'т'чч: мм: сс.SSSXXX» в OffsetDateTime без смещения - PullRequest
0 голосов
/ 22 марта 2019

Я получаю дату в формате "yyyy-MM-dd'T'HH: mm: ss.SSSXXX" из ввода JSON, который преобразуется в DTO самим Spring. Но при преобразовании в экземпляр OffsetDateTime это приводит к потере информации о смещении в созданном экземпляре OffsetDateTime. Например, мы передаем следующее в Postman'е, вызывающем API, это приводит к синтаксическому анализу и созданию объекта, но объект не имеет установленного смещения.

Ниже приведен пример даты "2019-03-21T06:43:56.235+11:00", когда она анализируется, она приводит к дате с экземпляром OffsetDateTime, но в качестве смещения не указывается +11:00. Когда я непосредственно анализирую эту строку, используя DateTimeFormatter, я могу получить заполненное смещение.

ниже код, который использует DateTimeFormatter.

OffsetDateTime.parse(offSetDateTimeString, DateTimeFormatter.ofPattern(DATE_PATTERN))

DATE_PATTER = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX".

Пожалуйста, руководство.

Спасибо.

UPDATE

В моем DO есть следующие объекты:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String name;

// THis won't work as it doesn't support timestamp.
// @Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
// private LocalDateTime localDateTime;

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime zonedDateTime;

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private OffsetDateTime offSetDateTime;

Хотя DTO также имеет те же поля с теми же типами данных.

1 Ответ

0 голосов
/ 26 марта 2019

Хорошо, вот что я сделал, чтобы решить эту проблему.

  1. Вместо того, чтобы принимать OffsetDateTime в DTO, я принял String. Для этого мне потребовалось внести изменения в Mapper (MapStruct). Я определил пользовательские классы String для классов сопоставления OffsetDateTime и указал их в uses в @Mapper.
  2. Это решило мою проблему, связанную с синтаксическим анализом, а затем, перейдя к БД, я заметил пару вещей.

    1. TIMESTAMP WITH TIME ZONE не сохраняет дату в точно заданном формате.
    2. Вам необходимо использовать ZoneId для преобразования времени в соответствующий часовой пояс. И вам нужно написать собственную Утилиту для этого вида преобразования.
    3. Теперь нам нужно получить объект zoneId соответствующего часового пояса, который мы в настоящее время получили из входящего запроса.

Это обновление на данный момент. Размещать это для справки других. Спасибо всем за руководство.

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