Saya menggunakan Spring Boot (1.2.1), dengan cara yang sama seperti tutorial Membangun Layanan Web yang tenang :
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Jadi di atas, Spring MVC secara implisit menggunakan Jackson untuk menserialisasikan EventList
objek saya ke JSON.
Tetapi saya ingin melakukan beberapa penyesuaian sederhana pada format JSON, seperti:
setSerializationInclusion(JsonInclude.Include.NON_NULL)
Pertanyaannya adalah, apa cara termudah untuk menyesuaikan mapper JSON implisit?
Saya mencoba pendekatan tersebut dalam posting blog ini , membuat CustomObjectMapper dan seterusnya, tetapi langkah 3, "Daftarkan kelas dalam konteks Musim Semi", gagal:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter);
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
Sepertinya instruksi tersebut untuk versi Spring MVC, sementara saya mencari cara sederhana untuk membuatnya berfungsi dengan Spring Boot terbaru.
java
spring
spring-mvc
jackson
spring-boot
Jonik
sumber
sumber
Jawaban:
Jika Anda menggunakan Spring Boot 1.3, Anda dapat mengonfigurasi penyertaan serialisasi melalui
application.properties
:Mengikuti perubahan di Jackson 2.7, Spring Boot 1.4 menggunakan properti bernama
spring.jackson.default-property-inclusion
:Lihat bagian " Menyesuaikan Jackson ObjectMapper " dalam dokumentasi Spring Boot.
Jika Anda menggunakan Spring Boot versi sebelumnya, cara termudah untuk mengkonfigurasi penyertaan serialisasi di Spring Boot adalah dengan mendeklarasikan
Jackson2ObjectMapperBuilder
bean Anda sendiri yang dikonfigurasi dengan tepat . Sebagai contoh:sumber
@ComponentScan
,@EnableAutoConfiguration
dll)?@Configuration
kelas dalam aplikasi Anda. Kelas utamaApplication
adalah tempat yang bagus untuk itu.Saya menjawab agak terlambat untuk pertanyaan ini, tetapi seseorang, di masa depan, mungkin menganggap ini berguna. Pendekatan di bawah ini, selain banyak pendekatan lain, bekerja paling baik, dan menurut saya pribadi akan lebih sesuai untuk aplikasi web.
sumber
WebMvcConfigurer
Banyak hal yang dapat dikonfigurasi di properti aplikasi. Sayangnya fitur ini hanya ada di Versi 1.3, tetapi Anda dapat menambahkan di Config-Class
[PEMBARUAN: Anda harus bekerja pada ObjectMapper karena
build()
-metode dipanggil sebelum konfigurasi dijalankan.]sumber
Dokumentasi menyatakan beberapa cara untuk melakukan ini.
sumber
ObjectMapper
? Maksud saya, menjaga default dan juga kebiasaan.Anda dapat menambahkan metode berikut di dalam kelas bootstrap Anda yang dianotasi dengan
@SpringBootApplication
sumber
spring.jackson.serialization-inclusion=non_null
dulu bekerja untuk kamiTetapi ketika kami meningkatkan versi boot musim semi ke 1.4.2.RELEASE atau lebih tinggi, itu berhenti bekerja.
Sekarang, properti lain
spring.jackson.default-property-inclusion=non_null
sedang melakukan keajaiban.faktanya,
serialization-inclusion
sudah usang. Inilah yang dilemparkan intellij saya kepada saya.Jadi, mulailah menggunakan
spring.jackson.default-property-inclusion=non_null
sebagai gantinyasumber
Saya menemukan solusi lain, yang cukup bagus.
Pada dasarnya, hanya lakukan langkah 2 dari blog yang diposting yang disebutkan , dan tentukan ObjectMapper kustom sebagai Spring
@Component
. (Hal-hal mulai bekerja ketika saya baru saja menghapus semua hal AnnotationMethodHandlerAdapter dari langkah 3.)Bekerja selama komponen ada dalam paket yang dipindai oleh Spring. (Menggunakan
@Primary
tidak wajib dalam kasus saya, tetapi mengapa tidak membuatnya eksplisit.)Bagi saya ada dua keuntungan dibandingkan dengan pendekatan lainnya:
Jackson2ObjectMapperBuilder
.new CustomObjectMapper()
alih-alihnew ObjectMapper()
.sumber
ObjectMapper
instance apa pun yang dibuat atau dikonfigurasi oleh Spring Boot.@RestController
kelas yang saat ini sudah cukup bagi saya. (Jadi maksud Anda, instance tersebut dibuat oleh Spring MVC, bukan Spring Boot?) Tetapi jika saya mengalami kasus lain di mana ObjectMappers perlu dibuatkan, saya akan mengingat pendekatan Jackson2ObjectMapperBuilder!Ketika saya mencoba menjadikan ObjectMapper sebagai yang utama di boot musim semi 2.0.6 Saya mendapat kesalahan Jadi saya memodifikasi yang dibuat oleh sepatu bot musim semi untuk saya
Lihat juga https://stackoverflow.com/a/48519868/255139
sumber
Saya menemukan solusi yang dijelaskan di atas dengan:
spring.jackson.serialization-inclusion = non_null
Untuk hanya bekerja mulai dari boot musim semi versi 1.4.0.RELEASE. Dalam semua kasus lainnya, konfigurasi diabaikan.
Saya memverifikasi ini dengan bereksperimen dengan modifikasi sampel sepatu bot musim semi "spring-boot-sample-jersey"
sumber
Saya tahu pertanyaan yang menanyakan tentang sepatu bot Musim Semi, tetapi saya yakin banyak orang yang mencari cara melakukan ini di sepatu non-Musim Semi, seperti saya mencari hampir sepanjang hari.
Di atas Spring 4, Anda tidak perlu melakukan konfigurasi
MappingJacksonHttpMessageConverter
jika Anda hanya bermaksud untuk mengkonfigurasiObjectMapper
.Anda hanya perlu melakukan:
Dan dalam konfigurasi Spring Anda, buat kacang ini:
sumber