我试图从包含 LocalDate 字段的类中创建一个 JSon-String,但我总是收到此错误:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final int java.time.LocalDate.year accessible: module java.base does not "opens java.time" to unnamed module @197ac685
我已经搜索过这个,显然我应该注册一个自定义适配器,我做到了:
public class GsonLocalDateAdapter implements JsonSerializer<LocalDate>, JsonDeserializer<LocalDate> {
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public LocalDate deserialize(final JsonElement json, final Type typeOfT,
final JsonDeserializationContext context) throws JsonParseException {
return LocalDate.parse(json.getAsString(), formatter);
}
@Override
public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(src.format(formatter));
}
}
var gson = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, new GsonLocalDateAdapter())
.create();
var json = gson.toJson(myObject);
它甚至没有到达序列化方法中的断点。 我是不是错过了什么?
请参阅这篇关于堆栈溢出的文章以及相关讨论: java.lang.reflect.InaccessibleObjectException:无法将字段设为私有最终 java.util.Map sun.reflect.annotation.AnnotationInvocalHandler
在您的情况下,您可以通过添加以下内容来解决此问题:
JAVA_TOOL_OPTIONS=--add-opens=java.base/java.time=ALL-UNNAMED