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(); } }
额外排查点
- 检查是否存在多个
ObjectMapperBean,确保自定义实例的@Primary注解生效且被正确注入 - 验证
stompService.sendMessage未使用独立创建的ObjectMapper实例 - 手动测试自定义
ObjectMapper的序列化能力,确认模块加载正常:String testJson = objectMapper.writeValueAsString(maintenanceReturn); System.out.println(testJson); // 若能正常输出则模块配置无误
内容的提问来源于stack exchange,提问作者Nigel Christiaans
相关产品推荐
相关产品推荐

