Spring MVC:在每个响应中添加新行

时间:2018-08-03 14:09:25

标签: spring-mvc

考虑简单的@RestController,返回一个Map:

@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
    Map<String, Any> map = HashMap<>();
    map.put(...);
    return ResponseEntity(map, HttpStatus.OK);
}

这很好用,并且将Map作为JSON返回。

但是,当您在终端中curl进行请求时,光标停留在JSON的末尾,很遗憾,使用它很不舒服。在每个JSON的末尾,我们之前的实现始终返回\n。有没有办法使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())
}

不幸的是它从未被调用过,我想格式化程序是用于其他用途的。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可以使用Jackson序列化为字符串,然后附加所需的内容并使其成为响应实体的主体。

类似的东西:

//Somewhere in the class fields
private final ObjectMapper mapper = new ObjectMapper();

@GetMapping("/foo")
public ResponseEntity<Map<String, Object>> foo() {
    Map<String, Any> map = HashMap<>();
    map.put(...);
    return ResponseEntity(mapper.writeValueAsString(map) + "/n", HttpStatus.OK);
}

然而,正确的答案将是使您使用的解析JSON的内容按照您的意愿显示出来。因为现在您将不得不添加所有这些复杂性。

另一种解决方案是通过设置漂亮的打印机https://fasterxml.github.io/jackson-databind/javadoc/2.7/com/fasterxml/jackson/databind/ObjectMapper.html#setDefaultPrettyPrinter(com.fasterxml.jackson.core.PrettyPrinter)来“漂亮地打印” JSON。

如果您要执行此操作,请在构建控制器/服务的地方使用如下所示的方法在春季级别进行设置:

//Need to look at the documentation and figure out how to set this.    
@Bean
public Jackson2ObjectMapperBuilderCustomizer mapperBuilderCustomizer() {
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
}