Support of serdes for Throwable/Exception no longer works since Java 17
- Dominant language
- Java
- Stars
- 24.2k
- Forks
- 4.5k
- Avg merge
- 6d 4h
- Merged PRs (30d)
- 12
Description
# Gson version
2.10.1
# Java / Android version
17.0.6 Amazon Corretto
# Used tools
- [ ] Maven; version:
- [ ] Gradle; version:
- [ ] ProGuard (attach the configuration file please); version:
- [ ] ...
# Description
```
public static void main(String[] args) {
System.out.println("11111111111111111111111111111111111111111 " + new Gson().toJson(new ExBean()));
}
static class ExBean {
Throwable throwable = new Exception("xxxxxxxxxxxxxxxxx");
}
```
## Expected behavior
Gson should serialize the ExBean instance with the Throwable field, with stack trace details and related info on the Exception.
## Actual behavior
Gson.toJson errors out with exception. See stack trace below.
# Reproduction steps
1. paste this in a class
```
public static void main(String[] args) {
System.out.println("11111111111111111111111111111111111111111 " + new Gson().toJson(new ExBean()));
}
static class ExBean {
Throwable throwable = new Exception("xxxxxxxxxxxxxxxxx");
}
```
2. Run the main method
# Exception stack trace
```
Exception in thread "main" com.google.gson.JsonIOException: Failed making field 'java.lang.Throwable#detailMessage' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:38)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:286)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
at com.google.gson.Gson.getAdapter(Gson.java:556)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130)
at com.google.gson.Gson.getAdapter(Gson.java:556)
at com.google.gson.Gson.toJson(Gson.java:834)
at com.google.gson.Gson.toJson(Gson.java:812)
at com.google.gson.Gson.toJson(Gson.java:759)
at com.google.gson.Gson.toJson(Gson.java:736)
at elf4j.engine.writer.pattern.JsonPatternSegment.main(JsonPatternSegment.java:129)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private java.lang.String java.lang.Throwable.detailMessage accessible: module java.base does not "opens java.lang" to unnamed module @136432db
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:35)
... 12 more
```
Contributor guide
Assessment
This issue has not been assessed yet.