将 JSON 反序列化为异常对象

问题描述 投票:0回答:1

我正在使用 Jackson 从 JSON 中反序列化一个 Exception 对象。这是一个简化的演示(使用隐式 delegating creator):

throw new ObjectMapper().readValue("\"custom error message\"", Exception.class);

这有效,但不幸的是,堆栈跟踪包括导致异常实例化的 Jackson 帧:

Exception in thread "main" java.lang.Exception: custom error message
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call1(AnnotatedConstructor.java:133)
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:332)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromString(StdDeserializer.java:265)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1495)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:197)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
    at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4674)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3629)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3597)

有没有办法清理它,让它看起来像是在被抛出的同一行上创建的?

java exception jackson deserialization stack-trace
1个回答
0
投票

您可以使用

fillInStackTrace()
将堆栈跟踪重置为您抛出的点:

public class Main {
    public static void main(String[] args) throws Exception {
        Exception e = createException();
        e.fillInStackTrace();
        throw e;
    }

    private static Exception createException() {
        return new Exception("my message");
    }
}

出品:

Exception in thread "main" java.lang.Exception: my message
    at org.example.Main.main(Main.java:11)

不调用`fillInStackTrace() 输出是:

Exception in thread "main" java.lang.Exception: my message
    at org.example.Main.createException(Main.java:16)
    at org.example.Main.main(Main.java:10)
© www.soinside.com 2019 - 2024. All rights reserved.