2009-08-06 10 views
4

Как вы сериализуете подкласс Exception?Как вы сериализуете подкласс Exception в JAXB?

Вот мое исключение:

@XmlType 
public static class ValidationFault extends Exception { 
    public ValidationFault() { 

    } 
} 

Я пробовал все виды вариаций с использованием @XmlTransient и @XmlAccessorType, но JAXB постоянно пытается сериализовать/setStackTrace пару getStackTrace, которая не может быть сделано.

Как сообщить JAXB игнорировать все поля родителя?

+0

См. Мой ответ в [здесь] (http://stackoverflow.com/questions/11369582/how-to-marshall-java-lang-exception-using-jaxb-marshaller). Старые версии JAXB не очень хорошо сочетаются с более новыми версиями Java. – Pavel

ответ

3

Я решил эту проблему с информацией по адресу: http://forums.java.net/jive/thread.jspa?messageID=256122

Вам необходимо инициализировать JAXBContext с помощью следующей конфигурации (где jaxbObj является объектом для сериализации):

Map<String, Object> jaxbConfig = new HashMap<String, Object>(); 
// initialize our custom reader 
TransientAnnotationReader reader = new TransientAnnotationReader(); 
try { 
    reader.addTransientField(Throwable.class.getDeclaredField("stackTrace")); 
    reader.addTransientMethod(Throwable.class.getDeclaredMethod("getStackTrace")); 
} catch (SecurityException e) { 
    throw new RuntimeException(e); 
} catch (NoSuchMethodException e) { 
    throw new RuntimeException(e); 
} catch (NoSuchFieldException e) { 
    throw new RuntimeException(e); 
} 
jaxbConfig.put(JAXBRIContext.ANNOTATION_READER, reader); 

JAXBContext jc = JAXBContext.newInstance(new Class[] {jaxbObj.getClass()},jaxbConfig); 
+0

Одна проблема с этим решением заключается в том, что когда я компилирую и запускаю его внутри eclipse, он отлично работает. Но если я попытаюсь скомпилировать его с maven, тогда получаю сообщения об ошибках вроде: package com.sun.xml.internal.bind.v2.model.annotation не существует Я не уверен, что с этим делать, потому что пакет должен быть частью JDK. – HappyEngineer

2

Вы можете использовать XmlAdapter для обработки маршаллинга/развязывания себя. Что-то вроде этого:

@XmlRootElement 
public class JaxbWithException { 

    public ValidationFault fault = new ValidationFault("Foo"); 

    @XmlJavaTypeAdapter(value = ValidationFaultAdapter.class) 
    public static class ValidationFault extends Exception { 
    public ValidationFault(String msg) { 
     super(msg); 
    } 
    } 

    public static class ValidationFaultAdapter extends 
     XmlAdapter<String, ValidationFault> { 
    @Override 
    public String marshal(ValidationFault v) throws Exception { 
     return v == null ? null : v.getMessage(); 
    } 

    @Override 
    public ValidationFault unmarshal(String v) throws Exception { 
     return v == null ? null : new ValidationFault(v); 
    } 
    } 

    public static void main(String[] args) { 
    JAXB.marshal(new JaxbWithException(), System.out); 
    } 
} 
+1

Я хочу сериализовать исключение, а не обертку вокруг исключения. Удаление обертки оставляет вас чем-то, что вызывает ошибки маршалла/unmarshall. –