常用SpringMVC的基本都知道,@RestController和@ResponseBody加上了都會返回json數據。它們的區別主要是注解方面,一個是類級別的一個是方法級別。
之前我們比較喜歡使用@ResponseBody,后來覺得重復性太多了,特別是使用swagger以后,一個方法上面關注解就上了4到5層,為了減少這些繁雜的過程,我們就采取簡潔策略,因為都是基於前后端分離開發,前端展示也不打算使用諸如jsp、freemarke、volocity等模板語言。直接上手html,當然主要是以ajax的方式進行交互。
先列舉這么幾個情況?通常情況下,類上面有對應的RestController注解或者是你的類上是@Controller注解,並在每個方法上面加上@ResponseBody。正常是應該返回JSON數據的。通過POSTMAN測試或者Jmeter。
關於@RestController和@ResponseBody源碼解析可以參考我的這篇文章:前后端交互之封裝Ajax+SpringMVC源碼分析
當然有的時候沒有返回的話,根據你使用而定比如使用FastJSON卻沒有返回對應的JSON數據,可通過在SpringMVC配置文件加上如下內容解決:
<!-- FastJson注入 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 避免IE執行AJAX時,返回JSON出現下載文件 -->
<!-- FastJson -->
<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 這里順序不能反,一定先寫text/html,不然ie下出現下載提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
如果是jackjson,可通過在SpringMVC的配置文件加上如下內容解決:
<mvc:annotation-driven>
<mvc:message-converters>
<!-- 避免string類型直接解析成json-->
<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
當然了,如果還出現這種情況的話,通常情況下可將返回值定為JSONObject或Object,而不是String,因為通過String的話,還需要調用JSONObject.toString()方法進進行轉換。有的時候轉換不起作用。
當然了,即便出現這種情況也可以轉換為json,比如使用jQuery的ajax方法交互,可通過eval進行轉義或者JSON.parse,將普通字符串轉為JSON格式字符串。另外還有一個要簡單說明下,就是如果是返回中文亂碼問題,注意要在對應的方法上加上這么一句produces="application/json;charset=utf-8",即可解決亂碼問題
如果是安卓,記得有一次我遇到這種情況,也是給他提供接口的時候,突然返回是帶斜杠的字符串。他是通過replace方法進行替換解決的。不過個人建議,如果遇到這種情況的話,可以使用返回值為JSONObject這樣可以避免出現這種情況。
