LocalDate, LocalTime, LocalDatetime sind die von Java 8 bereitgestellten Zeit- und Datums -APIs, die hauptsächlich zur Optimierung der Verarbeitungsvorgänge von Zeit und Daten in Java 8 verwendet werden. Wenn wir jedoch Spring Boot oder Spring Cloud vorstellen, stellen wir häufig fest, dass bei der Verwendung von Anforderungsparametern oder der Rückgabeergebnisse verschiedene Probleme auftreten. In diesem Artikel werden wir über die Probleme sprechen, die in dieser Situation auftreten und wie sie sie lösen können.
Problemphänomen
Schauen wir uns zuerst die Symptome an. Zum Beispiel das folgende Beispiel:
@SpringbootApplicationPublic Class Application {public static void main (String [] args) {SpringApplication.run (application.class, args); } @RestController Klasse HelloConTroller {@postmapping ("/user") public userDto user (@RequestBody userDto userDto) löst eine Ausnahme aus {return userDto; }} @Data @noargSconstructor @AllargSconstructor statische Klasse userDto {private String username; Privatgeburtstag; }}Der obige Code erstellt eine einfache Spring -Boot -Webanwendung, die eine Schnittstelle zur Übermittlung von Benutzerinformationen bietet, die Daten vom LocalDate -Typ enthält. Wenn wir zu diesem Zeitpunkt vorgegeben werden, um diese Schnittstelle aufzurufen, erhalten wir den folgenden Fehler:
2018-03-13 09: 22: 58.445 Warn [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.defaultHandLexceptionResolver-fehlgeschlagen, um die HTTP-Nachricht zu lesen: org.springFramework.http.converter.httpMessagenotreadableException: JSON PARSE ERROR: Kann keine Instanz von Java.Time.localdate konstruieren: Kein geeigneter Konstruktor gefunden, kann nicht von Objektwert Deserialisieren (fehlender Default -Konstruktor oder Schaffender oder Erfindungs ", addieren/erfassen Sie Informationen?). Eine verschachtelte Ausnahme ist com.fasterxml.jackson.databind.jsonmapPingexception: Kann keine Instanz von Java.Time.localdate: Kein geeigneter Konstruktor gefunden, kann nicht von Objektwert des Objektwerts des Objektwerts des Objektwerts des Objekts des Objekts deses Deserializierens von/edeltypen?) Auf [Quelle: Java.io..ioio.Pusor.Pushback add/6067065) auf [Quelle: java.io. Zeile: 1, Spalte: 63] (durch Referenzkette: java.util.ArrayList [0]-> com.Didispace.userdto ["Geburtstag"])
Analyse und Lösung
Für die obige Fehlermeldung JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , Kinderschuhe, die mit Spring MVC vertraut sind, sollten den Fehler sofort lokalisieren und mit der Deserialisierung von LocalDate in Verbindung gebracht werden. Es wird jedoch immer noch viele Leser geben, die durch diese Fehlermeldung java.util.ArrayList[0]->com.didispace.UserDto["birthday"] verwechselt werden. UserDto["birthday"] ist ein lokales Objekt. Was hat es mit dem ArrayList List -Objekt zu tun?
Wir können genauso gut eine Anfrage manuell über Postbote oder andere Informationen senden, um zu sehen, was der Server zurückgibt? Sie können beispielsweise eine Anfrage gemäß dem folgenden Bild stellen:
Aus der obigen Abbildung können wir die Verwirrung verstehen, die ich oben erwähnt habe. Standardmäßig serialisiert Spring MVC Lokaldate in einen Array -Typ, und wenn er vorgetäuscht wird, verarbeitet es es immer noch nach ArrayList, sodass es natürlich nicht zu einem LocalDate -Objekt deserialisiert werden kann.
Lösung
Um das obige Problem zu lösen, ist es sehr einfach, da Jackson auch einen vollständigen Satz von Serialisierungslösungen dafür bereitstellt. Wir müssen nur die Abhängigkeit von Jackson-Datype-JSR310 in pom.xml wie folgt vorstellen:
<Depopenty> <gruppe> com.fasterxml.jackson.datatype </Groupid> <artifactId> Jackson-Datype-jsr310 </artifactid> </abhängig>
Hinweis: Wenn der übergeordnete Spring -Boot festgelegt ist, müssen keine bestimmte Version angegeben werden, und es wird nicht empfohlen, eine bestimmte Version anzugeben.
Einkapseln Sie die Implementierung der Zeitdatum-API-Serialisierung von Java 8 in diesem Modul und ihre spezifische Implementierung in dieser Klasse: com.fasterxml.jackson.datatype.jsr310.javatimememeModule: Einige frühere Versionen sind verrückt nach dieser Klassen "com.fasterxml.jackSon.datypuring.datypuring.datypuring.datype.jsr310.jsr310.JackSon.datype. Wir müssen dieses Serialisierungsmodul nur zur oben genannten Anwendungs -Hauptklasse hinzufügen und gleichzeitig das Standardformat ISO 8601 aktivieren:
@BeanPublic ObjectMapper SerializingObjectMapper () {ObjectMapper ObjectMapper = new ObjectMapper (); ObjectMapper.Disable (SerializationFeature.write_dates_as_timestamps); ObjectMapper.registerModule (New Javatimemodule ()); ObjectMapper zurückgeben;}Zu diesem Zeitpunkt, wenn wir gerade auf die Schnittstelle zugreifen, ist es kein Array -Typ mehr, und die oben genannten Fehler treten nicht mehr auf, wenn wir den vorgegebenen Client aufrufen.
Codebeispiel
Für relevante Beispiele in diesem Artikel können Sie das Verzeichnis Kapitel 3-1-7 im folgenden Repository anzeigen:
GitHub: https://github.com/dyc87112/springboot-learning
Gitee: https://gitee.com/diidispace/springboot-learning
Zusammenfassen
Das obige ist das Serialisierungsproblem bei der Verwendung von Java 8 Uhrzeit- und Datums -API (LocalDate usw.) im Spring Boot und vorgetäuscht. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!