spring-mvc - Spring MVC:将新行附加到每个响应
问题描述
考虑简单的@RestController,返回一个 Map:
@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
Map<String, Any> map = HashMap<>();
map.put(...);
return ResponseEntity(map, HttpStatus.OK);
}
这很好用,它以 JSON 形式返回地图。
但是,当您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())
}
}
推荐阅读
- regex - 我可以使用正则表达式、Like 运算符和/或 Instr() 在较大的字符串中查找模式的索引吗?
- laravel - 如何将 laravel 路由重定向到我使用 vue-router 在 vue 中创建的链接
- excel - 使用 Google Colab 时如何将文件写入本地驱动器?
- excel - 转换为 Excel 后的数字形式为“123.456.789”
- excel-formula - Excel公式表示时间是否在某个小时范围内
- ios - 在`ios`中使用常规图像和按钮图像有何不同?
- angular - 启用跨域请求 Spring Boot
- inno-setup - Inno Setup:如果快捷方式已经存在,请不要(重新)创建快捷方式
- javascript - 世博会位置权限立即被拒绝 iOS 模拟器
- postgresql - 使用 session.query(cls).from_statement 多次插入“on conflict ...返回*”在提交之前不会反映更改