java.lang.ClassCastException: java.util.LinkedHashMap 无法转换为 java.time.LocalDateTime

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.time.LocalDateTime

从 Android 调用服务并传递 LocalDateTime 类型 parameter.I 在将以相同类型 (LocalDateTime) 发送到 LocalDateTime 的请求参数转换为 LocalDateTime 时获得此预期。

这就是我正在做的事情

@PostMapping(value = "/getDates")
public Object getDates(@RequestBody Map<Object, Object> request) {
LocalDateTime startDate = (LocalDateTime) request.get("fromDate");
LocalDateTime endDate = (LocalDateTime) request.get("toDate");
}

API请求

{
"fromDate":LocalDateTimeObject
"toDate":LocalDateTimeObject1
}

强制转换运算符做 3 件不同的事情:原始转换、类型检查和类型断言。

这三件事就像枪支和祖母:完全、完全、完全不相关。他们看起来很相似。到此为止。

只有 3 种实际转换事物的方法之一是原始转换。顾名思义,如果括号中的内容是基本类型,例如 'int'.

,就会发生这种情况。

换句话说,(LocalDateTime) foo 是类型检查:它检查 foo 是否是 LocalDateTime。如果是,则什么也不会发生。如果否,则抛出 ClassCastException

您似乎希望它将 "fromDate" 参数转换为 LocalDateTime - 强制转换不是您完成此操作的方式。

JSON 只能表示布尔值、数字、字符串、数组和映射。它不能表示日期时间对象。这意味着您的 API 应该定义如何执行此操作。通常的方法是通过字符串,通过放入日期时间传递的规范,例如:"2020-05-20 14:00"。或者可能是一个数字:自 1970 年以来的毫秒数,在 UTC,然后取你在那里找到的本地日期时间,这就是我的意思。这有点笨拙,但这是你的 API,你可以随心所欲地指定它。

从您的错误来看,您似乎刚刚将 LocalDateTime 对象扔给了 JSON 编组器,编组器将其变成了代表 LDT 对象字段的复杂映射结构。

这是行不通的;我强烈建议您对此进行改造。

您的第一步是弄清楚您的规格是什么。一旦你确定了这一点,你的第二步就是如何将你获得的字符串或毫秒自纪元转换为 LDT 实例(或者如果你坚持,这个映射结构)。

  1. 如果它是一个包含年-月-日的字符串,使用 java.time.format.DateTimeFormatter 来制作适当的模式(检查常量,一个可能很好去这里),然后使用它: LocalDateTime.parse(request.get("fromDate"), DateTimeFormatter.ISO_LOCAL_DATE_TIME)

  2. 如果你有epoch millis(我不推荐这个),Instant.ofEpochMilli(Long.parseLong(request.get("fromDate"))).atZone(ZoneOffset.UTC).toLocalDateTime().

  3. 使用相同的库(可能是 GSON 或 jackson)来解编您用来编组它的映射。客户寄给你什么?他们正在使用这两个库之一。同理反操作

我强烈推荐选项 #1。