LocalDate, LocalTime, LocalDateTime - это время и дата API, предоставленные Java 8, которые в основном используются для оптимизации операций обработки времени и дат в Java 8 ранее. Тем не менее, когда мы используем Spring Boot или Spring Cloud Failign, мы часто обнаруживаем, что различные проблемы возникают при использовании параметров запроса или возврата результатов. В этой статье мы поговорим о проблемах, возникающих в этой ситуации и о том, как их решить.
Проблема феномен
Давайте сначала посмотрим на симптомы. Например, следующий пример:
@SpringBootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.Run (Application.Class, Args); } @Restcontroller class hellocontroller {@postmapping ("/user") public userdto user (@requestbody userdto userdto) throws exception {return userdto; }} @Data @noargscstrustructor @allargscstrustructor static class userdto {private String username; частный день рождения LocalDate; }}Приведенный выше код создает простое веб -приложение Spring Boot, которое предоставляет интерфейс для отправки пользовательской информации, которая содержит данные типа LocalDate. В настоящее время, если мы используем Feign для вызова этого интерфейса, мы получим следующую ошибку:
2018-03-13 09: 22: 58,445 Warn [http-nio-9988-Exec-3] org.springframework.web.servlet.mvc.support.defaulthandlexceptionResolver-Не удалось прочитать сообщение http: org.springframework.http.converter.httpmessagenotReadableException: json parse Ошибка: не может построить экземпляр Java.Time.localdate: не найдено подходящего конструктора, не может опустошать из значения объекта (отсутствующий конструктор по умолчанию или создатель, или, возможно, необходимо добавить/включить информацию типа?); Вложенное исключение является com.fasterxml.jackson.databind.jsonmappingException: не может построить экземпляр Java.Time.localdate: не найдено подходящего конструктора, не может остерериализировать из объекта (отсутствующий конструктор по умолчанию или создатель или, возможно, необходимость добавить/включить информацию?) В [Source.io.io.io.io.pushbackinpurempreamtem. Строка: 1, столбец: 63] (через справочную цепочку: java.util.arraylist [0]-> com.didispace.userdto ["День рождения"])
Анализ и решение
Для приведенного выше сообщения об ошибке JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , детская обувь, знакомая с Spring MVC, должна иметь возможность немедленно найти ошибку и быть связанной с пустыней LocalDate. Тем не менее, все еще будет много читателей, которые будут смущены этим сообщением об ошибке java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] который мы назвали и отправлены, является объектом LocalDate. Какое это имеет отношение к объекту списка ArrayList?
Мы могли бы также отправить запрос вручную через почтальона или другую информацию, чтобы увидеть, что возвращает сервер? Например, вы можете сделать запрос в соответствии со следующим изображением:
Из приведенной выше рисунка мы можем понять путаницу, которую я упомянул выше. Фактически, по умолчанию, Spring MVC сериализует LocalDate на тип массива, и когда вызовов Faint -Feight, он все еще обрабатывает его в соответствии с ArrayList, поэтому, естественно, его нельзя понижать к объекту LocalDate.
Решение
Чтобы решить вышеуказанную проблему, она очень просто, потому что Джексон также предоставляет полный набор решений для сериализации для этого. Нам нужно только представить зависимость Джексона-Дататип-JSR310 в pom.xml следующим образом:
<Depective> <groupId> com.fasterxml.jackson.datatype </GroupId> <strifactid> jackson-datatype-jsr310 </artifactid> </depertion>
ПРИМЕЧАНИЕ. При установке родителей Spring Boot нет необходимости указывать конкретную версию, и не рекомендуется указывать конкретную версию.
Инкапсулируйте реализацию сериализации API API Java 8 в этом модуле, и ее конкретная реализация в этом классе: com.fasterxml.jackson.datatype.jsr310.javatiMemodule (примечание: некоторые более ранние версии сумасшедшие в этом классе ». Нам нужно только добавить этот модуль сериализации в основной класс приложения, и в то же время включить стандартный формат ISO 8601:
@Beanpublic objectmapper serializeobjectmapper () {objectmapper objectmapper = new ObjectMapper (); objectmapper.disable (serializationfeature.write_dates_as_timestamps); ObjectMapper.RegisterModule (новый javatiMemodule ()); return objectmapper;}В настоящее время, когда мы доступны к интерфейсу, он больше не является типом массива, и приведенные выше ошибки больше не будут происходить, когда мы называем Failign Client.
Пример кода
Для соответствующих примеров в этой статье вы можете просмотреть каталог главы 3-1-7 в следующем репозитории:
Github: https://github.com/dyc87112/springboot-learning
Gitee: https://gitee.com/diidispace/springboot-learning
Суммировать
Выше приведено проблема сериализации использования Java 8 Time and Date API (LocalDate и т. Д.) В Spring Boot и Feign. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!