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

Java 17中OffsetDateTime反序列化失败问题求助

解决Java 17测试中Jackson序列化Java 8 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.OffsetDateTime not 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仓库的依赖冲突有关。


针对性解决建议

  1. 对齐Jackson依赖版本
    Java 17环境下的Jackson版本可能与Java 8仓库中的旧版Jackson存在冲突。检查项目依赖树,确保jackson-datatype-jsr310的版本与项目核心Jackson依赖(jackson-core、jackson-databind、jackson-annotations)完全一致。若Car仓库引入了旧版Jackson,需在测试项目的依赖管理中强制统一版本。

  2. 配置全局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即可。

  3. 检查Car实体的日期字段注解
    确认Car实体中DateOfProducing字段的Jackson注解(如@JsonFormat)是否适配Java 17环境,可显式指定格式避免解析异常:

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
    private OffsetDateTime DateOfProducing;
    
  4. 测试中显式配置ObjectMapper
    若无法修改全局配置,在测试代码中直接配置ObjectMapper确保模块注册生效:

    ObjectMapper objectMapper = new ObjectMapper()
            .registerModule(new JavaTimeModule())
            .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    

    使用该实例完成对象序列化。

  5. 排除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:10:31