Не удалось преобразовать значение типа «java.lang.String» в требуемый тип «java.util.Date»

У меня есть 2 микросервиса, которые общаются через feign. Один микросервис предоставляет метод, который вызывает другой. Метод принимает дату в качестве аргумента.

Это код метода:

@Override
public String verifyWorkingDaysByAccesstimeAndAttendanceDate(@PathVariable int accessTimeId,
        @PathVariable("attendanceDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Date attendanceDate) {

    AccessTime accessTime = accessTimeService.findByIDService(AccessTime.class, accessTimeId);

    String day = new SimpleDateFormat("EEEE", Locale.ENGLISH).format(attendanceDate).toUpperCase();
    String status = "NOT_VERIFIED";

    if (workingDayservice.findWorkingDaysByAccesstimeAndDate(accessTime, attendanceDate).toString().contains(day)) {
        status = "VERIFIED";
    }

    return status;

}

==> как вы можете видеть, он принимает дату и проверяет ее существование в базе данных.

другой микросервис использует этот фиктивный класс для вызова этого метода:

@FeignClient(name = "access-control-micro-services-access-time")
public interface AccessTimeClient {

@RequestMapping(value = "/api/v${webService.currentVersion}/workingDay/accessTime/{accessTimeId}/{attendanceDate}", method = RequestMethod.GET)
String verifyWorkingDaysByAccesstimeAndAttendanceDate(@PathVariable("accessTimeId") int accessTimeId,
        @PathVariable("attendanceDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Date attendanceDate);

==> второй микросервис вызывает этот метод в другом классе и дает ему дату, которую он извлекает из базы данных (формат: 2019-03-29 08:38:08)

Мой код запускает это исключение:

Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.PathVariable @org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '2019-03-29 08:38:08.0'; nested exception is java.lang.IllegalArgumentException: Invalid format: \"2019-03-29 08:38:08.0\" is malformed at \" 08:38:08.0\""

Invalid format: \"2019-03-29 08:38:08.0\" is malformed at \" 08:38:08.0\"" что вас смущает в этом очень явном сообщении об ошибке?
Michael 02.04.2019 16:46

Ну, исключение говорит: Invalid format: "2019-03-29 08:38:08.0" is malformed at " 08:38:08.0" - это потому, что 08:38:08.0 не подходит к Формат даты и времени ISO. Вместо этого попробуйте 2019-03-29T08:38:08.

Thomas 02.04.2019 16:47

я не могу изменить формат даты в базе данных. у меня нет таких полномочий. мой код должен использовать существующие форматы

kmar akrout 02.04.2019 16:50

Ну, вам не нужно менять формат дат в базе данных. Просто прочитайте (и если это строки, разберите) их и переформатируйте при вызове микросервиса.

Thomas 02.04.2019 16:54

я исключил это решение, потому что, когда я анализирую формат даты назад (после того, как я изменяю его на строку и удаляю время, которое мне не нужно, и создаю проблему), я получаю этот длинный формат, содержащий название дня и бла-бла-бла. .. он просто не возвращает мою строку yyyy-mm-dd как дату yyyy-mm-dd:/:/

kmar akrout 02.04.2019 17:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
2 401
1

Ответы 1

Клиент Feign не поддерживает аннотацию @DateTimeFormat в соответствии с проблемой Клиент Feign неправильно сериализует java.time.LocalDate #104. Аннотация @DateTimeFormat используется Spring MVC, а не Spring Cloud OpenFeign.

Есть несколько способов исправить, например. принудительно устанавливать даты ISO для всех вызовов Feign или зарегистрировать дополнительные преобразователи Spring. Для этого потребуется собственный код, который зависит от вашего варианта использования, например. вы можете заменить старый Date на ZonedDateTime.

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