我在使用Spring和angular的应用程序上遇到了一个我不理解的行为.http请求中存在异常.我在下面做了测试.
@RequestMapping(value = "/contract/upload/excel", method = RequestMethod.POST) public String uploadContractExcel(HttpServletRequest request, ModelMap model) { if(true) { throw new RuntimeException("my code is broken"); } ...
在$ http函数的JavaScript中,而不是进入错误块,它返回到状态代码为200的成功块 - 确定.所以我无法处理任何异常.
$http({ method : 'POST', url : resolveAjax, data : formData }).then( function successCallback(response) { var data = response.data; if (data.upload_error === "true") { $scope.busy = false; $scope.upload_error_message = data.upload_error_message; } else { $scope.contractSummary = angular .fromJson(data.reference_excel_resolved); $scope.busy = false; $scope.tabindex = $scope.tabindex * 1 + 1; } }, function errorCallback(response) { $scope.upload_error_message = 'Oups something went wrong'; });
有谁知道会发生什么?谢谢
如果您希望客户端收到错误的HTTP状态(如400等),则应在控制器中返回此类状态.抛出异常是不够的.你有几个选择; 不抛出异常或创建一个@ControllerAdvice
处理异常的人.
伪代码:
@RequestMapping(value = "/url", method = POST) public ResponseEntity postYourObject(@RequestBody YourObject object) { if (true) { return new ResponseEntity<>("Something happened", HttpStatus.BAD_REQUEST); } }
或者继续抛出异常并创建这样的控制器建议.
@ControllerAdvice public class GlobalControllerBehavior { @ExceptionHandler public ResponseEntity handleException(YourException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } }
最重要的是,如果您不返回像4xx或5xx这样的HTTP状态代码,那么您的JavaScript错误块将不会被激活.