2015-12-09 66 views
3

我得到了一個行爲,我不明白在使用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'; 
}); 

有沒有人知道會發生什麼? 謝謝

回答

5

如果你想讓你的客戶端收到一個像400等不好的HTTP狀態,你應該在你的控制器中返回這樣的狀態。拋出一個異常是不夠的。 你有幾個選擇;不要拋出異常或創建一個處理異常的@ControllerAdvice

僞代碼:

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

或者保持拋出你的異常和創建這樣一個控制器的建議。底線,如果您不返回HTTP狀態代碼(如4xx或5xx),您的JavaScript錯誤代碼塊將不會執行。

+0

好的非常感謝您的解釋。我認爲一個異常會在控制器中默認返回一個不同於200的代碼。我會測試一下。 –

+0

不客氣,嘗試一下,讓我知道。 –

0

我知道它是漫長的,但即使在服務器端的一個例外,它最終響應的一種形式,客戶端接收,因此,HTTP狀態200

相關問題