簡體   English   中英

在使用 Spring Boot 自動轉換 RequestBody 期間,ZonedDateTime 的時區更改為 UTC

[英]Timezone of ZonedDateTime changed to UTC during auto conversion of RequestBody with Spring Boot

我試圖在對 Spring Boot 控制器執行 POST/PUT 時保留在前端設置的 ZonedDateTime 的 ZoneId。

我要轉移的值是: 2019-05-01T00:00:00+01:00[Europe/Zagreb]

在 POST/PUT 之后,ZoneId 被轉換為 UTC 並且小時數被調整。 從技術上講,這個更新后的值代表時間線上的同一點,但原始 ZoneId 丟失了,我希望將其存儲起來以便稍后能夠將其顯示給最終用戶。

// DTO
public class PriceInfoDTO {
    @JsonFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", 
        with = JsonFormat.Feature.WRITE_DATES_WITH_ZONE_ID )
    @DateTimeFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", iso = ISO.DATE_TIME )
    private ZonedDateTime validFrom;
}


// Controller
@PutMapping(
    path = PATH + "/{id}",
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<PriceInfo> update(
    @PathVariable("id") final Integer id,
    @RequestBody final PriceInfoDTO dto
) {
    System.out.println(dto);
    ...
}

查看我瀏覽器中的網絡選項卡,從瀏覽器到 Spring Controller 的請求具有以下值(有效負載):

2019-05-01T00:00:00+01:00[Europe/Zagreb]

這與格式模式相同。

當我將 DTO 轉儲到控制台時,我得到以下結果:

2019-04-30T22:00Z[UTC]

有什么方法可以保留在請求中收到的 ZoneId 嗎? 我應該編寫自己的序列化器和反序列化器來實現這一點嗎?

謝謝!

將以下行添加到application.properties文件:

spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

參考:

也可以使用ObjectMapper以編程方式設置:

objectMapper.configure(SerializationFeature.WRITE_DATES_WITH_ZONE_ID, true);
objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM