这个问题使我发疯了:Spring是一种强大的工具,但是,如果没有丑陋的hack,将输出字符串写为JSON这样简单的事情似乎是不可能的。
我发现(在Kotlin中)侵入性最小,最透明的解决方案是使用控制器建议,并检查请求是否到达了一组特定的端点(通常是REST API,因为我们通常希望从此处返回所有答案作为JSON而不根据返回的数据是纯字符串(“不要进行JSON反序列化!”)还是其他方式(“进行JSON反序列化!”)对前端进行专业化处理。积极的一面是,控制器保持不变,没有被黑客入侵。
该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
应该用于输出的注释。