强制转换运算符做了 3 件不同的事情:原始转换、类型检查和类型断言。
这三件事就像枪和奶奶:完全,完全,完全不相关。它们看起来很相似。到此为止。
这三个中唯一一个真正转换事物的是原始转换。顾名思义,如果括号中的事物是原始类型,例如“int”,就会发生这种情况。
换句话说,(LocalDateTime) foo
is typecheck:它检查是否foo
是 LocalDateTime。如果是,则什么都不会发生。如果不是,ClassCastException
则抛出 a。
看起来您希望它将"fromDate"
参数转换为LocalDateTime
- 强制转换不是您可以完成此操作的方式。
JSON 只能表示布尔值、数字、字符串、数组和映射。它不能表示日期时间对象。这意味着您的 API 应该定义如何执行此操作。通常的方法是通过字符串,通过输入日期时间传递的规范,例如:"2020-05-20 14:00"
。或者可能是一个数字:自 1970 年以来的毫秒数,在 UTC,然后取你在那里找到的本地日期时间,这就是我的意思。这有点笨拙,但它是您的 API,您可以根据需要指定它。
从您的错误来看,您似乎刚刚在 JSON 编组器上扔了一个 LocalDateTime 对象,这将其变成了一个表示 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。