You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:00:15