1

我试图了解 ExceptionMapper 的工作原理。

假设我定义了一个 REST 服务,它返回扩展 BaseResponse 的 XYZResponse。我还定义了一个 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 似乎从未收到过。那么 FailureResponse 有什么用呢?应该收到吗?结果是否意味着 ExceptionWrapper 设置不正确?

4

2 回答 2

0

如果您使用异常映射器捕获异常,您可能希望设置一个合适的 http 状态代码以指示出现问题。然后你可以实现你的客户端来检查http状态码并解析相应的响应。(基本上,您制定了一个“合同”,对于 http 状态代码 xxx,您将返回 ResponseX,对于 http 状态代码 yyy,您将返回 ResponseY)

于 2019-08-16T11:54:38.473 回答
0

我发现异常 (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>
于 2019-08-16T14:24:48.147 回答