用于Java 11的下列代码:
new Gson().toJson(new Exception())在JDK 17上,我得到以下错误:
Unable to make field private java.lang.String java.lang.Throwable.detailMessage accessible: module java.base does not "opens java.lang" to unnamed module @147ed70f通过阅读此页,我想我可以用--add-opens java.base/java.lang=ALL-UNNAMED来解决它。但是,有更好的方法吗?也许是用定制的反/序列化器?
发布于 2022-01-11 23:55:22
下面是我为反序列化异常添加的代码。这可以在这样的类中使用:
public class Result {
public final Object result;
public final Error error;
public Result(Object result) { ... }
public Result(Exception e) {
this.result = null;
this.error = new Error(e);
}
}另一方面,打电话给result.error.toThrowable()。
public static class Error {
public final String message;
public final List<STE> stackTrace;
public final Error cause;
public Error(Throwable e) {
message = e.getMessage();
stackTrace = Arrays.stream(e.getStackTrace()).map(STE::new).collect(Collectors.toList());
cause = e.getCause() != null ? new Error(e.getCause()) : null;
}
public Throwable toThrowable() {
Throwable t = new Throwable(message);
t.setStackTrace(stackTrace.stream().map(STE::toStackTraceElement).toArray(StackTraceElement[]::new));
if (cause != null) {
t.initCause(cause.toThrowable());
}
return t;
}
private static class STE {
public final String declaringClass;
public final String methodName;
public final String fileName;
public final int lineNumber;
public STE(StackTraceElement ste) {
this.declaringClass = ste.getClassName();
this.methodName = ste.getMethodName();
this.fileName = ste.getFileName();
this.lineNumber = ste.getLineNumber();
}
public StackTraceElement toStackTraceElement() {
return new StackTraceElement(declaringClass, methodName, fileName, lineNumber);
}
}
}发布于 2022-02-07 04:23:12
我昨天有这个。我使用了Java 17,我回到了Java 11,它运行得很好。
我想是因为这个:https://bugs.openjdk.java.net/browse/JDK-8256358
我很懒,并且使用GSON默认的反射类型适配器。
您必须实现自己的TypeAdapter来修复它。或者使用另一个JSON反序列化器,比如Jackson,我稍后可能会这样做。
https://stackoverflow.com/questions/70376339
复制相似问题