Java 17中OffsetDateTime反序列化失败问题求助
我在测试接口基础安全性时遇到Jackson序列化错误,测试代码如下:
测试代码
mvc.perform(MockMvcRequestBuilders.post(path) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(OBJECT)) .params(usersSampleRequestParams) .with(httpBasic(user, password))) .andExpect(status().isOk());
Controller代码
@PostMapping("/path") public void methodSignature(@RequestBody Car car) {}
错误信息
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type
java.time.OffsetDateTimenot supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: Car field ["DateOfProducing"])
已尝试的解决方案
- 添加
com.fasterxml.jackson.datatype:jackson-datatype-jsr310依赖 - 手动注册模块:
objectMapper.registerModule(new JavaTimeModule()); - 使用
findAndAddModules()构建ObjectMapper:.findAndAddModules() .build(); - 改用Gson并注册TypeAdapter:
builder.registerTypeAdapter(OffsetDateTime.class, new JSON.OffsetDateTimeTypeAdapter());
编写测试的服务使用Java 17,但Car实体来自另一个Java 8仓库,怀疑问题与Car仓库的依赖冲突有关。
针对性解决建议
对齐Jackson依赖版本
Java 17环境下的Jackson版本可能与Java 8仓库中的旧版Jackson存在冲突。检查项目依赖树,确保jackson-datatype-jsr310的版本与项目核心Jackson依赖(jackson-core、jackson-databind、jackson-annotations)完全一致。若Car仓库引入了旧版Jackson,需在测试项目的依赖管理中强制统一版本。配置全局ObjectMapper(Spring环境)
若为Spring Boot项目,不要手动实例化ObjectMapper,通过配置类统一配置,确保测试与应用上下文使用同一配置:@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); // 禁用时间戳序列化,统一为字符串格式 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return objectMapper; } }测试时直接注入Spring管理的ObjectMapper即可。
检查Car实体的日期字段注解
确认Car实体中DateOfProducing字段的Jackson注解(如@JsonFormat)是否适配Java 17环境,可显式指定格式避免解析异常:@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX") private OffsetDateTime DateOfProducing;测试中显式配置ObjectMapper
若无法修改全局配置,在测试代码中直接配置ObjectMapper确保模块注册生效:ObjectMapper objectMapper = new ObjectMapper() .registerModule(new JavaTimeModule()) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);使用该实例完成对象序列化。
排除Car仓库的冲突依赖
若Car仓库引入了冲突的Jackson或JSR310模块,在测试项目的依赖声明中排除这些依赖:
Maven示例:<dependency> <groupId>xxx</groupId> <artifactId>car-repo</artifactId> <version>xxx</version> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> <exclusion> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者John Smith

