【问题标题】:Spring, Angular JS and exception handling in the service layer服务层中的 Spring、Angular JS 和异常处理
【发布时间】:2016-03-09 10:31:57
【问题描述】:

我们的开发团队正在构建一个使用 6.2.0、 3.2.14、 8 的应用程序,在前端我们使用。我们的 申请都是通过 提出的。

该应用程序完全构建为接收 对象作为我们申请的响应,因为我们通过 的申请都是通过Ajax 进行的。在一个特定的应用程序功能中,我们有一个使用window.location = url 的常规获取请求,因为我们需要返回一个流,它只不过是一个包含 PDF 文件内容的字节数组。

话虽如此,当我们在生成此 PDF 文件时遇到后端错误时,我们的应用程序会将用户重定向到一个空白屏幕,其中打印了一个 对象。

我已经在每个异常情况下全局处理 异常,使用带有ExceptionHandler 注释的异常处理或每个ControllerAdvice 来概括异常处理,但始终在控制器层中处理带有注释的类Controller 返回一个 ModelAndView 对象,但绝不会在服务层中使用 Service 注释的类。

我的问题是,当我们定期获取请求时,如何捕获异常并使应用程序将用户重定向到带有一些参数化消息的错误屏幕。

【问题讨论】:

    标签: jasper-reports spring-mvc java-ee-7 tomcat angularjs rest ajax json angularjs json spring-mvc java angularjs json ajax spring-mvc


    【解决方案1】:

    根据我的经验,即使它不完全是问题的答案,主要问题也不是服务器端而是客户端:

    停止使用window.location = url 在 RIA 应用程序中下载 Content-Disposition:attachment 文件。特别是当下载可能导致向客户端抛出错误时。真的。

    像 fileDownload (https://github.com/johnculviner/jquery.fileDownload) 这样的库允许在后台下载文件,避免附加错误时的所有混乱,以及 UI 冻结等待服务器响应。

    【讨论】:

    • 我已经在另一个应用程序中使用过它。我会再试试你的方法。
    【解决方案2】:

    假设你想根据 http 状态码在客户端处理异常,那么你可以制作一个拦截器,如下所示:

    var app = angular.module('appname',[]);
    
    app.factory('myHandler', function ($injector) {
        var interceptor = {
            response: function (response) {
                .
                .
                .
                return response;
            },
            responseError: function (response) {
    
                if (response.status == 401) {   
                    location.href = "#/error";   
                }
    
               else if(response.status == 403){...}
    
               else if().....
    
                return response;
            }
        };
        return interceptor;
    });
    

    并将其注入您的应用程序中:

        app.config(function ( $injector) {    
            $httpProvider.interceptors.push('myHandler');
            ...
         });
    

    现在每个请求都会先到这里,检查是否有错误状态或任何你想要的,然后如果没有错误(在这种情况下你不改变 location.href)它会继续,神奇地到它要去的地方,否则去指定基于routeProvider的templateURL。

    有用的链接injectorhttpProvider

    【讨论】:

    • 我会按照你的说法尝试这样做,但这是我第一次使用 Angular,所以如果这会占用我很多时间,我可能也会尝试其他答案方法,但感谢答案。
    • 你懂葡萄牙语吗?我在葡萄牙语堆栈溢出中得到了一个特别好的答案。
    猜你喜欢
    • 2015-06-06
    • 2022-10-13
    • 1970-01-01
    • 2022-06-19
    • 2020-01-07
    • 2018-03-16
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多