gpt4 book ai didi

java - Jackson 的 readEntity 正在将我的异常序列化为 java.lang.Throwable 而不是正确的错误异常

转载 作者:行者123 更新时间:2023-12-02 12:40:07 26 4
gpt4 key购买 nike

在我的代码中,我有一个扩展 IllegalArgumentException 的异常:

public class InvalidDataSourceException extends IllegalArgumentException {
public InvalidDataSourceException(String message, Throwable cause) {
super(message, cause);
}
}

在我的 Jersey REST Web 服务中,所有错误都用类 RESTError 包装,以便所有其余服务都可以抛出相同的异常:

public class RESTError extends Throwable {
public RESTError(Throwable cause) {
super(cause);
}
}

因此,当 InvalidDataSourceException 发生时,它会作为 RESTError 的原因被抛出:

throw new RESTError(invalidDataSourceException);

我们已经为 Throwable 对象注册了一个序列化器:

public class ThrowableSerializer extends JsonSerializer<Throwable> {

@Override
public void serialize(Throwable value, JsonGenerator jgen,
SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeStringField("class", value.getClass().getCanonicalName());
jgen.writeStringField("message", value.getMessage());
jgen.writeObjectField("stackTrace", value.getStackTrace());
jgen.writeStringField("stackTraceAsString", Throwables.getStackTraceAsString(value));
jgen.writeObjectField("cause", value.getCause());
jgen.writeEndObject();

}
}

下面是一个单元测试,其中我尝试将 RESTError 写入字符串,然后重新序列化:

public class TestJsonSerializationOfExceptions {
private static final Logger log = LoggerFactory.getLogger(TestJsonSerializationOfExceptions.class);

@Test
public void testBasic() throws Exception {
ObjectMapper objectMapper = ObjectMapperFactory.create();
try {
throw new InvalidDataSourceException("test msg");
} catch (Throwable t) {
RESTError restError = new RESTError(Response.Status.INTERNAL_SERVER_ERROR, Errors.General, t);
String str = objectMapper.writeValueAsString(restError); // It is correct here!
log.info("Rest error when serialized: {}", str);
restError = objectMapper.readValue(str, RESTError.class);
Assert.assertEquals(restError.getCause().getClass(), InvalidDataSourceException.class);
}
}
}

当我这样做时,异常原因被序列化为java.lang.Throwable,而不是我的自定义InvalidDataSourceException。它贬低了它。因此单元测试失败。这是为什么?

最佳答案

看看Throwable javadoc。

当您扩展 Throwable 并将另一个 Throwable 传递给构造函数时,它会传递给 private Throwable cause属性(property)。这是关于类型的唯一信息。所以在反序列化时Java只知道有属性cause类型为Throwable并且没有任何信息是否是 InvalidDataSourceException或其他任何东西。

编辑:现在看起来像是缺少解串器问题

关于java - Jackson 的 readEntity 正在将我的异常序列化为 java.lang.Throwable 而不是正确的错误异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com