-1

从传递 LocalDateTime 类型参数的 Android 调用服务。我在将作为相同类型(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
}
4

1 回答 1

1

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

这三件事就像枪和奶奶:完全,完全,完全不相关。它们看起来很相似。到此为止。

这三个中唯一一个真正转换事物的是原始转换。顾名思义,如果括号中的事物是原始类型,例如“int”,就会发生这种情况。

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

看起来您希望它将"fromDate"参数转换为LocalDateTime- 强制转换不是您可以完成此操作的方式。

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

从您的错误来看,您似乎刚刚在 JSON 编组器上扔了一个 LocalDateTime 对象,这将其变成了一个表示 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。

于 2020-05-11T11:53:25.123 回答