У меня есть 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" - это потому, что 08:38:08.0 не подходит к Формат даты и времени ISO. Вместо этого попробуйте 2019-03-29T08:38:08.
я не могу изменить формат даты в базе данных. у меня нет таких полномочий. мой код должен использовать существующие форматы
Ну, вам не нужно менять формат дат в базе данных. Просто прочитайте (и если это строки, разберите) их и переформатируйте при вызове микросервиса.
я исключил это решение, потому что, когда я анализирую формат даты назад (после того, как я изменяю его на строку и удаляю время, которое мне не нужно, и создаю проблему), я получаю этот длинный формат, содержащий название дня и бла-бла-бла. .. он просто не возвращает мою строку yyyy-mm-dd как дату yyyy-mm-dd:/:/




Клиент Feign не поддерживает аннотацию @DateTimeFormat в соответствии с проблемой Клиент Feign неправильно сериализует java.time.LocalDate #104. Аннотация @DateTimeFormat используется Spring MVC, а не Spring Cloud OpenFeign.
Есть несколько способов исправить, например. принудительно устанавливать даты ISO для всех вызовов Feign или зарегистрировать дополнительные преобразователи Spring. Для этого потребуется собственный код, который зависит от вашего варианта использования, например. вы можете заменить старый Date на ZonedDateTime.
Invalid format: \"2019-03-29 08:38:08.0\" is malformed at \" 08:38:08.0\""что вас смущает в этом очень явном сообщении об ошибке?