【发布时间】:2022-01-25 11:30:48
【问题描述】:
简单解释一下,我有一个Task 对象,我想使用 GSON 库将其转换为 JSON 字符串。该对象本身具有 String 和 int 属性,我可以将其转换为 JSON 就好了,但是当我向类添加 CheckBox 属性时,会出现此错误消息
原因:java.lang.reflect.InaccessibleObjectException:无法使字段私有 javafx.beans.property.BooleanProperty javafx.scene.control.CheckBox.indeterminate 可访问:模块 javafx.controls 没有“打开 javafx. scene.control" 到模块 gson 在 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:349) 在 java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:289) 在 java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:174) 在 java.base/java.lang.reflect.Field.setAccessible(Field.java:168) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:157) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 在 gson@2.8.2/com.google.gson.Gson.getAdapter(Gson.java:423) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:115) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:164) 在 gson@2.8.2/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:100) 在 gson@2.8.2/com.google.gson.Gson.getAdapter(Gson.java:423) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:661) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:648) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:603) 在 gson@2.8.2/com.google.gson.Gson.toJson(Gson.java:583) 在 IAssessment/application.AddTaskController.addTask(AddTaskController.java:45)
我事先有类似的东西,我在这里询问过(错误消息以不导出到 gson 结尾),解决方案是创建一个看起来像这样的类模块信息
exports snippet;
exports application;
requires gson;
requires java.sql;
requires javafx.base;
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
opens application to gson, javafx.fxml;
这解决了我以前的问题,但这似乎是一个类似的问题,我不知道该怎么办。那么有没有办法解决呢?我感谢任何和所有的帮助。
【问题讨论】:
-
您为什么首先尝试将
CheckBox导出为 JSON?这似乎是一件奇怪的事情,您通常只将数据导出到 JSON,而不是整个 UI 元素。 -
复选框是布尔值的 UI 表示形式(选中或未选中)。所以你的数据模型应该包含一个字符串、日期和布尔值。数据模型中不应该有 UI 元素。
-
提示:将堆栈跟踪格式化为代码。这种方式更容易阅读。
-
永远不要在您的数据中存储节点..
-
简而言之:您应该使用
cellValueFactory指定每列应显示的数据(“值”)。 (在您的情况下为字符串、日期、布尔值。)您应该在必要时使用cellFactory来指定列应如何显示数据(第三列使用CheckBoxTableCell)。要让复选框表格单元格处理数据,您需要使用BooleanProperty来表示布尔值。因为 GSON only 使用字段,它会尝试序列化BooleanProperty而不是其底层布尔值。 (这是 GSON imo 的一个愚蠢的设计决定。)