Java 使用Jackson 2.x将Throwable的子类作为字符串写入时为空字段
当我运行以下代码时:Java 使用Jackson 2.x将Throwable的子类作为字符串写入时为空字段,java,jackson2,Java,Jackson2,当我运行以下代码时: public static void main(String[] args) throws JsonProcessingException { Throwable ex = new IllegalArgumentException("something is wrong"); ObjectMapper objectMapper = new ObjectMapper(); System.out.println(objectMapper.writeVal
public static void main(String[] args) throws JsonProcessingException {
Throwable ex = new IllegalArgumentException("something is wrong");
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(ex));
}
控制台的输出将显示Throwable类中“cause”字段中的值为null。这是因为循环引用-类字段用值“This”初始化
我知道这就是我想要的,但是Throwable不是我创建的类,所以我需要使用Mixin。不推荐使用该方法。在阅读了GitHub上的讨论之后,这是我添加mixin的最新尝试:
public static void main(String[] args) throws JsonProcessingException {
Throwable ex = new IllegalArgumentException("something" +
" wrong");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Throwable.class, MyMixn.class);
System.out.println(objectMapper.writeValueAsString(ex));
}
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator
.class, property = "cause")
public static abstract class MyMixn {
}
但是,这只会将另一个“原因”字段添加到值为1的输出中(除了前一个字段之外,该字段的值为null)
我只想让'cause'字段输出简单的类名,因此我知道原因异常。我记得在以前的项目中,由于Throwable的序列化,特别是'cause'字段,我遇到了严重的问题。也许这次您会找到一个很好的方法来做您想做的事情,但就我个人而言,如果我必须再次这样做,我会在序列化/jsonify之前在我自己的模型类中转换异常您会如何转换异常?“原因”字段需要能够引用一个异常,该异常具有另一个“原因”字段,该字段应引用一个异常,依此类推。我猜在某些情况下,您可以使用任意规则来约束您保留的内容。这在很大程度上取决于您的用例,如果您只需要传递有关异常的信息而不使用算法,或者如果您实际需要在序列化后处理异常,则情况会有所不同,在这种情况下,可能会更复杂,我记得在以前的项目中,由于Throwable的序列化,特别是'cause'字段,我遇到了严重的问题。也许这次您会找到一个很好的方法来做您想做的事情,但就我个人而言,如果我必须再次这样做,我会在序列化/jsonify之前在我自己的模型类中转换异常您会如何转换异常?“原因”字段需要能够引用一个异常,该异常具有另一个“原因”字段,该字段应引用一个异常,依此类推。我猜在某些情况下,您可以使用任意规则来约束您保留的内容。这在很大程度上取决于您的用例,如果您只需要传递有关异常的信息而不使用算法,或者如果您实际上需要在序列化之后处理异常,则情况会有所不同,在这种情况下,可能会更复杂