AdSense

網頁

2018/1/2

Spring MVC 前端ajax傳送json資料至Controller

今天從前端利用jQuery ajax傳送json資料至Spring MVC的Controller時,出現以下錯誤

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

造成問題的程式碼如下。

前端頁面送出json的jQuery。

$.ajax({
  url: ...,
  method:"post",
  contentType:"application/json;charset=utf-8",
  dataType:"json",
  data: JSON.stringify(formData),
  success: function(data) { ... }
});

處理請求的Controller

@PostMapping(value="/user/add", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String add(@RequestBody MultiValueMap map) throws Exception {
  
  ...
}

造成例外錯誤是因為@RequestBody標記的參數必須是一個model Object(DTO),例如UserProfile,不可以是Map,所以將@RequestBody MultiValueMap map改為@RequestBody UserProfile userProfile問題就解決了。

原本我的需求是因為form表單裡面有些欄位並不屬於model物件的成員,所以不想用model物件來接收json參數,改成用@RequestBody MultiValueMap map來收,但就出現上述的問題

如果要用@RequestBody MultiValueMap map來接收form表單的參數,則前端jQuery ajaxcontentType必須改為application/x-www-form-urlencoded; charset=UTF-8,且form表單資料只要serialized即可,不用json字串化。

$.ajax({
  url: ...,
  method:"post",
  contentType:"application/x-www-form-urlencoded; charset=UTF-8",
  dataType:"json",
  data: formData,
  success: function(data) { ... }
});

參考:

沒有留言:

AdSense