簡體   English   中英

Spring 3.2 DeferredResult - 如何設置錯誤響應的狀態代碼?

[英]Spring 3.2 DeferredResult - How to set status code for error response?

Spring Web 3.2附帶了一個用於異步請求處理的DeferredResult類。 它有一個setErrorResult用於在出現問題時提供備用響應,但沒有提供http錯誤代碼的選項。

當然必須能夠控制失敗請求的http響應代碼。如何使用新的Spring api做到這一點?

setErrorResult方法的doc說明如下:

為DeferredResult設置錯誤值並處理它。 該值可以是Exception或Throwable,在這種情況下,它將被處理,就像處理程序引發異常一樣。

我想通過設置Exception ,您可以觸發一個返回所需代碼的異常處理程序。

deferredResult.setErrorResult(new Exception());

這將始終將HTTP響應代碼設置為500.為了更好的控制,HttpServletResponse.setStatus似乎可以工作。

這將適用於user411180的客戶端

public DeferredResult<List<Point>> getMessages(@RequestParam int reqestedIndex, 
            final HttpServletResponse response) {

    final DeferredResult<List<Point>> deferredResult = new DeferredResult<>();
    deferredResult.onCompletion(...);
    deferredResult.onTimeout(new Runnable() {
        @Override
        public void run() {
            deferredResult.setErrorResult("Explanation goes here.");
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); //or SC_NO_CONTENT
        }
    });

    longPollRequests.put(deferredResult, reqestedIndex);
    return deferredResult;
}

您作為參數傳遞給setErrorResult的異常可以使用@ResponseStatus進行注釋。 例如,創建自己的異常類:

  @ResponseStatus(HttpStatus.NOT_FOUND)
  class NotFoundException extends RuntimeException {
     // add your own constructors to set the error message
     // and/or cause. See RuntimeException for valid ctors 
  }
然后在您的代碼中使用它與您創建的構造函數,例如:
  deferredResult.setErrorResult(new NotFoundException(reason, cause)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM