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

ObjectMapper无法映射JSON字符串至ZonedDateTime,测试报错求助

解决MockMvc测试中Jackson解析ZonedDateTime的模块访问权限问题

问题场景

使用MockMvc编写集成测试时,执行以下代码将响应转换为AuthenticationResponse对象:

AuthenticationResponse authenticationResponse = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), AuthenticationResponse.class);

抛出权限错误:

Unable to make field private final java.time.ZoneOffset java.time.ZonedDateTime.offset accessible: module java.base does not "opens java.time" to unnamed module

应用正常运行时无此问题,仅测试阶段出现。

解决方案

1. 给测试JVM添加模块开放参数

该错误源于Java模块系统限制了反射访问java.time包的私有字段,需在测试JVM参数中开放权限:

  • Maven项目:修改pom.xml中的surefire插件配置
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>--add-opens java.base/java.time=ALL-UNNAMED</argLine>
            </configuration>
        </plugin>
    </plugins>
</build>
  • Gradle项目:修改build.gradle的test任务配置
test {
    jvmArgs '--add-opens', 'java.base/java.time=ALL-UNNAMED'
}

2. 正确配置Jackson的JavaTimeModule

确保Jackson注册了JavaTimeModule,避免直接反射访问私有字段。优先使用SpringBoot自动配置的ObjectMapper(已默认集成JavaTimeModule),而非手动创建:

// 注入Spring管理的ObjectMapper
@Autowired
private ObjectMapper objectMapper;

// 测试中使用该实例解析响应
AuthenticationResponse response = objectMapper.readValue(mvcResult.getResponse().getContentAsString(), AuthenticationResponse.class);

如果手动创建ObjectMapper,需显式注册模块:

ObjectMapper objectMapper = new ObjectMapper()
    .registerModule(new JavaTimeModule())
    .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

3. 优化实体类字段访问配置

确保AuthenticationResponse中ZonedDateTime字段有公共的getter/setter,或通过Jackson注解指定访问策略,避免Jackson依赖反射访问私有字段:

public class AuthenticationResponse {
    private ZonedDateTime expireTime;

    // 提供公共getter/setter
    public ZonedDateTime getExpireTime() {
        return expireTime;
    }

    public void setExpireTime(ZonedDateTime expireTime) {
        this.expireTime = expireTime;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:42:12