【发布时间】:2019-03-28 20:11:50
【问题描述】:
在序列化 Java 对象时,由于它利用反射,Jackson 会在其运行时表示中序列化对象。
我有以下课程:
@lombok.AllArgsConstructor
@lombokGetter
class ErrorInformation {
private final Exception exception;
}
和
final ErrorInformation errorInfo = new ErrorInformation(new IllegalArgumentException("foo"));
Jackson 不只是序列化 Exception,而是实际上序列化了 IllegalArgumentException 中的所有字段 - 会产生无法控制的后果,例如循环引用(参见 org.springframework.web.client.HttpServerErrorException 中的 mostSpecificCause)。
我怎样才能告诉 Jackson 实际上只序列化 Exception 的信息,而不考虑实际的运行时类型,就像 Java 这样的静态类型语言所期望的那样?
【问题讨论】:
-
这就是
Jackson的工作方式——找到所有getters并尝试序列化为JSON。这是默认行为。如果您不想看到此对象的所有额外详细信息,您需要指示Jackson隐藏什么以及可以序列化什么。您期望的结果是什么:只有异常消息? -
@MichałZiober 我知道杰克逊就是这样工作的。但这并不能证明它以这种方式工作是合理的。我想要的是完全序列化
Exception类的所有字段——因为这就是我作为程序员在这种情况下要处理的问题。如果我需要一个特定的类,我会改用泛型。 -
“一些疯子使用反射构建了整个库”对于像 Jackson 这样您可以免费使用的超级有用的库来说,这并不是什么好话。
-
@SebastiaanvandenBroek 你说得对,我的错。我编辑了我的问题。虽然我仍然认为这不是正确的方法。