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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:27:00