Spring mvc SpringMVC:在每个响应中追加新行
考虑简单的@RestController,返回一个映射: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
@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())
}
}