Spring Boot& AngularJS /全局异常处理程序

时间:2015-06-10 21:10:21

标签: java angularjs spring rest exception-handling

我在AngularJS中非常新,并希望通过最佳实践在REST应用程序上实现全局异常处理程序。

Spring全局异常处理程序:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Throwable.class)
    public void defaultErrorHandler(HttpServletRequest req, Throwable exp) {
        // redirect and bind exception to error.html
    }
}

例如在Angular控制器上,我在抛出$http.get的Spring控制器上调用NPE请求。

如何将捕获的异常对象绑定到error.html

2 个答案:

答案 0 :(得分:0)

为了解决这个问题,我们必须添加一个服务/工厂来拦截http调用。您可以在配置

中这样做
$httpProvider.interceptors.push('httpRequestInterceptor'); 

现在,上述服务将是这样的

angular.module("app").factory('httpRequestInterceptor', function ($q) {

            return {
                'request': function (config) {

                    // Extract request information
                    return config || $q.when(config);
                },
                'responseError': function(rejection) {

                    // Extract response error information and handle errors
                    return $q.reject(rejection);
                 }
             }
        });

在回复错误信息块中,您可以重定向到error.html页面。

答案 1 :(得分:0)

以下方法对我有用。

myApp.factory('responseObserver',
  function responseObserver($q, $window, $rootScope) {
    return function (promise) {
        return promise.then(function (successResponse) {
            return successResponse;
        }, function (errorResponse) {

        switch (errorResponse.status) {
        //server error
        case 500:
            $rootScope.redirectToErrorPage();
            break;
        //If unauthorized
        case 401:
            $rootScope.logout();
            break;      
       }
       return $q.reject(errorResponse);
      });
    };
});

myApp.config(function($stateProvider, $httpProvider) {

    $httpProvider.responseInterceptors.push('responseObserver');

    $stateProvider
    .state('login', {
        url: '/login',
        templateUrl: 'templates/login.html', 
        controller: 'LoginController'
    })
    .state('error', {
        url: '/error',
        templateUrl: 'templates/error.html'
    })

});

myApp.run(['$rootScope', '$state', function ($rootScope, $state) {
    $rootScope.redirectToErrorPage = function()
    {
        $state.transitionTo("error");
    }
    $rootScope.logout = function()
    {
        $state.transitionTo("login");
    }

}]);