簡體   English   中英

Java:拋出異常並使用ExceptionMapper時,客戶端會收到什么REST響應?

[英]Java: What REST Response does the client recieve when an exception is thrown and an ExceptionMapper is used?

我試圖了解ExceptionMapper的工作方式。

假設我定義了一個REST服務,該服務返回XYZResponse擴展BaseResponse。 另外,我定義了一個ExceptionMapper,該異常返回擴展了BaseResponse的FailureResponse。

如果發生異常,客戶端將收到什么響應?

客戶端是否應該能夠始終獲得XYZResponse,因為這是在REST方法的簽名中定義的? 如果發生異常,客戶端會改為接收FailureResponse嗎? 因此,客戶端只能依靠始終接收BaseResponse嗎?

更新

我測試了:

@Test
public void figureOutResponse()
{
    BaseResponse response = null;
  try
  {
     response = occurrenceExportResourceUT
           .getStatus(UUID.randomUUID(),4);
  }catch (Exception e)
  {
     System.out.println("Response: " + response);
     System.out.println("Message: " + e.getMessage());
  }
}

結果:

Response: null
Message: HTTP 404 Not Found

因此,似乎從未收到FailureResponse。 那么,ResponseResponse有什么用? 應該收到嗎? 結果是否表示ExceptionWrapper設置不正確?

如果您使用異常映射器捕獲到異常,則可能需要設置合適的http狀態代碼以指示出現問題。 然后,您可以實施客戶端以檢查http狀態代碼並解析相應的響應。 (基本上,您與“ http”狀態代碼為xxx的“合同”將返回ResponseX,而對於HTTP狀態代碼為yyy的您將返回ResponseY)

我發現異常(javax.ws.rs.NotFoundException)具有方法.getResponse()。

@Test
public void goFigure()
{
  NotFoundException thrown = assertThrows(NotFoundException.class, () -> {
     occurrenceExportResourceUT.getStatus(UUID.randomUUID(), 4);
  }, "Expected getStatus to throw, but it didn't");

  ByteArrayInputStream arrayInputStream = (ByteArrayInputStream) thrown
        .getResponse().getEntity();
  Scanner scanner = new Scanner(arrayInputStream);
  scanner.useDelimiter("\\Z");
  String data = "";
  if (scanner.hasNext())
     data = scanner.next();
  System.out.println(data);
}

輸出包含FailureResponse:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><failureResponse><metaData><creationTime>0</creationTime></metaData><cause>Export job with id 1dd95fe6-46cc-4e02-b76e-2d1b621e7f82 not found</cause></failureResponse>

暫無
暫無

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

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