इस मुद्दे ने मुझे पागल कर दिया है: वसंत एक ऐसा शक्तिशाली उपकरण है और फिर भी, आउटपुट स्ट्रिंग लिखने के रूप में इस तरह की एक सरल चीज के रूप में JSON बदसूरत हैक्स के बिना असंभव लगता है।
मेरा समाधान (कोटलिन में) जो मुझे कम से कम घुसपैठ और सबसे पारदर्शी लगता है एक नियंत्रक सलाह का उपयोग करना है और यह जांचना है कि क्या अनुरोध समापन बिंदुओं के एक विशेष सेट में चला गया है (REST API आमतौर पर जब से हम सबसे अधिक बार चाहते हैं कि JSON के रूप में यहां से सभी उत्तर वापस आ जाएं। और दिए गए डेटा के आधार पर सामने वाले में विशेषज्ञता न बनाएं कि लौटा डेटा एक सादा स्ट्रिंग है ("JSON डेज़रिएलाइज़ेशन मत करो!") या कुछ और ("Do JSON deserialization!")। इसका सकारात्मक पहलू यह है कि नियंत्रक समान और बिना हैक के रहता है।
supports
विधि सुनिश्चित करें कि सभी अनुरोध करता है कि ने संभाला है कि बनाता है StringHttpMessageConverter
(उदाहरण के लिए कनवर्टर है कि हैंडल सभी नियंत्रकों कि सादा सूत्र के उत्पादन में) कार्रवाई की जाती है और में beforeBodyWrite
विधि, हम जो मामलों में नियंत्रित कर हम बीच में और JSON करने के लिए उत्पादन परिवर्तित करना चाहते हैं (और तदनुसार हेडर को संशोधित करें)।
@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
}
}
मैं भविष्य में आशा करता हूं कि हमें एक सरल एनोटेशन मिलेगा जिसमें हम ओवरराइड कर सकते हैं जिसका HttpMessageConverter
उपयोग आउटपुट के लिए किया जाना चाहिए।