Spring Boot WebSocket用MappingJackson2MessageConverter收不到订阅消息怎么解决
解决方案
问题本质
该问题是Spring WebSocket的服务端/客户端未正确配置JSON序列化/反序列化转换器,导致Room对象序列化后的消息无法被客户端正常解析,因此handleFrame回调不会触发。
第一步:服务端配置消息转换器
创建WebSocket配置类,显式注册MappingJackson2MessageConverter,确保服务端返回的Room对象可以正确序列化为JSON格式发送:
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageConverters(List<MessageConverter> converters) { // 优先注册Jackson JSON转换器处理自定义对象 MappingJackson2MessageConverter jacksonConverter = new MappingJackson2MessageConverter(); jacksonConverter.setSupportedMimeTypes(List.of(MediaType.APPLICATION_JSON)); converters.add(jacksonConverter); // 保留字符串转换器兼容原有纯文本消息场景 converters.add(new StringMessageConverter()); } // 保留你原有其他WebSocket配置即可,比如端点注册、消息代理配置 @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") // 替换为你实际的websocket连接端点 .allowedOriginPatterns("http://localhost:3000"); // 如果你用SockJS就保留下行,否则删除 // .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/app"); } }
同时需要确保Room实体类符合Jackson序列化要求:
- 提供public无参构造方法
- 所有需要序列化的字段提供对应的getter/setter方法,或者使用Lombok的
@Data注解统一生成
第二步:客户端配置消息转换器
你的Java Stomp客户端需要显式配置JSON转换器,才能正确将收到的JSON反序列化为Room对象:
// 初始化StompClient时添加Jackson转换器配置 WebSocketStompClient stompClient = new WebSocketStompClient(new StandardWebSocketClient()); MappingJackson2MessageConverter jacksonConverter = new MappingJackson2MessageConverter(); jacksonConverter.setSupportedMimeTypes(List.of(MediaType.APPLICATION_JSON)); stompClient.setMessageConverter(jacksonConverter); // 后续你的订阅、发送消息逻辑保持不变即可
问题排查小技巧
如果修改后依然无法收到消息,可以在服务端配置文件添加日志配置,观察消息发送情况:
# application.properties logging.level.org.springframework.messaging=DEBUG
从日志中可以确认:
- 消息是否正确发送到
/topic/rooms/created通道 - 消息的
content-type是否为application/json - 序列化后的JSON内容是否符合预期
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

