简体   繁体   English

AngularJS HTTP请求不会出现在错误中

[英]Angularjs http request doesn't go in errorCallback

I'm using angularjs to call my Rest web services but I have a problem with error handle. 我正在使用angularjs调用Rest Web服务,但是我遇到了错误句柄问题。 This is one of my http calls: 这是我的http调用之一:

$http({
    method: 'POST',
    url: "tr"+licenseSelected,//angular need string in url
    headers: {'Content-Type': 'application/json'},
    data : updatedLicense,
    beforeSend: function() {
        waitingModal.showPleaseWait();
    },
    complete: function() {
        setTimeout(function(){
            waitingModal.hidePleaseWait();
        }, 1000);
    }
}).then(function successCallback(response) {
    if (response.data.success==true){   
        licenseTable.ajax.reload();
        $('#updateLicenseModal').modal("hide");
        notifyMessage(response.data.result, 'success');
    } else {
        notifyMessage(response.data.result, 'error');
    }                       
}, function errorCallback(response) {
    window.location.href = "/ATS/500";
});

I would like to show 500 page if an error occurred during http request (for example server down or wrong url), but errorCallback is never called. 如果http请求期间发生错误(例如服务器关闭或错误的URL),我想显示500页,但是永远不会调用errorCallback。 Is there an error in my code? 我的代码中有错误吗? where is my fault?Thanks This is an example of response that I can't handle in error code: 谢谢,这是我无法使用错误代码处理的响应示例:

{
"status":422,
"exception":"org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
"message":"Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"tr71\"",
"stacktrace":"org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'; nested exception is java.lang.NumberFormatException: For input string: \"tr71\"
at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:115)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78)    
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:111)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:806)
    ......"
}

Web service example Web服务示例

@Override
    @RequestMapping(value = { "/license"}, method = RequestMethod.POST)
    public @ResponseBody Response createLicense(@RequestBody ClientLicenseForm clientLicenseForm) {
        try{
            administrationService.createLicense(clientLicenseForm);
            return new Response(true, true, "Your license has been created!", null);
        }catch(Exception e){
            ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e);
            LOG.error("Threw exception in AdministrationControllerImpl::createLicense :" + errorResponse.getStacktrace());
            return new Response(false,false,"Error! Your license hasn't been created!",errorResponse);
        }
    }

This may be the problem(it wrap json response inside another object), but how can I fix it? 这可能是问题所在(将json响应包装在另一个对象中),但是我该如何解决? 在此处输入图片说明

UPDATE I have fixed with this code, I'll test it 更新我已修复此代码,我将对其进行测试

}).then(function successCallback(response) {
            if (typeof response.data.success == 'undefined'){
                window.location.href = "/ATS/500";
            }else if (response.data.success==true){ 
                licenseTable.ajax.reload();
                $('#updateLicenseModal').modal("hide");
                notifyMessage(response.data.result, 'success');
            } else if(response.data.success==false) {
                notifyMessage(response.data.result, 'error');   
            }
        }, function errorCallback(response) {
            window.location.href = "/ATS/500";
        });

Redarding you comments you get a json response (i think with 200 header) The error callback will not fire while in the header response was 200 code. 注释一下您会得到一个json响应(我认为带有200头),而在头响应中为200代码时,将不会触发错误回调。

You can manage it in two ways: 您可以通过两种方式对其进行管理:

  1. Rewrite backend side to return proper status header code 重写后端以返回正确的状态头代码

  2. Check if response valid in successCallback 检查响应是否成功成功

     if (response.data.exception) { window.location.href = "/ATS/500"; } 

NOTE: but basically it's wrong that server return this type or error with stacktrace. 注意:但是从根本上说,服务器返回此类型或堆栈跟踪错误是错误的。

Exceptions handling examples 异常处理示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM