SseEmitter event-stream多了双引号问题排除,及乱码及WebMvcConfigurationSupport的坑

主要是使用了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的。找到原因就按下面改

解决了

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值