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

Spring Integration:Webflux InboundGateway未映射及SSE资源访问异常排查

排查WebFlux Inbound Gateway处理SSE流的404/406问题

看起来你在搭建SSE(Server-Sent Events)的WebFlux资源时遇到了路由和内容协商的问题,我来帮你梳理下可能的原因和解决思路:

1. 为什么不带Accept头会返回404?

这大概率是你的Webflux Inbound Gateway没有正确映射到/events路径,或者没有配置默认的媒体类型支持。当请求没有指定Accept头时,WebFlux会尝试匹配支持默认媒体类型的端点,如果你的网关没有配置默认产出类型,就可能找不到对应的处理逻辑,返回404。

解决办法:
确保网关的请求映射明确指向/events,并且设置produces属性指定默认支持的媒体类型:

@Bean
public WebfluxInboundGateway sseInboundGateway() {
    WebfluxInboundGateway gateway = new WebfluxInboundGateway("/events");
    gateway.setRequestChannel(sseProcessingChannel());
    // 明确指定产出的媒体类型为SSE格式
    gateway.setProduces(MediaType.TEXT_EVENT_STREAM_VALUE);
    return gateway;
}

2. 携带Accept头后返回406的原因?

406状态码表示服务器无法生成客户端请求的媒体类型,这里的问题通常出在内容协商不匹配或者下游响应没有正确设置SSE格式:

  • 你的网关虽然配置了路径,但没有明确告知WebFlux它可以产出text/event-stream类型的响应;
  • 下游的消息处理流程没有生成符合SSE规范的数据流,或者没有设置正确的Content-Type响应头。

解决办法:

  • 除了在网关设置produces属性外,还要确保下游处理逻辑返回的是SSE格式的数据流。比如在消息处理器中生成符合SSE格式的内容(每行以data:开头,结尾用空行分隔),并且设置响应头:
    @Bean
    public MessageHandler sseResponseHandler() {
        return message -> {
            // 生成SSE格式的响应内容
            String sseContent = "data: " + LocalDateTime.now().toString() + "\n\n";
            MessageHeaders headers = MessageHeaders.wrap(Map.of(
                HttpHeaders.CONTENT_TYPE, MediaType.TEXT_EVENT_STREAM_VALUE
            ));
            return MessageBuilder.createMessage(sseContent, headers);
        };
    }
    
  • 检查是否有全局的WebFlux配置覆盖了内容协商策略,比如自定义的WebFluxConfigurer修改了默认的媒体类型支持,导致网关的设置不生效。

3. 额外的排查小技巧

用curl的详细输出进一步定位问题:

# 查看不带Accept头时的路由匹配情况
curl -v http://localhost:8080/events
# 查看带Accept头时的内容协商细节
curl -H "Accept: text/event-stream" -v http://localhost:8080/events

重点关注响应头中的Allow、Content-Type字段,或者406响应中返回的Accept支持列表,这能帮你快速确认服务器当前支持的媒体类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:24:43