SpringBoot で OffsetDateTime を deserialize するときに Jackson が勝手に UTC に変換してしまう件について

よそのAPIが返してくる OffsetDateTime を処理するロジックを書いていたところ、テストが fail して、見てみると何故か UTC に変換されてたことがありました。

  • API が返している値

"2018-04-01T00:00:00+09:00"

"2018-03-31T15:00:00Z"

おお・・??・・・・おお、なるほどね。

まあ、、間違ってはいない。やりたいこともわかる。

でもオフセット消えちゃってるからどこのタイムゾーンかわからなくなっちゃってるじゃん。


そんでいろいろ調べてると

  • 犯人は Jackson っぽい

っていうことと

  • ADJUST_DATES_TO_CONTEXT_TIME_ZONE を無効にすると勝手なことをしなくなるらしい

ってのはわかりました。

じゃあサクッと無効にしてやりましょうかと思って更に調べてみたんですが

objectMapper の attribute を変えてやるみたいなのしか出てこなくて

こんなの

mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);

いやいや、、そんなの手動でやってないし、じゃあどうしたかっていうと、答えは bootstrap.yml でした。

bootstrap.yml に以下のように設定

spring:
  jackson:
    deserialization:
      adjust_dates_to_context_time_zone: false

これで、取得した OffsetDateTime をそのまま受け取って使うことができるようになりました。