onFailure() 未在 Vert.x 反应式 WebClient 中触发 WebApplicationException

onFailure() not triggering on WebApplicationException in Vert.x reactive WebClient

我是 运行 Quarkus 2.7.0.CR1,代码如下:

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

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

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

AnnotatedConnectException 似乎是检查异常,但使用 in this example IllegalArgumentException 就像 WebApplicationException.

RuntimeException

我认为 onFailure() 应该触发任何异常。知道发生了什么事吗?我已经用 @QuarkusTest 和 运行 Quarkus 在本地用 mvn compile quarkus:dev.

进行了测试

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

HttpResponse

您应该像这样检查响应:

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
        }
    });

另一种选择是使用响应 predicates:

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

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