2009-08-06 15 views
4

Exceptionのサブクラスをどのようにシリアル化しますか?ここでJAXBでExceptionサブクラスをどのようにシリアル化しますか?

私の例外です:

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

    } 
} 

私は@XmlTransientと@XmlAccessorTypeを使用してバリエーションのすべての種類を試してみましたが、JAXBは継続的に行うことができないgetStackTraceメソッド/ setStackTraceのペアを、直列化しようとします。

親のすべてのフィールドを無視するようにJAXBに指示するにはどうすればよいですか?

+0

私の答えを見る[ここ](http://stackoverflow.com/questions/11369582/how-to-marshall-java-lang-exception-using-jaxb-marshaller)。古いJAXBのバージョンは、新しいJavaランタイムでうまく動作しません。 – Pavel

答えて

3

私が情報でこれを解決:

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); 
:あなたは、次の設定(jaxbObjは、シリアル化するオブジェクトである場合)を使用してたJAXBContextを初期化する必要が http://forums.java.net/jive/thread.jspa?messageID=256122

+0

この解決策の1つの問題は、コンパイルして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

例外をラッパーではなく、例外をシリアル化したい。ラッパーを削除すると、マーシャル/アンマーシャルエラーをスローするものが残されます。 –

関連する問題