@JsonFormat DEFAULT_TIMEZONE, похоже, не работает - PullRequest
2 голосов
/ 18 марта 2019

У меня возникла проблема с логикой дат, которую я выделил для Джексона, сериализатора JSON.

В базе данных и в точке отладки приложения правильные даты, и все записывается с использованием часового пояса по умолчанию. Однако в сериализации добавляются 4 часа. Я обнаружил, что это можно исправить, сказав Джексону специально использовать EST (по умолчанию это было UTC). Как показано ниже:

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone="America/New_York")
private Date startDate;

Однако проблема в том, что только локальный использует EST, а сервер будет использовать UTC. Мне нужен Джексон, чтобы использовать системные значения по умолчанию.

К счастью, я нашел этот похожий вопрос , который подтверждается документацией . Новое решение:

@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss.SSSZ", timezone=JsonFormat.DEFAULT_TIMEZONE)
private Date startDate;

Однако это не работает! Я пробовал также timezone='DEFAULT_TIMEZONE' и множество других вещей, но во всех случаях выход API по-прежнему на 4 часа опережает число в базе данных.

Другие вещи, которые я пробовал:

  • выход из системы JsonFormat.DEFAULT_TIMEZONE возврат ##default.
  • logging TimeZone.getDefault().getDisplayName() возвращает Eastern Standard Time.

Джексон версия 2.9.

Есть предложения?

1 Ответ

2 голосов
/ 18 марта 2019

Решил свой вопрос.Вот что я нашел:

JsonFormat.DEFAULT_TIMEZONE НЕ является системным значением по умолчанию, как подсказывают документация и SO ответ , но на самом деле по умолчанию UTC.

org.springframework.http.converter.json.Jackson2ObjectMapperBuilder

/**
 * Override the default {@link TimeZone} to use for formatting.
 * Default value used is UTC (NOT local timezone).
 * @since 4.1.5
 */
public Jackson2ObjectMapperBuilder timeZone(TimeZone timeZone) {

com.fasterxml.jackson.annotation.JsonFormat

/**
 * Value that indicates that default {@link java.util.TimeZone}
 * (from deserialization or serialization context) should be used:
 * annotation does not define value to use.
 *<p>
 * NOTE: default here does NOT mean JVM defaults but Jackson databindings
 * default, usually UTC, but may be changed on <code>ObjectMapper</code>.
 */
public final static String DEFAULT_TIMEZONE = "##default";

Решение :

@Autowired
com.fasterxml.jackson.databind.ObjectMapper objectMapper;

и objectMapper.setTimeZone(TimeZone.getDefault());

Это должно установить для Jackson ObjectMapper использование системного значения по умолчанию вместо значения по умолчанию Jackson (UTC).

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