2009-08-06 3 views
4

Comment sérialiser une sous-classe d'Exception?Comment sérialiser une sous-classe Exception dans JAXB?

Voici mon exception:

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

    } 
} 

J'ai essayé toutes sortes de variations sur l'utilisation @XmlTransient et @XmlAccessorType, mais JAXB essaie continuellement de sérialisation la paire getStackTrace/de setStackTrace, qui ne peut être fait.

Comment puis-je dire à JAXB d'ignorer tous les champs du parent?

+0

Voir ma réponse dans [ici] (http://stackoverflow.com/questions/11369582/how-to-marshall-java-lang-exception-using-jaxb-marshaller). Les anciennes versions de JAXB ne sont pas compatibles avec les nouvelles versions de Java. – Pavel

Répondre

3

Je résolu cela avec les informations à: http://forums.java.net/jive/thread.jspa?messageID=256122

Vous devez initialiser votre JAXBContext avec la configuration suivante (où jaxbObj est l'objet de sérialisation):

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

Un problème avec cette solution est que lorsque je le compile et l'exécute dans eclipse, il fonctionne très bien. Mais si j'essaie de le compiler avec maven alors je reçois des messages d'erreur comme: package com.sun.xml.internal.bind.v2.model.annotation n'existe pas Je ne suis pas sûr de savoir quoi faire à ce sujet parce que le paquet est supposé faire partie du JDK. – HappyEngineer

2

Vous pouvez utiliser un XmlAdapter pour gérer le marshalling/unmarshalling vous-même. Quelque chose comme ceci:

@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

Je veux sérialiser une exception, pas un wrapper autour d'une exception. Enlever le wrapper vous laisse avec quelque chose qui jette des erreurs marshall/unmarshall. –

Questions connexes