Masalah ini membuat saya marah: Spring adalah alat yang ampuh, namun, hal sederhana seperti menulis String keluaran seperti JSON tampaknya tidak mungkin tanpa peretasan yang buruk.
Solusi saya (di Kotlin) yang menurut saya paling tidak mengganggu dan paling transparan adalah dengan menggunakan saran pengontrol dan memeriksa apakah permintaan tersebut mengarah ke serangkaian titik akhir tertentu (REST API biasanya karena kami paling sering ingin mengembalikan SEMUA jawaban dari sini sebagai JSON dan tidak membuat spesialisasi di frontend berdasarkan apakah data yang dikembalikan adalah string biasa ("Jangan lakukan deserialisasi JSON!") atau yang lain ("Lakukan deserialisasi JSON!")). Aspek positif dari ini adalah bahwa pengontrol tetap sama dan tanpa peretasan.
The supports
Metode memastikan bahwa semua permintaan yang ditangani oleh StringHttpMessageConverter
(misalnya konverter yang menangani output dari semua kontroler yang kembali string polos) diproses dan dalam beforeBodyWrite
metode, kita mengendalikan di mana kasus kita ingin menyela dan mengkonversi output ke JSON (dan ubah tajuk sesuai).
@ControllerAdvice
class StringToJsonAdvice(val ob: ObjectMapper) : ResponseBodyAdvice<Any?> {
override fun supports(returnType: MethodParameter, converterType: Class<out HttpMessageConverter<*>>): Boolean =
converterType === StringHttpMessageConverter::class.java
override fun beforeBodyWrite(
body: Any?,
returnType: MethodParameter,
selectedContentType: MediaType,
selectedConverterType: Class<out HttpMessageConverter<*>>,
request: ServerHttpRequest,
response: ServerHttpResponse
): Any? {
return if (request.uri.path.contains("api")) {
response.getHeaders().contentType = MediaType.APPLICATION_JSON
ob.writeValueAsString(body)
} else body
}
}
Saya berharap kedepannya kita akan mendapatkan anotasi sederhana dimana kita dapat mengganti yang HttpMessageConverter
seharusnya digunakan untuk keluaran.