【问题标题】:Undefined Javascript Error When AJAX Call FailsAJAX 调用失败时未定义的 Javascript 错误
【发布时间】:2016-01-22 10:51:16
【问题描述】:

我有一个被 AJAX 调用并返回 JSON 的 Spring MVC 控制器。如果调用成功且没有错误,我将返回带有键“message”的字符串消息。同样,如果捕获到异常,我也会返回带有键“消息”的字符串错误。我还返回一个 HTTP 错误响应。

在我的 Javascript 中,我在警报中输出此“消息”。如果呼叫成功,警报会显示消息。如果调用不成功,我会收到“数据未定义”的 Javascript 错误。

  1. 为什么“数据”在成功时可访问,但在调用失败时无法访问,我需要进行哪些更正才能使其正常工作?
  2. 我是使用 Spring 进行 AJAX 调用的新手,因此欢迎和感谢对下面我的解决方案的任何一般性反馈/批评。

注意Javascript 中的警报和消息本身是虚拟实现,直到我通过修改 DOM 正确地提供用户反馈。

控制器

@RequestMapping(value = "/getMovieData", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public Map<String, Object> getMovieData(@RequestBody Map<String, Object> json, HttpServletResponse response) {

    String movieId = json.get("id").toString();

    Map<String, Object> rval = new HashMap<String, Object>();

    try {
        Movie movie = movieService.getMovieData(movieId);           
        rval.put("message", "You have succeeded");
        rval.put("movie", movie);
    } catch (Exception e) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        rval.put("message", "You have an error - " + e.getMessage());
    }

    return rval;

}

Javascipt

function getMovieData(data) {

    var request = $.ajax({

        type : 'POST',
        url : '<c:url value="/getMovieData" />',
        dataType : "json",
        contentType : "application/json; charset=utf-8",
        data : data,

    });

    request.done(function(data) {
        alert("Success: " + data.message);          
        populateMovieFields(data.movie);
    });

    request.fail(function(xhr, status, error, data) {
        alert("status: " + status);
        alert("error: "  + error);
        alert("Fail: " + data.message); 
    });

}

【问题讨论】:

  • fail 可能由于服务器响应以外的许多原因触发。首先不要假设它是失败回调中的 json。它可能是由连接错误、超时等引起的。需要对数据是什么进行一些类型检查,如果它甚至存在的话。 json解析错误也可以触发失败

标签: java jquery ajax spring-mvc


【解决方案1】:

JSON 响应在作为第一个参数传递的 jqXHR 对象中可用。

request.fail(function(jqXHR, textStatus, errorThrown) {
   alert("Fail: " + jqXHR.responseJSON.message); 
});

【讨论】:

  • 谢谢。我很好奇为什么会这样。我猜测响应对象(在我的情况下为“数据”)即使发生错误也被 Spring 或 Tomcat 包装在 xhr 对象中?是这样吗?
  • 其实正确的参数是jqXHR, textStatus, errorThrown。响应不会作为参数直接注入fail 处理程序。我更新了我的答案以避免混淆。您可以查看docs 了解更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2023-03-26
  • 2013-06-27
相关资源
最近更新 更多