【问题标题】:JsonDeserialize not work for LocalDateTime [duplicate]JsonDeserialize 不适用于 LocalDateTime [重复]
【发布时间】:2020-12-16 05:51:24
【问题描述】:

我想将 POST 请求从我的客户端发送到我的后端,在 POJO 中我有两个字段 LocalDate 和 LocalDateTime 如下:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy - hh:mm:ss")
private LocalDateTime createdTimestamp;

@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy")
private LocalDate expiredDate; 

客户端将发送请求,正文如下:

{
    "expiredDate" : "01.01.2020",
    "createdTimestamp" : "01.02.2020 - 10:10:10"  
}

但是,在后端,我遇到了一个异常:

java.lang.NoSuchMethodError:
com.fasterxml.jackson.databind.DeserializationContext.handleWeirdStringValue(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;

如果我将createdTimestamp 留在请求正文之外,那么它就起作用了。似乎只有注释@JsonDeserialize(using = LocalDateDeserializer.class) 起作用,而@JsonDeserialize(using = LocalDateTimeDeserializer.class) 不起作用。

有人知道为什么会这样吗?

【问题讨论】:

  • 您的模式中有一个小写的h,但没有a 指定这些时间是AM 还是PM。这可能是个问题,但我不确定。将小时数设为大写 ​​H 以 24 小时格式描述小时数,然后重试。可以工作...
  • 是的,正如@deHaar 所说,您的 POJO 属性与您的客户之一不匹配:createdTimestamp != createTimestamp 或者这是一个错字?
  • 抱歉 createdTimestamp 是我的错字,deHaar 的解决方案对我有用。非常感谢!
  • 好...我把它作为未来读者的答案。

标签: java jackson


【解决方案1】:

您在模式中使用 12 小时格式的小时符号 (hh),但该模式不完整,因为它缺少 AM/PM 的指示符,即 a。保留该指示符会使时间表达式不明确,它可能是 10 AM10 PM22,24 小时格式)。

您可以将格式切换为 24 小时制 (HH),这样时间就会明确。

像这样:

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy - HH:mm:ss")
private LocalDateTime createdTimestamp;

【讨论】:

    【解决方案2】:

    您不需要使用自定义反序列化程序。这是一个可以解决您的问题并且有效的问题:Spring Data JPA - ZonedDateTime format for json serialization

    【讨论】:

      猜你喜欢
      • 2019-04-09
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2017-10-10
      • 2014-08-21
      • 2016-01-18
      相关资源
      最近更新 更多