2017-09-15 8 views
2

Je sauvegarde les dates sur ma base de données sans horodatage, donc je veux standarize la façon dont les dates sont reçues par mes contrôleurs Spring Boot Rest, de sorte que les services peuvent être déployé partout dans le monde (AWS EC2, etc).Spring boot + Jackson - Toujours convertir les dates en UTC

J'ai essayé de définir les propriétés suivantes, n'a pas aidé:

spring.jackson.time-zone=UTC 

Il y a une autre propriété, ce qui est toujours true, donc je ne mis pas, c'est:

spring.jackson.deserialization.adjust-dates-to-context-time-zone=true 

Je suis en train de déployer dans deux conteneurs Ubuntu distincts, l'un au fuseau horaire UTC et l'autre dans mon fuseau horaire actuel America/Sao_Paulo qui est (GMT -3).

charge utile Exemple:

{"date":"2017-09-15T18:58:00.000Z"} 

Lorsque le service est déployé sur São Paulo, il reçoit:

2017-09-15 18:58:00.000000 

Ce qui est correcte.

Lorsque le service est déployé sur UTC, il reçoit:

2017-09-15 15:58:00.000000 

Ce qui est incorrect .

Je stocke les informations de date dans Java avec LocalDateTime.

modèle Exemple:

import java.time.LocalDateTime; 

class Model { 
    private LocalDateTime date; 

    public LocalDateTime getDate() { 
     return date; 
    } 

    public void setDate(LocalDateTime date) { 
     this.date = date; 
    } 
} 

Exemple ressource:

@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(); 
    } 
} 

Je ne peux pas changer le fuseau horaire de toutes mes machines de production, je dois résoudre ce avec Jackson et Java (si possible).

Une autre restriction: ne doit pas annoter mes classes de modèle pour ce faire.

Mon pom.xml (partie pertinente)

<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> 

Répondre

2

J'ai fait face à un problème similaire dans mon environnement de production aussi. Je l'ai résolu avec cette méthode dans mon Application.java (la classe avec la méthode principale):

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

espère qu'il pourra vous aider.

+0

J'ai essayé mais le problème persiste. Je reçois une différence de 3 heures entre les serveurs (ce qui est la différence entre l'UTC et mon fuseau horaire). –

+0

avec cette astuce vous forcer la conversion de chaque date reçue en UTC, de sorte que les dates reçues sont prêtes à être stockées dans votre base de données. Dans mon système, je n'utilise pas LocalDateTime mais j'utilise Date et java.sql.Timestamp. – desoss

+1

Votre réponse fonctionne réellement, le problème était ma configuration de base de données. Merci. –