关于Spring @RestController
没有返回JSON对象而是返回String的帖子很多。其中许多问题都涉及RestController
上的不正确注释。我读了它们并尝试将解决方案应用到我的rest控制器,但我仍然将String返回给我的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
将返回的String解析为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);
}
关于我做错的任何想法?这个String响应是否特定于上传文件?
我在不同的控制器中有非常相似的逻辑,但它不接受文件上传,而是接受@RequestBody
并且AJAX回调实际上接收JSON对象(而不是字符串)。或者这是关于客户端代码的东西?
感谢任何帮助。
答案 0 :(得分:0)
您要做的就是用@RequestBody注释您的要求:
@RequestMapping(value="/import", method=RequestMethod.POST,
produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Map<String, Object> importData(@RequestParam("file")
MultipartFile file, @RequestBody req, HttpServletResponse resp) {
//you code goes here
}
在jquery端和您的json解析器
success : function(r) { callBack(r); }