首页 > 解决方案 > 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())
}

不幸的是,它从来没有被调用过,我猜格式化程序是为了别的东西。

标签: spring-mvc

解决方案


最后通过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())
    }
}

推荐阅读