Dieses Problem hat mich verrückt gemacht: Spring ist ein so mächtiges Werkzeug und doch scheint eine so einfache Sache wie das Schreiben eines Ausgabe-Strings wie JSON ohne hässliche Hacks unmöglich.
Meine Lösung (in Kotlin), die ich am wenigsten aufdringlich und am transparentesten finde, besteht darin, einen Controller-Rat zu verwenden und zu überprüfen, ob die Anforderung an einen bestimmten Satz von Endpunkten gesendet wurde (REST-API normalerweise, da wir von hier aus am häufigsten ALLE Antworten als JSON zurückgeben möchten und machen Sie keine Spezialisierungen im Frontend, basierend darauf, ob die zurückgegebenen Daten eine einfache Zeichenfolge ("JSON-Deserialisierung nicht durchführen!") oder etwas anderes ("JSON-Deserialisierung durchführen!") sind. Der positive Aspekt dabei ist, dass der Controller derselbe und ohne Hacks bleibt.
Das supports
Methode stellt sicher, dass alle Anforderungen, die vom verarbeitet wurden StringHttpMessageConverter
(z. B. der Konverter, der die Ausgabe aller Controller verarbeitet, die einfache Zeichenfolgen zurückgeben), verarbeitet werden. In der beforeBodyWrite
Methode steuern wir, in welchen Fällen wir die Ausgabe unterbrechen und in JSON konvertieren möchten (und ändern Sie die Header entsprechend).
@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
}
}
Ich hoffe, dass wir in Zukunft eine einfache Anmerkung erhalten, in der wir überschreiben können, welche HttpMessageConverter
für die Ausgabe verwendet werden soll.