【问题标题】:Timezone of ZonedDateTime changed to UTC during auto conversion of RequestBody with Spring Boot在使用 Spring Boot 自动转换 RequestBody 期间 ZonedDateTime 的时区更改为 UTC
【发布时间】:2020-03-24 15:08:14
【问题描述】:

我试图在对 Spring Boot 控制器执行 POST/PUT 时保留在前端设置的 ZoneId 的 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?我应该编写自己的序列化器和反序列化器来实现这一点吗?

谢谢!

【问题讨论】:

    标签: java spring spring-boot controller zoneddatetime


    【解决方案1】:

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

    spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false
    

    参考资料:

    【讨论】:

    • 我可以只为一个字段禁用此功能吗?
    【解决方案2】:

    也可以使用ObjectMapper 以编程方式设置:

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

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2015-06-30
      • 2016-02-17
      • 2020-03-25
      相关资源
      最近更新 更多