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

Spring Webflux:如何在WebFilter中写入400错误的响应体?

解决Spring WebFlux WebFilter返回400时响应体为空的问题

你的代码核心问题是未设置响应的Content-Type头,导致客户端无法正确识别并解析响应体,同时需要注意WebFlux中缓冲区资源的释放。以下是修正后的实现:

修正后的代码

@Order(1)
@Component
public class CheckingFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        String errorMessage = doSomeChecks();
        if (errorMessage == null) {
            return chain.filter(exchange);
        } else {
            ServerHttpResponse response = exchange.getResponse();
            // 设置400状态码
            response.setStatusCode(HttpStatus.BAD_REQUEST);
            
            // 配置响应头:指定内容类型和编码,确保客户端能正确解析响应体
            response.getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
            // 如果返回纯文本,可替换为 MediaType.TEXT_PLAIN_UTF8
            
            // 包装错误信息到缓冲区
            DataBuffer responseBuffer = response.bufferFactory()
                    .wrap(errorMessage.getBytes(StandardCharsets.UTF_8));
            
            // 写入响应并确保缓冲区资源释放,避免内存泄漏
            return response.writeWith(Mono.just(responseBuffer))
                    .doOnError(e -> DataBufferUtils.release(responseBuffer));
        }
    }

    // 示例校验逻辑,替换为你的实际校验代码
    private String doSomeChecks() {
        return "{\"code\":400,\"message\":\"请求参数不合法\"}";
    }
}

关键说明

  • 设置Content-Type头:这是解决响应体为空表象的核心——客户端需要知道响应内容的类型才能正确解析,否则即使数据已发送,也可能被忽略或显示为空。
  • 缓冲区资源释放:WebFlux的DataBuffer属于池化资源,必须确保在出错时释放,避免内存泄漏,通过doOnError钩子可以实现这一点。
  • 规范错误格式:如果是接口场景,建议返回JSON格式的错误信息(如示例中的结构),更符合REST接口的规范。

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

相关产品推荐
方舟 Agent Plan

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

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