onFailure() 不会在 Vert.x 反应式 WebClient 中的 WebApplicationExcept



我正在使用以下代码运行Quarkus 2.7.0.CR1:

return httpRequest.sendBuffer(createBuffer())
.onSubscription()
.invoke(() -> metricsRecorder.start(METRICS_NAME))
.onFailure()
.recoverWithUni(failure -> fetchWithOtherCredentials())
...

如果 URL 中的端口根本没有响应,则onFailure()触发。但是当从 WireMock 返回 HTTP 500 时,此代码只会抛出状态为 500WebApplicationException而不触发onFailure()。这是触发onFailure()的异常:

io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:8085

AnnotatedConnectException似乎被检查异常,但在此示例中使用了IllegalArgumentException,这RuntimeExceptionWebApplicationException

我认为onFailure()应该在任何异常时触发。知道发生了什么吗?我已经用@QuarkusTest进行了测试,也通过在本地运行Quarkus进行了测试mvn compile quarkus:dev

HttpRequest.sendBuffer()返回一个Uni<HttpResponse<T>>。当服务器以状态500响应时,Web客户端不会发出故障,它会发出状态代码为500HttpResponse

您应该检查响应,如下所示:

Uni<HttpResponse> uni = httpRequest
.sendBuffer(createBuffer())
.onItem().transformToUni(res -> {
if (res.statusCode() == 200 && res.getHeader("content-type").equals("application/json")) {
// Do something with JSON body and return new Uni
} else {
// Generate failure as Uni
}
});

另一种选择是使用响应谓词:

Uni<HttpResponse> uni = httpRequest
.expect(ResponsePredicate.SC_SUCCESS)
.expect(ResponsePredicate.JSON)
.sendBuffer(createBuffer());

在这种情况下,仅当响应具有状态代码200和 JSON 正文时,返回的Uni<HttpResponse>才会成功,否则将失败。

相关内容

  • 没有找到相关文章

最新更新