jackson:反序列化自定义异常

时间:2017-01-25 17:03:28

标签: java exception jackson

我试图让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中。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果Exception初始化时没有cause,则会将自己标记为cause

private Throwable cause = this;

它使用它作为标记值来表示它没有原因。 initCause只允许您更改cause,如果它本身不是。

您的CustomNoStackException构造函数正在使用cause初始化null,从而打破了哨兵值。当杰克逊后来由于

而试图调用initCause方法时
"cause":null
JSON中的

对,initCause会抛出异常,说明您无法覆盖异常cause(这嵌套在JsonMappingException中)。