FastJsonHttpMessageConverter造成返回结果多次序列化的问题

2,270 阅读1分钟

问题描述:

通过xml配置的形式将FastJsonHttpMessageConverter作为json格式的默认消息转化器,当controller返回的是被序列化后的json字符串时,最终返回给用户的内容格式是两次序列化后的字符串,不再是json字符串,包含大量转义字符。


原因分析:

出现这种情况的原因主要是controller返回的序列化后的字符串又经过了FastJsonHttpMessageConverter的序列化处理,导致了两次的序列化。

根本原因在于,FastJsonHttpMessageConverter没有对返回的结果类型做判断。因为返回的类型实际上是string,按道理不应该再使用FastJsonHttpMessageConverter进行处理,体现在源码上就是FastJsonHttpMessageConverter的supports方法没有做判断直接返回了true,意思就是不管返回类型是什么,都是用FastJsonHttpMessageConverter进行处理。另外一个原因是因为配置的FastJsonHttpMessageConverter默认会排在StringHtppMessageConverter之前。如果StringHttpMessageConverter在前,通过它会直接返回,就不会再进行FastJson消息转化器。


解决方案:

1. 在@ResponseBody注解修饰的controller中,不返回String,直接返回对象,就是不要将对象转化成json字符串。

2. 将StringHttpMessageConverter放到FastJsonHttpMessageConverter的前面,在配置FastJsonHttpMessageConverter时,多配置一个StringHttpMessageConverter在前面。