在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对象(而不是一个字符串)。或者这是关于客户端代码的东西吗?
任何帮助表示赞赏。
json的定义是一个字符串...它是一个javascript数组或对象的字符串表示形式。如果你正在返回一个非json字符串,为什么你在成功回调中将它解析为json?抛出什么错误?检查浏览器开发工具网络中的实际请求以检查状态,发送响应主体数据等以获得更多线索 – charlietfl