【问题标题】:A string instead of JSON Object is returned from a Spring rest controller从 Spring 休息控制器返回一个字符串而不是 JSON 对象
【发布时间】: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


【解决方案1】:

尝试将 .ajax 选项对象中的 dataType 选项显式设置为“json”,包括双引号。

【讨论】:

  • 是的,那是客户端的事情,因为设置 dataType : "json" 让它工作。那时,它从来都不是服务器端代码,imo。因为我正在研究如何处理我的其他 AJAX 调用,并且我总是设置 dataType : "json" (该选项只是没有为该上传代码设置)。
  • 如果您在此处 (api.jquery.com/jQuery.ajax) 阅读有关数据类型的信息,您会发现它会尝试做出明智的猜测。 Spring 可能会使用 mime 类型的文本标题进行响应,因此 JQuery 不会对响应执行任何操作。我已经有几个月没有使用 Spring MVC,但是您可以通过查看 docs.spring.io/spring/docs/current/spring-framework-reference/… 来调查标头
【解决方案2】:

您所要做的就是用@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); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2012-11-26
    • 2018-12-31
    • 1970-01-01
    • 2021-11-03
    • 2018-07-03
    相关资源
    最近更新 更多