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 实例(或者如果你坚持,这个映射结构)。
如果它是一个包含年-月-日的字符串,使用 java.time.format.DateTimeFormatter
来制作适当的模式(检查常量,一个可能很好去这里),然后使用它: LocalDateTime.parse(request.get("fromDate"), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
如果你有epoch millis(我不推荐这个),Instant.ofEpochMilli(Long.parseLong(request.get("fromDate"))).atZone(ZoneOffset.UTC).toLocalDateTime()
.
使用相同的库(可能是 GSON 或 jackson)来解编您用来编组它的映射。客户寄给你什么?他们正在使用这两个库之一。同理反操作
我强烈推荐选项 #1。
从 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 实例(或者如果你坚持,这个映射结构)。
如果它是一个包含年-月-日的字符串,使用
java.time.format.DateTimeFormatter
来制作适当的模式(检查常量,一个可能很好去这里),然后使用它:LocalDateTime.parse(request.get("fromDate"), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
如果你有epoch millis(我不推荐这个),
Instant.ofEpochMilli(Long.parseLong(request.get("fromDate"))).atZone(ZoneOffset.UTC).toLocalDateTime()
.使用相同的库(可能是 GSON 或 jackson)来解编您用来编组它的映射。客户寄给你什么?他们正在使用这两个库之一。同理反操作
我强烈推荐选项 #1。