LocalDate, Localtime, LocalDateTime adalah API waktu dan tanggal yang disediakan oleh Java 8, yang terutama digunakan untuk mengoptimalkan operasi pemrosesan waktu dan tanggal di Java 8 sebelumnya. Namun, ketika kami menggunakan Spring Boot atau Spring Cloud Ries, kami sering menemukan bahwa berbagai masalah akan terjadi ketika menggunakan parameter permintaan atau hasil yang mengembalikan. Dalam artikel ini, kita akan membicarakan masalah yang muncul dalam situasi ini dan bagaimana menyelesaikannya.
Fenomena Masalah
Mari kita lihat gejalanya terlebih dahulu. Misalnya, contoh berikut:
@SpringbootApplicationPublic Class Application {public static void main (string [] args) {springApplication.run (application.class, args); } @RestController kelas HelloController {@PostMapping ("/user") UserDTO PUBLO USER (@RequestBody userdto userdto) melempar pengecualian {return usdto; }} @Data @noargsconstructor @allArgsconstructor kelas statis userdto {private string username; Ulang tahun lokal pribadi; }}Kode di atas membangun aplikasi web boot spring sederhana, yang menyediakan antarmuka untuk mengirimkan informasi pengguna, yang berisi data jenis lokal. Pada saat ini, jika kami menggunakan peti untuk memanggil antarmuka ini, kami akan mendapatkan kesalahan berikut:
2018-03-13 09: 22: 58.445 WARN [http-nio-9988-exec-3] org.springframework.web.servlet.mvc.support.defaulThandLerExceptionResolver-Gagal membaca pesan http: org.springframework.http.converter.httpMessAnotReadableException: JSON Parse error: Tidak dapat membuat contoh dari java.time.localDate: tidak ada konstruktor yang sesuai ditemukan, tidak dapat deserialisasi dari nilai objek (hilangnya konstruktor atau pembuat default, atau mungkin perlu menambah/enable jenis informasi?); Pengecualian bersarang adalah com.fasterxml.jackson.databind.jsonmappingException: tidak dapat membangun contoh java.time.localDate: tidak ada konstruktor yang sesuai, tidak dapat deserialize dari nilai objek (konstruktor default yang hilang, atau mungkin perlu menambah/mengaktifkan informasi jenis?) Di [sumber: java.io.io.io. Baris: 1, kolom: 63] (melalui rantai referensi: java.util.arraylist [0]-> com.didispace.userdto ["ulang tahun"])
Analisis dan solusi
Untuk pesan kesalahan di atas JSON parse error: Can not construct instance of java.time.LocalDate: no suitable constructor found, can not deserialize from Object value , sepatu anak -anak yang akrab dengan MVC musim semi harus dapat menemukan kesalahan tersebut segera dan terkait dengan deserialisasi lokal. Namun, masih akan ada banyak pembaca yang akan bingung dengan pesan kesalahan ini java.util.ArrayList[0]->com.didispace.UserDto["birthday"] . UserDto["birthday"] Kami menamai dan mengirimkan adalah objek lokal. Apa hubungannya dengan objek Daftar ArrayList?
Kami mungkin juga mengirim permintaan secara manual melalui tukang pos atau informasi lain untuk melihat apa yang dikembalikan server? Misalnya, Anda dapat membuat permintaan sesuai dengan gambar berikut:
Dari gambar di atas, kita dapat memahami kebingungan yang saya sebutkan di atas. Faktanya, secara default, Spring MVC membuat serial lokal menjadi jenis array, dan ketika berpura -pura dipanggil, masih memprosesnya sesuai dengan Daftar Array, jadi secara alami tidak dapat deserialisasi ke objek LocalDate.
Larutan
Untuk menyelesaikan masalah di atas, ini sangat sederhana, karena Jackson juga menyediakan serangkaian solusi serialisasi lengkap untuk ini. Kami hanya perlu memperkenalkan ketergantungan Jackson-Datatype-JSR310 di pom.xml, sebagai berikut:
<dependency> <groupid> com.fasterxml.jackson.dataType </groupid> <ArtifactId> Jackson-datatype-jsr310 </artifactid> </dependency>
Catatan: Ketika induk dari Spring Boot diatur, tidak perlu menentukan versi tertentu, dan tidak disarankan untuk menentukan versi tertentu.
Mengenak implementasi serialisasi API-date-date Java 8 dalam modul ini, dan implementasinya yang spesifik ada di kelas ini: com.fasterxml.jackson.datatype.jsr310.javatimemodule (Catatan: beberapa versi sebelumnya. Perlu menambahkan modul serialisasi ini ke kelas utama aplikasi di atas, dan pada saat yang sama mengaktifkan format ISO 8601 standar:
@BeanPublic ObjectMapper SerializingObjectMapper () {ObjectMapper ObjectMapper = new ObjectMapper (); ObjectMapper.Disable (SerializationFeature.write_dates_as_Timestamps); ObjectMapper.RegisterModule (javatimemodule baru ()); return ObjectMapper;}Pada saat ini, ketika kami mengakses antarmuka sekarang, itu bukan lagi jenis array, dan kesalahan di atas tidak akan lagi terjadi ketika kami memanggil klien kepura -pura.
Contoh Kode
Untuk contoh yang relevan dalam artikel ini, Anda dapat melihat direktori Bab 3-1-7 di repositori berikut:
Github: https://github.com/dyc87112/springboot-learning
Gitee: https://gitee.com/diidispace/springboot-learning
Meringkaskan
Di atas adalah masalah serialisasi menggunakan Java 8 waktu dan tanggal API (LocalDate, dll.) Di Spring Boot dan berpura -pura. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!