往往有這麼個需求,在新增用戶時,頁面以 ajax 方式把 user 對象數據提交到後臺控制器上,
控制器方法中的參數以對象形式進行接收,這時就需要把json字符串自動轉換爲對象
在SpringBoot或SpringMvc中,有@ResponseBody 、@RequestBody 兩個註解
- @ResponseBody 註解是把數據以 json字符串的方式傳給客戶端(或通過produces自定義爲其他格式)
- @RequestBody 註解是把客戶端傳來的字符串數據轉換爲對象,但是需要 HttpMessageConverter 消息轉換器
通過繼承 WebMvcConfigurationSupport 類,重寫configureMessageConverters方法,在項目中引用 fastjson庫,它有一個FastJsonHttpMessageConverter的類,實現了HttpMessageConverter消息轉換,我們只要設置支持轉換那些類型即可,設置如下:
@Configuration
public class CustomeInterceptor extends WebMvcConfigurationSupport {
//UTF-8 格式的數據
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//創建fastJson消息轉換器
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
converters.add(fastConverter);
}
}
ajax提交字符串數據,contentType: ‘application/json’
<script type="text/javascript" th:inline="javascript">
function saveMenu() {
var data = JSON.stringify({id: "1",pId : "root",name:"菜單"})
$.ajax({
type : "post",
url : "/saveMenu",
data : data,
contentType: 'application/json',
success : function (result) {
console.log(result);
}
})
}
</script>
控制器接收,consumes = “application/json”
@RequestMapping(value = "/saveMenu" , method = RequestMethod.POST , consumes = "application/json")
@ResponseBody
public String saveMenu(@RequestBody Tree tree){
System.out.println("tree:" + JSON.toJSONString(tree));
return "success";
}
method 表示接收 POST方式的請求
consumes="application/json"表示只處理請求頭中Content-Type爲application/json的請求
produces=“application/json” 表示向客戶端返回Content-Type爲application/json的數據
看一下調式效果,可以看出對象中的值,ajax過來的json字符串數據,已經自動轉換爲對象了