Vấn đề này đã khiến tôi phát điên: Spring là một công cụ mạnh mẽ và tuy nhiên, một điều đơn giản như viết một chuỗi đầu ra như JSON dường như là không thể nếu không có các bản hack xấu xí.
Giải pháp của tôi (trong Kotlin) mà tôi thấy ít xâm phạm và minh bạch nhất là sử dụng lời khuyên của bộ điều khiển và kiểm tra xem yêu cầu có đi đến một bộ điểm cuối cụ thể không (API REST thường vì chúng tôi thường muốn trả về TẤT CẢ các câu trả lời từ đây dưới dạng JSON và không thực hiện các chuyên môn trong frontend dựa trên việc dữ liệu được trả về có phải là một chuỗi đơn giản ("Đừng thực hiện khử tuần tự JSON!") hay một cái gì khác ("Thực hiện khử tuần tự JSON!")). Khía cạnh tích cực của điều này là bộ điều khiển vẫn giữ nguyên và không có hack.
Các supports
phương pháp làm cho chắc chắn rằng tất cả các yêu cầu đã được xử lý bởi các StringHttpMessageConverter
(ví dụ như bộ chuyển đổi mà xử lý đầu ra của tất cả các bộ điều khiển mà trở về chuỗi đồng bằng) được xử lý và trong beforeBodyWrite
phương pháp, chúng tôi kiểm soát, trong đó trường hợp chúng ta muốn làm gián đoạn và chuyển đổi đầu ra để JSON (và sửa đổi các tiêu đề cho phù hợp).
@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
}
}
Tôi hy vọng trong tương lai chúng ta sẽ có được một chú thích đơn giản trong đó chúng ta có thể ghi đè HttpMessageConverter
nên được sử dụng cho đầu ra.