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 をそのまま受け取って使うことができるようになりました。