AJAX调用失败时出现未定义的Javascript错误

AJAX调用失败时出现未定义的Javascript错误,java,jquery,ajax,spring-mvc,Java,Jquery,Ajax,Spring Mvc,我有一个SpringMVC控制器被AJAX调用并返回JSON。如果调用成功且没有错误,我将返回一条带有键“message”的字符串消息。同样,如果捕获到异常,我也会返回一个字符串错误,并使用键“message”。我还返回一个HTTP错误响应 在我的Javascript中,我在警报中输出这个“消息”。如果呼叫成功,警报将显示消息。如果调用不成功,我会得到一个Javascript错误“数据未定义” 为什么成功时可以访问“数据”,但呼叫失败时不能访问“数据”,我需要进行哪些更正才能使其正常工作 我是S

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

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

  • 为什么成功时可以访问“数据”,但呼叫失败时不能访问“数据”,我需要进行哪些更正才能使其正常工作
  • 我是Spring AJAX调用的新手,因此欢迎并感谢对我的解决方案的任何一般性反馈/批评
  • 注意:在我通过修改DOM正确提供用户反馈之前,Javascript中的警报和消息本身都是虚拟实现

    控制器

    @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;
    
    }
    
    @RequestMapping(value=“/getMovieData”,method=RequestMethod.POST,products=“application/json”)
    @应答器
    公共映射getMovieData(@RequestBody映射json,HttpServletResponse){
    字符串movieId=json.get(“id”).toString();
    Map rval=new HashMap();
    试一试{
    Movie Movie=movieService.getMovieData(movieId);
    rval.put(“消息”,“您已成功”);
    rval.put(“电影”,电影);
    }捕获(例外e){
    response.setStatus(HttpServletResponse.SC_BAD_请求);
    rval.put(“message”,“您有一个错误-”+e.getMessage());
    }
    返回rval;
    }
    
    爪哇岛

    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); 
        });
    
    }
    
    函数getMovieData(数据){ var请求=$.ajax({ 键入:“POST”, url:“”, 数据类型:“json”, contentType:“应用程序/json;字符集=utf-8”, 数据:数据, }); 请求完成(功能(数据){ 警报(“成功:+data.message”); populateMovieFields(data.movie); }); 请求失败(功能(xhr、状态、错误、数据){ 警报(“状态:+状态”); 警报(“错误:+错误”); 警报(“失败:+data.message”); }); }
    JSON响应在作为第一个参数传递的
    jqXHR
    对象中可用

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

    除了您的服务器响应之外,还可能由于许多原因触发失败。首先,不要假设失败回调中是json。这可能是由连接错误、超时等引起的。如果数据存在,则需要对数据进行类型检查。此外,json解析错误也会触发失败。谢谢。我很好奇为什么会这样。我猜响应对象(在我的例子中是“数据”)被Spring或Tomcat包装在xhr对象中,即使发生错误?是这样吗?实际上,正确的参数是
    jqXHR、textStatus、errorhorn
    。响应不会作为参数直接注入
    fail
    处理程序。我更新了答案以避免混淆。您可以查看以了解更多信息