我试图让Jackson反序列化一个JSON编码的自定义异常,如果异常禁用了堆栈跟踪,它就会失败。
工作示例:
<table>
<tr>
<td>
<img src="http://lorempixel.com/output/animals-q-c-300-230-1.jpg">
</td>
</tr>
<tr>
<td class="static">static height</td>
<tr>
<td>
<img src="http://lorempixel.com/output/animals-q-c-300-230-1.jpg">
</td>
</tr>
<tr>
<td class="static">static height</td>
</tr>
</table>
不工作的例子:
public static class CustomException extends Exception {
public CustomException(String msg) {
super(msg);
}
}
@Test
public void testSerializeAndDeserializeCustomException() throws Exception {
log.info("Test: testSerializeAndDeserializeCustomException");
CustomException ex1 = new CustomException("boom");
ObjectMapper om = new ObjectMapper();
String json = om.writerFor(CustomException.class).writeValueAsString(ex1);
assertNotNull(json);
log.info("JSON: {}", json);
CustomException ex2 = om.readerFor(CustomException.class).readValue(json);
assertNotNull(ex2);
assertEquals(ex2.getMessage(), ex1.getMessage());
}
在第二种情况下,public static class CustomNoStackException extends Exception {
public CustomNoStackException(String msg) {
super(msg, null, true, false);
}
}
@Test
public void testSerializeAndDeserializeCustomNoStackException() throws Exception {
log.info("Test: testSerializeAndDeserializeCustomNoStackException");
CustomNoStackException ex1 = new CustomNoStackException("boom");
ObjectMapper om = new ObjectMapper();
String json = om.writerFor(CustomNoStackException.class).writeValueAsString(ex1);
assertNotNull(json);
log.info("JSON: {}", json);
CustomNoStackException ex2 = om.readerFor(CustomNoStackException.class).readValue(json);
assertNotNull(ex2);
assertEquals(ex2.getMessage(), ex1.getMessage());
}
实际上会将readValue(json)
包裹在CustomNoStackException
中。
我做错了什么?
答案 0 :(得分:1)
如果Exception
初始化时没有cause
,则会将自己标记为cause
。
private Throwable cause = this;
它使用它作为标记值来表示它没有原因。 initCause
只允许您更改cause
,如果它本身不是。
您的CustomNoStackException
构造函数正在使用cause
初始化null
,从而打破了哨兵值。当杰克逊后来由于
initCause
方法时
"cause":null
JSON中的对,initCause
会抛出异常,说明您无法覆盖异常cause
(这嵌套在JsonMappingException
中)。