【发布时间】:2015-11-18 10:50:58
【问题描述】:
在 SO 上有很多关于 Spring @RestController 不返回 JSON 对象而是返回字符串的帖子。其中许多问题都与RestController 上的不正确注释有关。我阅读了它们并尝试将解决方案应用于我的休息控制器,但我仍在向我的 JavaSript AJAX 处理程序返回一个字符串。这次这篇文章与其他关于此问题的 SO 帖子的不同之处在于,我的休息控制器正在接收文件上传并返回休息响应。我的休息控制器如下所示。
@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;
}
}
我目前的解决方法是使用 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 对象(而不是字符串)。或者这与客户端代码有关吗?
感谢任何帮助。
【问题讨论】:
-
json 根据定义是一个字符串......它是一个 javascript 数组或对象的字符串表示形式。如果您返回一个非 json 字符串,为什么在成功回调中将其解析为 json?抛出什么错误?检查浏览器开发工具网络中的实际请求以检查状态、发送的响应正文数据等以获取更多线索
标签: jquery ajax spring spring-mvc spring-boot