2013-09-27 8 views
3

Я пытаюсь выполнить сериализацию пользовательского исключения в Java с помощью метода writeValueAsString() из библиотеки Jackson. Я намерен отправить его по 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' в вашем пользовательском исключении. Я вижу только сеттеры. Можете ли вы попробовать включить геттеры? – Jackall

+0

Мне не нужны геттеры, но для этого случая я добавил их протестированными, и это не помогает. – lexx

ответ

4

Я сделал type и severity нестационарный, и он работает нормально. Я использовал следующий код, и я вижу в сериализованном выходе как type, так и severity.

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 ошибки здесь: не было геттеров, а участники были статическими – lexx