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

如何返回可被application/json格式接受的空Mono对象

错误根本原因

这个报错的核心原因是Spring的消息转换器在处理返回的Mono.empty()时,无法匹配当前响应上下文携带的Content-Type: text/html对应的类型转换器:

  • 如果是接口侧返回Mono.empty():你的接口声明的返回媒体类型和响应默认携带的text/html不匹配,空内容无法被text/html类型的转换器处理
  • 如果是WebClient调用远程接口时触发报错:远程返回500错误时的响应体是HTML格式的错误页,而你指定的响应解码类型(比如JSON对象)和text/html不匹配,无法完成解码

可行解决方案

  • 方案1:显式指定响应的媒体类型为你需要的格式(比如application/json),再返回Mono.empty()
    如果你是在全局异常处理或者接口逻辑里返回,代码示例:
    // @RestControllerAdvice 全局异常处理示例
    @ExceptionHandler(RuntimeException.class)
    public Mono<Void> handleInternalServerError(ServerWebExchange exchange) {
        // 手动设置响应Content-Type为你的接口需要的类型,避免使用默认的text/html
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        return Mono.empty();
    }
    
  • 方案2:WebClient调用场景下跳过5xx错误的响应体解析,直接返回空
    如果你是调用第三方接口遇到500时报错,可以在构造WebClient请求时提前处理5xx状态,避免后续解码:
    webClient.get()
        .uri("/target/api")
        .retrieve()
        // 遇到5xx错误直接返回空,不进行后续的响应体解码
        .onStatus(HttpStatus::is5xxServerError, resp -> Mono.empty())
        .bodyToMono(YourResponseDto.class)
        // 兜底捕获MediaType异常直接返回空
        .onErrorResume(UnsupportedMediaTypeException.class, e -> Mono.empty());
    
  • 方案3:返回204 No Content状态码(无响应体场景适用)
    如果你的业务逻辑允许无响应体时返回204状态码,该状态码本身允许没有响应内容,不会触发媒体类型检查:
    @ExceptionHandler(InternalServerErrorException.class)
    public Mono<Void> handle500(ServerWebExchange exchange) {
        exchange.getResponse().setStatusCode(HttpStatus.NO_CONTENT);
        return Mono.empty();
    }
    

内容的提问来源于stack exchange,提问作者Anshuman Solanki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:39:01