問題描述:
通過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在前面。