WebClient执行PATCH请求成功却报The mapper returned a null Mono异常
问题分析与解决
问题根源
异常栈明确指出The mapper returned a null Mono,这是因为你在onStatus中传入的handleErrorResponse方法在某些场景下返回了null。onStatus要求错误处理函数必须返回一个非null的Mono<? extends Throwable>用于发出错误信号,返回null会触发Reactor的空指针检查。
解决方案
1. 修复handleErrorResponse方法
确保该方法永远返回非null的Mono错误信号,绝对不能返回null。示例实现如下:
private Mono<? extends Throwable> handleErrorResponse(ClientResponse clientResponse) { // 解析错误响应体,构造更详细的异常 return clientResponse.bodyToMono(String.class) .defaultIfEmpty("No error body") .flatMap(errorBody -> Mono.error( new WebClientResponseException( clientResponse.statusCode().value(), clientResponse.statusCode().getReasonPhrase(), clientResponse.headers().asHttpHeaders(), errorBody.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8 ) )); // 如果不需要解析响应体,直接返回错误Mono即可 // return Mono.error(new RuntimeException("Request failed with status: " + clientResponse.statusCode())); }
2. 移除冗余代码
你的代码中filter(response -> !Objects.isNull(response))是多余的——因为前面已经调用了defaultIfEmpty("EMPTY PATCH RESPONSE"),响应不可能为null,可以直接移除这个操作符。
3. 完整修正后的代码
webClient.patch().uri("/documents/" + document.getIddocument()) .headers(h -> h.setBearerAuth(bearerToken)) .body(Mono.just(map), Map.class) .retrieve() .onStatus(httpStatus -> !httpStatus.is2xxSuccessful(), clientResponse -> handleErrorResponse(clientResponse)) .bodyToMono(String.class) .defaultIfEmpty("EMPTY PATCH RESPONSE") .subscribe(body -> logger.info("PATCH response: " + body));
关键说明
Reactor的操作符对null的容忍度极低,所有返回Mono/Flux的函数都必须确保返回非null实例,否则会触发类似的空指针异常。onStatus的错误处理函数尤其要注意这一点,它的职责是将错误响应转换为一个错误信号,必须返回有效的Mono。
内容的提问来源于stack exchange,提问作者icordoba
相关产品推荐
相关产品推荐

