
当使用 Java 9+ 模块化(JPMS)构建 JavaFX 应用时,若 Jackson 在反序列化 JSON 时抛出 InaccessibleObjectException,根本原因是目标类所在模块未向 com.fasterxml.jackson.databind 显式导出对应包。解决方式是在 module-info.java 中添加 exports 声明。
当使用 java 9+ 模块化(jpms)构建 javafx 应用时,若 jackson 在反序列化 json 时抛出 `inaccessibleobjectexception`,根本原因是目标类所在模块未向 `com.fasterxml.jackson.databind` 显式导出对应包。解决方式是在 `module-info.java` 中添加 `exports` 壁声明。
在 Java 9 引入模块系统(JPMS)后,模块默认封装所有包,即使类是 public,其包也必须显式导出(exports),其他模块才能通过反射(如 Jackson 的字段/构造器访问)进行深度操作。你遇到的异常:
java.lang.reflect.InaccessibleObjectException: Unable to make public com.democompany.app.api.ResponseToken() accessible: module com.democompany.app does not "exports com.democompany.app.api" to module com.fasterxml.jackson.databind
明确指出:com.democompany.app 模块未将 com.democompany.app.api 包导出给 Jackson 的核心数据绑定模块。
✅ 正确修复方式是在项目的 src/main/java/module-info.java 中,为该包添加定向导出:
module com.democompany.app {
// 其他 requires / opens 语句...
// ✅ 关键修复:允许 Jackson 反射访问该包下的 public 类型
exports com.democompany.app.api to com.fasterxml.jackson.databind;
// 若 ResponseToken 含非 public 字段且需反序列化,还需 opens(推荐)
opens com.democompany.app.api to com.fasterxml.jackson.databind;
}
⚠️ 注意事项:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
exports仅允许访问 public 类型及其 public 成员;若ResponseToken使用了private字段或@JsonCreator构造器,必须配合opens(或open模块)启用深层反射; -
to com.fasterxml.jackson.databind是定向导出,比无条件exports com.democompany.app.api;更安全,避免意外暴露给其他模块; - 确保
com.fasterxml.jackson.databind模块名与实际 JAR 的Automatic-Module-Name一致(Jackson 2.12+ 默认为com.fasterxml.jackson.databind); - 若使用 Maven,确认
jackson-databind依赖版本 ≥ 2.12(对 JPMS 支持更完善)。
? 补充建议:对于 JavaFX + Jackson 的典型场景,推荐统一使用 opens(而非仅 exports),因为 JSON 反序列化常需访问私有字段或带参构造器:
opens com.democompany.app.api to com.fasterxml.jackson.databind;
这会自动导出并开放反射访问权限,兼顾安全性与兼容性。完成修改后重新编译运行,ObjectMapper.readValue() 即可正常工作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










