java.lang.ClassCastException: java.util.LinkedHashMap нельзя привести к java.time.LocalDateTime

Вызов службы из Android с передачей параметра типа 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
}

1 ответ

Решение

Оператор приведения выполняет 3 разные функции: примитивное преобразование, проверку типов и утверждение типа.

Эти 3 вещи похожи на оружие и бабушки: Совершенно, полностью, совершенно не связаны. Они похожи. На этом все заканчивается.

Только один из этих 3, что на самом деле превращает вещи, примитивно преобразование. Как видно из названия, это происходит, если объект в круглых скобках является примитивным типом, например int.

Другими словами, (LocalDateTime) foo проверка типов: проверяет, fooэто LocalDateTime. Если да, ничего не происходит. Если нет,ClassCastException брошен.

Похоже, вы ожидаете, что он преобразует "fromDate" параметр к LocalDateTime - гипс - это не то, как вы можете этого добиться.

JSON может представлять только логические значения, числа, строки, массивы и карты. Он не может представлять объекты даты и времени. Это означает, что ваш API должен определять, как это делать. Обычный способ - через строку, указав в спецификации, что время передается, например, как:"2020-05-20 14:00". Или, возможно, в виде числа: количество миллисекунд с 1970 года по всемирному координированному времени, затем возьмите местное datetime, которое вы там найдете, и это то, что я имел в виду. Это немного более громоздко, но это ваш API, вы можете специфицировать его, как хотите.

Судя по вашей ошибке, похоже, что вы только что бросили объект LocalDateTime в маршаллер JSON, который превратил его в запутанную структуру карты, представляющую поля объекта LDT.

Это не работает; Я настоятельно рекомендую вам переделать это.

Ваш первый шаг - выяснить, какова ваша спецификация. После того, как вы это определили, вашим вторым шагом будет преобразование полученной строки или миллисекунд с эпохи в экземпляр LDT (или, если вы настаиваете, эту структуру карты).

  1. Если это строка с годом-месяц-днем, используйте java.time.format.DateTimeFormatter чтобы создать соответствующий шаблон (проверьте константы, вероятно, лучше пойти сюда) и используйте это: LocalDateTime.parse(request.get("fromDate"), DateTimeFormatter.ISO_LOCAL_DATE_TIME)

  2. Если у вас есть эпоха миллис (я не рекомендую это), Instant.ofEpochMilli(Long.parseLong(request.get("fromDate"))).atZone(ZoneOffset.UTC).toLocalDateTime().

  3. Используйте ту же библиотеку (предположительно, GSON или jackson) для демаршалинга карты, которую вы использовали для ее маршалинга. Что вам прислал клиент? Они используют одну из этих двух библиотек. Используйте то же самое и в обратном порядке.

Настоятельно рекомендую вариант №1.

Другие вопросы по тегам