我正在尝试创建一个具有java.lang.Exception存储为字段的类。另外,我尝试使用@JsonIgnoreProperties注释从序列化/反序列化中排除堆栈跟踪。
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
class ExWrapper {
@JsonIgnoreProperties({"stackTrace"})
public Exception ex;
@Override
public String toString() {
return "ExWrapper{" +
"ex=" + ex +
'}';
}
}
public class Example {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
ExWrapper exw = new ExWrapper();
exw.ex = new Exception("Oops");
String str = mapper.writeValueAsString(exw);
System.out.println(str);
ExWrapper exW = mapper.readValue(str, ExWrapper.class);
System.out.println(exW);
}
}
好吧,类中只有getMessage
和没有,所以这似乎有点合理,除非您尝试删除注释。它的工作原理就像一个魅力:它可以正确地序列化和反序列化回来,并且缺少 setter for突然就不再是问题了。添加到忽略的字段也可以使其工作(但没有异常消息)。setMessage
Throwable
@JsonIgnoreProperties
message
"message"
我尝试使用调试器随机步入 Jackson 代码,发现当@JsonIgnoreProperties
缺少时,最终ThrowableDeserializer
会调用方法,而当注释存在时不会调用它们。ThrowableDeserializer
似乎有一些特定于异常消息的技巧。我的猜测是,ThrowableDeserializer
当堆栈跟踪丢失并且 Jackson 回退到默认的 java bean 序列化器时,这是不可行的。
问题是这里到底发生了什么以及如何解决它。
阿波罗的战车
相关分类