2017-01-25 6 views
0

JSONエンコードされたカスタム例外を直列化解除しようとしていますが、例外によってスタックトレースが無効になると失敗します。jackson:カスタム例外を非直列化します

の作業例:

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()); 
} 

ない作業例:第2のケースで

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)は実際IOExceptionに包まれCustomNoStackExceptionをスローします。

私は間違っていますか?

答えて

1

Exceptioncauseなしで初期化すると、それ自体がcauseとマークされます。

private Throwable cause = this; 

これは、それが理由がないことを示すためにセンチネル値として使用されます。 initCauseは、causeがそれ自身でない場合にのみ変更することができます。

CustomNoStackExceptionコンストラクタはでcauseを初期化し、センチネル値を破棄しています。ジャクソンは後で理由JSONで

"cause":null 

ペアのinitCauseメソッドを呼び出そうとすると、initCauseあなたは上書きできませんと言って例外をスローした例外のcause(これはJsonMappingExceptionにネストされています)。

+0

ありがとうございます。それを修正する方法がありますか?おそらく 'getCause()'をオーバーライドし、 '@ JsonIgnore'に注釈をつけてください - うまくいくようですが、それは良い考えですか? – Hank

関連する問題