我在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
?
答案 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");
}
}]);