2013-09-27 63 views
3

我試圖使用Jackson庫中的writeValueAsString()方法序列化Java中的自定義異常。我打算通過HTTP發送到另一臺機器。這個工作有點偏激,因爲在序列化之後並不是所有的字段都包含在JSON中。頂級異常Throwable實現Serializable接口,並且還有一些構造函數添加有關要序列化的信息。我想事實是在這裏的某個地方。請幫助一些建議。這裏是我的自定義異常代碼:將自定義異常序列化爲JSON,並非所有字段都已序列化

import java.io.Serializable; 

public class MyException extends RuntimeException{ 

private static String type = null; 
private static String severity = null; 

// somewhere on google I red that should use setters to make serialize work 

public static void setType(String type) { 
    MyException.type = type; 
} 

public static void setSeverity(String severity) { 
    MyException.severity = severity; 
} 

public MyException(String message) { 
    super(message); 
} 
} 

某處代碼我使用:

MyException exc = new MyException("Here goes my exception."); 
MyException.setType(exc.getClass().getSimpleName());  
MyException.setSeverity("Major"); 
throw exc; 

,並在其他地方,我有:

ObjectMapper mapper = new ObjectMapper(); 
try { 
    responseBuilder.entity(mapper.writeValueAsString(MyException)); 
} 
catch (JsonGenerationException e) {e.printStackTrace(); } 
catch (JsonMappingException e) {e.printStackTrace(); } 
catch (IOException e) { e.printStackTrace(); } 

結果JSON對象是:

{"cause":null,"message":"Here goes my exception.","localizedMessage":"Here goes my exception.","stackTrace":[{...a usual stack trace...}]} 

這裏我也期待查看我的類型和嚴重性字段。

+0

我沒有在您的自定義異常中看到字段「type」和「severity」的getters - 我只能看到setter。你可以嘗試包括吸氣劑嗎? – Jackall

+0

我不需要獲得者,但是對於這種情況,我添加了他們測試過的並且沒有幫助。 – lexx

回答

4

我做typeseverity非靜態的,它似乎是工作的罰款。我使用了下面的代碼,並且我在序列化輸出中看到了typeseverity

public class MyException extends RuntimeException 
{ 
    private String type = null; 
    private String severity = null; 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getSeverity() { 
     return severity; 
    } 

    public void setSeverity(String severity) { 
     this.severity = severity; 
    } 

    public MyException(String message) { 
     super(message); 
    } 
} 

...和

MyException exc = new MyException("Here goes my exception."); 
exc.setType(exc.getClass().getSimpleName());  
exc.setSeverity("Major"); 

ObjectMapper mapper = new ObjectMapper(); 
System.out.println(mapper.writeValueAsString(exc)); 

希望這有助於!

+0

謝謝,它工作。你能解釋爲什麼它工作:)? – lexx

+2

類的靜態成員與類相關聯,而不是其任何實例;因此,它們不會被序列化。這個問題可以提供更多的上下文:http://stackoverflow.com/questions/1008023/how-to-serialize-static-data-members-of-a-java-class。 – Jackall

+1

這裏有2個錯誤:沒有getter和成員是靜態的 – lexx