LocalDate, Localtime, LocalDateTime est les API de temps et de date fournies par Java 8, qui sont principalement utilisées pour optimiser les opérations de traitement du temps et des dates dans Java 8 avant. Cependant, lorsque nous utilisons Spring Boot ou Spring Cloud Feign, nous constatons souvent que divers problèmes se produisent lors de l'utilisation de paramètres de demande ou de rendement des résultats. Dans cet article, nous parlerons des problèmes qui surviennent dans cette situation et de la façon de les résoudre.
Phénomène de problème
Jetons un coup d'œil aux symptômes en premier. Par exemple, l'exemple suivant:
@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) lève une exception {return userdTo; }} @Data @noargsconstructor @AlLargSconstructor Static class userdTo {private String username; anniversaire privé localdate; }}Le code ci-dessus construit une simple application Web Spring Boot, qui fournit une interface pour soumettre des informations utilisateur, qui contient des données de type localdate. Pour le moment, si nous utilisons Feign pour appeler cette interface, nous obtiendrons l'erreur suivante:
2018-03-13 09: 22: 58 445 Warn [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.defaulthandlerexceptionResolver - a échoué à lire le message http: org.springframework.http.converter.httpMessageNotReadableException: JSON Parse Erreur: ne peut pas construire l'instance de java.time.localate: Aucun constructeur approprié trouvé, ne peut pas désérialiser la valeur de l'objet (manquant de constructeur ou créateur par défaut, ou peut-être besoin d'informations sur le type d'ajout / enable?); Exception imbriquée est com.fasterxml.jackson.databind.jsonmappingException: ne peut pas construire l'instance de java.time.localate: aucun constructeur approprié trouvé, ne peut pas désérialiser à partir de la valeur de l'objet (constructeur par défaut manquant ou créateur, ou peut-être avoir besoin d'ajouter / activer les informations de type?) À [Source: Java.pushBackputStream@67064c65; Ligne: 1, colonne: 63] (via la chaîne de référence: java.util.arraylist [0] -> com.didispace.userdto ["anniversaire"])
Analyse et solution
Pour le message d'erreur ci-dessus JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , les chaussures des enfants familières avec le Spring MVC ne devraient pas pouvoir localiser l'erreur immédiatement et être liée à la désérialisation de LocalDate. Cependant, il y aura encore de nombreux lecteurs qui seront confus par ce message d'erreur java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] que nous avons nommé et soumis est un objet localdate. Qu'est-ce que cela a à voir avec l'objet ArrayList List?
Nous pourrions aussi bien envoyer une demande manuellement via Postman ou d'autres informations pour voir ce que le serveur renvoie? Par exemple, vous pouvez faire une demande en fonction de l'image suivante:
D'après la figure ci-dessus, nous pouvons comprendre la confusion que j'ai mentionnée ci-dessus. En fait, par défaut, Spring MVC sérialise localDate dans un type de tableau, et lorsque Feign est appelé, il le traite toujours en fonction de ArrayList, donc naturellement il ne peut pas être désérialisé dans un objet local.
Solution
Afin de résoudre le problème ci-dessus, il est très simple, car Jackson fournit également un ensemble complet de solutions de sérialisation pour cela. Nous devons seulement introduire la dépendance jackson-datatype-jsr310 dans pom.xml, comme suit:
<dependency> <proupId> com.fasterxml.jackson.datatype </rombandid> <Artifactid> jackson-datatype-jsr310 </retifactid> </dependency>
Remarque: Lorsque le parent de Spring Boot est défini, il n'est pas nécessaire de spécifier une version spécifique et il n'est pas recommandé de spécifier une version spécifique.
Encapsulez la mise en œuvre de la sérialisation de l'API à date temporelle de Java 8 dans ce module, et son implémentation spécifique est dans cette classe: com.fasterxml.jackson.datatype.jsr310.javatimemodule (note: certaines versions antérieures sont folles à propos de cette classe "com.fasterxml.jackson.datatype.jsr310.jsr310module). Nous devons seulement ajouter ce module de sérialisation à la classe principale d'application ci-dessus, et en même temps activer le format ISO 8601 standard:
@BeanPublic ObjectMapper SerializingObjectMapper () {objectMapper objectMapper = new ObjectMapper (); objectMapper.Disable (serializationFeature.write_dates_as_timestamps); objectMapper.RegisterModule (new JavatimeModule ()); return objectMapper;}À l'heure actuelle, lorsque nous accéderons à l'interface tout à l'heure, ce n'est plus un type de tableau, et les erreurs ci-dessus ne se produiront plus lorsque nous appelons Feign Client.
Exemple de code
Pour des exemples pertinents dans cet article, vous pouvez voir le répertoire du chapitre 3-1-7 dans le référentiel suivant:
Github: https://github.com/dyc87112/springboot-learning
Gitee: https://gitee.com/diidispace/springboot-learning
Résumer
Ce qui précède est le problème de sérialisation de l'utilisation de l'API Java 8 HEURE et DATE (LocalDate, etc.) dans Spring Boot et Feign. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!