2017-09-15 4 views
2

타임 스탬프없이 날짜를 저장하므로 스프링 부트 레스트 컨트롤러에서 날짜를받는 방식을 표준화하여 서비스를 제공 할 수 있습니다. 세계 어디서나 배포 할 수 있습니다 (AWS EC2 등). 스프링 부트 + 잭슨 - 항상 날짜를 UTC로 변환

내가 도움이되지 않았다, 다음 속성을 설정하려고 :

spring.jackson.time-zone=UTC 

항상 true 또 다른 재산이있다, 그래서 설정하지 않은, 즉 :

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

저는 2 개의 별도 우분투 컨테이너로 배포하고 있습니다. 하나는 UTC 시간대이고 다른 하나는 현재 시간대 (GMT -3)입니다. 현재 시간대는 America/Sao_Paulo입니다.

예 페이 : 서비스가 상파울루에 배치되면

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

내가 내 모든 생산 기계의 시간대를 변경할 수 없습니다, 나는 잭슨과 자바 (가능한 경우)와 함께이 문제를 해결해야합니다.

또 다른 제한 사항 : 내 모델 클래스에 주석을 달아서는 안됩니다.

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에서이 방법 (주요 방법으로 클래스)와 그것을 해결했습니다 :

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

은 당신을 도울 수 바랍니다.

+0

시도했지만 문제가 지속됩니다. 서버간에 3 시간 차이가 있습니다 (이는 UTC와 제 시간대의 차이입니다). –

+0

이 트릭을 사용하면 수신 한 모든 날짜를 UTC로 강제 변환하므로 수신 된 날짜를 데이터베이스에 저장할 준비가됩니다. 내 시스템에서 LocalDateTime을 사용하고 있지 않지만 Date 및 java.sql.Timestamp를 사용하고 있습니다. – desoss

+1

귀하의 답변은 실제로 작동하지만 문제는 데이터베이스 구성입니다. 감사. –

관련 문제