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
相关产品推荐
相关产品推荐

