如何返回可被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
相关产品推荐
相关产品推荐

