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

SpringBoot 3.1.10中OffsetDateTime JSON序列化失败求助

解决方案:Spring Boot 3中Stomp序列化OffsetDateTime失败问题

核心原因

你遇到的问题是因为Stomp消息转换使用的MappingJackson2MessageConverter并没有自动复用你自定义的ObjectMapper Bean——即便你标记了@Primary,Spring Boot的WebSocket模块默认会创建独立的Jackson转换器实例,未加载JavaTimeModule。

步骤1:优化依赖(可选但推荐)

Spring Boot 3.1.10已内置Jackson版本管理,无需手动指定jackson-datatype-jsr310版本,避免版本冲突:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>

步骤2:配置WebSocket消息转换器

创建WebSocket配置类,显式将自定义ObjectMapper注入到MappingJackson2MessageConverter中,确保Stomp使用该转换器处理消息序列化:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    private final ObjectMapper objectMapper;

    // 注入自定义的ObjectMapper
    public WebSocketConfig(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public void configureMessageConverters(List<MessageConverter> converters) {
        WebSocketMessageBrokerConfigurer.super.configureMessageConverters(converters);
        // 创建Jackson消息转换器并绑定自定义ObjectMapper
        MappingJackson2MessageConverter jacksonConverter = new MappingJackson2MessageConverter();
        jacksonConverter.setObjectMapper(objectMapper);
        // 优先使用自定义转换器
        converters.add(0, jacksonConverter);
    }

    // 补充你的WebSocket端点、代理配置(如registerStompEndpoints、configureMessageBroker方法)
}

步骤3:强化ObjectMapper配置(可选)

在自定义ObjectMapper中添加序列化规则,确保OffsetDateTime以ISO-8601格式输出:

@Configuration
public class JacksonConfiguration {

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        return JsonMapper.builder()
                .addModule(new JavaTimeModule())
                // 禁用时间戳格式,输出标准ISO字符串
                .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                .build();
    }
}

额外排查点

  • 检查是否存在多个ObjectMapper Bean,确保自定义实例的@Primary注解生效且被正确注入
  • 验证stompService.sendMessage未使用独立创建的ObjectMapper实例
  • 手动测试自定义ObjectMapper的序列化能力,确认模块加载正常:
    String testJson = objectMapper.writeValueAsString(maintenanceReturn);
    System.out.println(testJson); // 若能正常输出则模块配置无误
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:35:11