考虑简单的@RestController,返回一个 Map:
@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
Map<String, Any> map = HashMap<>();
map.put(...);
return ResponseEntity(map, HttpStatus.OK);
}
这很好用,它以 JSON 形式返回 Map。
但是,当您
curl
终端中的请求,光标停留在 JSON 的末尾,不幸的是,使用它很不舒服。我们之前的实现总是返回 \n
在每个 JSON 的末尾。有没有办法让 Spring 附加 \n
还有?编辑
我试图实现格式化程序:
private inner class MapFormatter : Formatter<Map<*, *>> {
override fun parse(payload: String, locale: Locale): Map<*, *> {
return Gson().fromJson(payload, Map::class)
}
override fun print(payload: Map<*, *>, locale: Locale): String {
return Gson().toJson(payload) + "\n"
}
}
并添加了:
override fun addFormatters(registry: FormatterRegistry) {
registry.addFormatter(MapFormatter())
}
不幸的是,它从未被调用过,我猜格式化程序是用于其他用途的。
最佳答案
最后通过HttpMessageConverter
完成:
class GsonHttpMessageConverter : AbstractHttpMessageConverter<Map<String, Any?>>(
MediaType("application", "json", Charset.forName("UTF-8"))) {
override fun readInternal(clazz: Class<out Map<String, Any?>>, inputMessage: HttpInputMessage)
= Gson().fromJson(IOUtils.toString(inputMessage.body, "UTF-8"), clazz)
override fun supports(clazz: Class<*>) = Map::class.java.isAssignableFrom(clazz)
override fun writeInternal(payload: Map<String, Any?>, outputMessage: HttpOutputMessage) {
outputMessage.body.write(Gson().toJson(payload) + "\n".toByteArray())
}
}
关于spring-mvc - Spring MVC : Append new line to each response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51674496/