
当在 Java 9+ 模块化环境中使用 Jackson 反序列化 JSON 时,若目标类位于未导出的包内,会因模块封装限制抛出 InaccessibleObjectException;根本解决方式是在 module-info.java 中显式导出对应包给 Jackson 模块。
当在 java 9+ 模块化环境中使用 jackson 反序列化 json 时,若目标类位于未导出的包内,会因模块封装限制抛出 `inaccessibleobjectexception`;根本解决方式是在 `module-info.java` 中显式导出对应包给 jackson 模块。
在基于 Java Platform Module System(JPMS)构建的 JavaFX 应用中,JVM 默认对模块间反射访问施加严格限制。即使 ResponseToken 类是 public 且具有无参构造器,若其所在包 com.democompany.app.api 未被声明为对 com.fasterxml.jackson.databind 模块开放,则 Jackson 在尝试通过反射调用其构造方法时将触发 java.lang.reflect.InaccessibleObjectException。
✅ 正确解决方案是在项目根模块描述文件 src/main/java/module-info.java 中添加显式导出语句:
module com.democompany.app {
// 其他 exports/opens/uses/requires 等声明...
// 关键:允许 jackson.databind 反射访问该包下的 public 类型
exports com.democompany.app.api to com.fasterxml.jackson.databind;
}⚠️ 注意事项:
-
exports ... to仅开放 public 类型的 public 成员;若需反序列化包含 private 字段或需访问非 public 构造器/方法(如带参构造、setter),应改用opens(推荐):opens com.democompany.app.api to com.fasterxml.jackson.databind;
opens同时允许反射访问 public/private 成员,更契合 Jackson 的典型使用场景。立即学习“Java免费学习笔记(深入)”;
- 确保
com.fasterxml.jackson.databind是你实际依赖的 Jackson 模块名(Maven 坐标com.fasterxml.jackson.core:jackson-databind),而非jackson-core或jackson-annotations。 - 若使用 Maven,还需确认
jackson-databind已正确声明为requires:requires com.fasterxml.jackson.databind;
? 补充建议:
对于仅用于 JSON 绑定的数据传输类(DTO),推荐将其置于独立、明确导出/开放的模块中,并避免与 UI 层(如 JavaFX 控制器)混用同一包。此举既提升模块边界清晰度,也便于精细化控制反射访问权限。
完成上述配置后,重新编译并运行应用,ObjectMapper.readValue(...) 即可正常完成 ResponseToken 的实例化与属性填充,不再触发 InaccessibleObjectException。


















