2015-08-24 51 views
0

在SO上有很多關於Spring @RestController不是返回JSON對象而是一個字符串。許多這些問題涉及RestController上的不當註釋。我讀過它們並試圖在適當的時候將解決方案應用於我的其餘控制器,但我仍然向我的JavaSript AJAX處理程序返回一個字符串。這次與其他SO帖子關於此問題的帖子有所不同的是,我的其他控制器正在接收文件上傳並返回休息響應。我的休息控制器看起來像下面。從Spring休息控制器返回一個字符串而不是JSON對象

@RestController 
@RequestMapping(value="/api/admin") 
public class AdminImport { 
@AutoWired 
private SystemService systemService; 

@RequestMapping(value="/import", method=RequestMethod.POST, produces=MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody Map<String, Object> importData(@RequestParam("file") MultipartFile file, HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    Boolean success = false; 
    try { 
    if(!file.isEmpty()) { 
    systemService.importData(file.getInputStream()); 
    success = true; 
    } 
    } catch(Exception e) { } 
    Map<String, Object> map = new HashMap<>(); 
    map.put("success",success); 
    return map; 
} 
} 

我目前的解決辦法是在返回的String解析成使用JSON.Parse JSON對象。

myapi.upload = function(data, callBack) { 
var options = { 
    url : "api/admin/import", 
    data : data, 
    processData : false, 
    type : "POST", 
    contentType : false, 
    mimeType : "multipart/form-data", 
    success : function(r) { callBack(JSON.Parse(r)); } 
    error : function(r) { callBack({"success":false, "msg":"Unknown error"}); } 
} 
$.ajax(options); 
} 

關於我在做什麼的錯誤?這個字符串是否迴應了特定於上傳文件的內容?

我在一個不同的控制器中有非常相似的邏輯,但它接受一個@RequestBody而不是接受文件上傳,而AJAX回調實際上接收一個JSON對象(而不是一個字符串)。或者這是關於客戶端代碼的東西嗎?

任何幫助表示讚賞。

+0

json的定義是一個字符串...它是一個javascript數組或對象的字符串表示形式。如果你正在返回一個非json字符串,爲什麼你在成功回調中將它解析爲json?拋出什麼錯誤?檢查瀏覽器開發工具網絡中的實際請求以檢查狀態,發送響應主體數據等以獲得更多線索 – charlietfl

回答

1

嘗試明確地將.ajax選項對象中的dataType選項設置爲包含雙引號的「json」。

+0

是的,這是客戶端方面的事情,因爲設置dataType:「json」使它工作。這從來就不是服務器端代碼,imo。因爲我正在查看我如何處理其他AJAX調用,並且始終設置dataType:「json」(該選項只是未針對該上傳代碼設置)。 –

+0

如果你在這裏閱讀關於dataType(http://api.jquery.com/jQuery.ajax/)的內容,你會發現它試圖做出明智的猜測。 Spring可能會響應MIME類型的文本標題,所以JQuery對響應不做任何處理。我沒有使用Spring MVC幾個月,但是您可以通過查看http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc- ANN-httpentity –

相關問題