2017-09-15 3 views
2

私のデータベースの日付はタイムスタンプなしでに保存されていますので、サービスができるようにスプリングブートレストコントローラによって日付が受信される方法を標準化したい世界各地に展開されています(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> 

答えて

2

私はあまりにも私の運用環境で同様の問題に直面してきました。 私はApplication.java(mainメソッドを持つクラス)で、この方法でそれを解決してきました:

@PostConstruct 
void started() { 
    TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC")); 
} 

は、それはあなたを助けることができる願っています。

+0

私はこれを試しましたが、問題は解決しません。私はサーバー間で3時間の違いがあります(これはUTCと私のタイムゾーンとの違いです)。 –

+0

このトリックでは、受け取った日付をUTCで強制的に変換して、受け取った日付をデータベースに保存する準備が整います。 私のシステムではLocalDateTimeを使用していませんが、Dateとjava.sql.Timestampを使用しています。 – desoss

+1

あなたの答えは実際に動作し、問題は私のデータベース構成でした。ありがとう。 –

関連する問題