主要是使用了WebMvcConfigurationSupport,并且重写了下面的方法,全局处理返回json
1,经过排查流失响应也被FastJsonHttpMessageConverter处理,加上下面的代码
这次返回到时正常了,但是项目中其他不是json返回的接口,例如下载文件接口,用不了没办法,只能看WebMvcConfigurationSupport的源码了
通过查看源码得知,当没有消息转换器才会设置下面的消息转换器,代码改成
加个this.addDefaultHttpMessageConverters(converters);双引号又出来的
比最开始好点,最开始那边是走的 FastJsonHttpMessageConverter,现在这样猜测不是走FastJsonHttpMessageConverter为什么,这样???????????????
只能硬的头皮找,谁叫WebMvcConfigurationSupport坑多呢。盲猜应该走的是
StringHttpMessageConverter消息转换器。结果看看源码
FastJsonHttpMessageConverter跟StringHttpMessageConverter 都是实现的
AbstractHttpMessageConverter的write方法。
里面有调自己的writeInternal(),分别断点writeInternal()。结果断点走了好几次,有FastJsonHttpMessageConverter的也有StringHttpMessageConverter。炸了。这么乱
。只能断点canWrite,查看响应头,结果有的是json,有的是text/plain。带双引号的部分都是json,换行符都是text/plain。这就可能解释了最开始为啥没换行,没啥设置默认的转换器没有转换text/plain
又要盲猜一波了,SseEmitter 每次send,就走下响应流程,就走下消息响应器
那这里是不是可以指定下响应头。
结果还这有这个方法,改成下面代码再试,看到胜利的曙光了,撸起袖子开干
撸起袖子砸键盘。不过突然发现没双引号了,那就及时收手,可能是头部没指定编码
有这个方法。再试试被
靠还是不行。罢工了,砸键盘了。
。。。。。。。。。。。。。。。。。。。。。。。。。
买个键盘,还是得硬着头皮看啊。emitter.send跟进去瞅瞅
ResponseBodyEmitterReturnValueHandler
看源码的意思是,找sseMessageConverters的canWrite,找到第一个满足跳转的消息转换。第一个是FastJsonHttpMessageConverter,不满足往下走,知道找到StringHttpMessageConverter。感觉没啥问题啊。而且最开始都不乱码,为什么呢?????????????
继续追踪sseMessageConverters,
看着源码,如果没有处理MediaType.TEXT_PLAIN,就再最前面加new StringHttpMessageConverter(StandardCharsets.UTF_8),带UTF-8。这就是前面不加this.addDefaultHttpMessageConverters(converters);不乱码的原因且正常的原因。没有StringHttpMessageConverter给你最前面加个utf-8的。找到原因就按下面改
解决了