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>
才成功,否则失败。
我是 运行 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>
才成功,否则失败。