java - Angular $http - spring - 抛出异常但http状态为200

标签 java angularjs spring

我在使用 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");
}
...

在 JavaScript 中,$http 函数不是进入错误 block ,而是返回状态代码为 200 的成功 block - OK。所以我无法处理任何异常。

$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 等,您应该在您的 Controller 中返回此类状态。抛出异常是不够的。 你有几个选择;不要抛出异常或创建一个为您处理异常的@ControllerAdvice

伪代码:

@RequestMapping(value = "/url", method = POST)
public ResponseEntity postYourObject(@RequestBody YourObject object) {
    if (true) {
        return new ResponseEntity<>("Something happened", HttpStatus.BAD_REQUEST);
    }
}

或者继续抛出异常并像这样创建一个 Controller 建议。

@ControllerAdvice
public class GlobalControllerBehavior {

    @ExceptionHandler
    public ResponseEntity handleException(YourException e) {
        return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

最重要的是,如果您不返回 4xx 或 5xx 之类的 HTTP 状态代码,您的 JavaScript 错误 block 将不会被执行。

关于java - Angular $http - spring - 抛出异常但http状态为200,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175137/

相关文章:

java - 在 Quartz 中使用批处理模式

java - Facebook SDK 4.0.0,Android 上的 ShareDialog 始终为 null

java - 记录 HttpRequest 参数和请求正文

java - 无法在maven项目的a/resources文件中使用FileOutputStream写入

java - 格式化 XSD 以以特定方式生成字符串数组

javascript - Angular : Detect form changes

javascript - 学习 JavaScript 时的有趣结果。但我不知道为什么

angularjs - AngularJS 中的动态下拉选择不起作用

java - DispatcherServlet - Roo 项目中的上下文初始化失败

java - 在 Java 中转换为时间戳