3 回答
TA贡献1795条经验 获得超7个赞
执行此操作的方法是按以下方式使用 onErrorMap:
Mono<Person> personMono = client.get()
.uri("/person/{id}", personId)
.retrieve()
.bodyToMono(Person.class)
.onErrorMap((Throwable error) -> error);
onErrorMap将使 Mono 在 Zip 阻塞时真正抛出错误,终止 zip 并让 spring 或任何其他您想要处理异常的类。
TA贡献1874条经验 获得超12个赞
你问的时候不是很清楚
“如何让 zip 方法抛出异常而不返回 null?”
在 WebFlux 中,您通常不会抛出异常,而是传播异常然后处理它们。为什么?因为我们正在处理数据流,如果抛出异常,流就会结束,客户端会断开连接,事件链也会停止。
我们仍然希望维护数据流并在数据流经时处理不良数据。
您可以使用该doOnError方法处理错误。
.onStatus(HttpStatus::is4xxClientError, clientResponse ->
Mono.error(new Data4xxException(String.format(
"Could not GET data with id: %s from another app, due to error:
%s", key, clientResponse))))
Mono.zip( .. ).doOnError( //Handle your error, log or whatever )
如果您想做更具体的事情,您必须用您希望如何处理错误来更新您的问题。
TA贡献1836条经验 获得超4个赞
每当收到状态码为 4xx 或 5xx 的响应时,WebClient 中的retrieve() 方法就会抛出 WebClientResponseException。
与retrieve()方法不同,exchange()方法在4xx或5xx响应的情况下不会抛出异常。您需要自己检查状态代码并按照您想要的方式处理它们。
Mono<Object> result = webClient.get().uri(URL).exchange().log().flatMap(entity -> {
HttpStatus statusCode = entity.statusCode();
if (statusCode.is4xxClientError() || statusCode.is5xxServerError())
{
return Mono.error(new Exception(statusCode.toString()));
}
return Mono.just(entity);
}).flatMap(clientResponse -> clientResponse.bodyToMono(JSONObject.class))
添加回答
举报