Spring mvc SpringMVC:在每个响应中追加新行

Spring mvc SpringMVC:在每个响应中追加新行,spring-mvc,Spring Mvc,考虑简单的@RestController,返回一个映射: @GetMapping("/foo") public ResponseEntity<Map<String, Object>> foo() { Map<String, Any> map = HashMap<>(); map.put(...); return ResponseEntity(map, HttpStatus.OK); } 并加入: override fun

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

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

override fun addFormatters(registry: FormatterRegistry) {
    registry.addFormatter(MapFormatter())
}

不幸的是,它从来没有被调用过,我想格式化程序是用来做其他事情的。

您可以使用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);
}

最后通过
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())
    }
}
类GsonHttpMessageConverter:AbstractHttpMessageConverter( MediaType(“应用程序”、“json”、Charset.forName(“UTF-8”)){ 重写fun readInternal(clazz:Class,inputMessage:HttpInputMessage) =Gson().fromJson(IOUtils.toString(inputMessage.body,“UTF-8”),clazz) 覆盖有趣的支持(clazz:Class)=Map::Class.java.isAssignableFrom(clazz) 重写fun writeInternal(有效负载:Map,outputMessage:HttpOutputMessage){ outputMessage.body.write(Gson().toJson(有效负载)+“\n”.toByteArray()) } }
我正在寻找某种通用解决方案,即
@配置
过滤器
,可以处理此问题。您的最后一部分是我正在寻找的,但仍然不确定如何实现这一点。
//Need to look at the documentation and figure out how to set this.    
@Bean
public Jackson2ObjectMapperBuilderCustomizer mapperBuilderCustomizer() {
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
}
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())
    }
}