私のデータベースの日付はタイムスタンプなしでに保存されていますので、サービスができるようにスプリングブートレストコントローラによって日付が受信される方法を標準化したい世界各地に展開されています(AWS EC2など)。スプリングブート+ジャクソン - 常に日付をUTCに変換
私は助けにはならなかった、以下のプロパティを設定しようとしました:
spring.jackson.time-zone=UTC
あり、常にtrue
で別のプロパティが、あるので、私はそれがあり、設定されていませんでした:
spring.jackson.deserialization.adjust-dates-to-context-time-zone=true
私は2つの別々のUbuntuコンテナに展開しています.1つはUTC
タイムゾーン、もう1つは現在のタイムゾーンAmerica/Sao_Paulo
(GMT -3)です。
例ペイロード:サービスはサンパウロに配備されている場合
{"date":"2017-09-15T18:58:00.000Z"}
、それが受け取る:正しいある
2017-09-15 18:58:00.000000
。サービスはUTCに配備されている場合
は、それが受け取る: 間違ってある2017-09-15 15:58:00.000000
。
Javaで日付情報をLocalDateTime
に保存しています。
例モデル:
import java.time.LocalDateTime;
class Model {
private LocalDateTime date;
public LocalDateTime getDate() {
return date;
}
public void setDate(LocalDateTime date) {
this.date = date;
}
}
例リソース:
@RestController
class Resource {
@RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<?> add(@RequestBody Model model) {
System.out.println(model.getDate());
// persistence ommited
return ResponseEntity.created(URI.create("")).build();
}
}
私はすべての私の生産機械のタイムゾーンを変更することはできませんが、私はジャクソンとJava(可能であれば)でこれを解決しなければなりません。
もう1つの制限:これを行うためにモデルクラスに注釈を付けることはできません。
マイpom.xml
(関連部分)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.8.5</version>
</dependency>
私はこれを試しましたが、問題は解決しません。私はサーバー間で3時間の違いがあります(これはUTCと私のタイムゾーンとの違いです)。 –
このトリックでは、受け取った日付をUTCで強制的に変換して、受け取った日付をデータベースに保存する準備が整います。 私のシステムではLocalDateTimeを使用していませんが、Dateとjava.sql.Timestampを使用しています。 – desoss
あなたの答えは実際に動作し、問題は私のデータベース構成でした。ありがとう。 –