2010-06-24 2 views
7

Ich habe eine XmlJavaTypeAdapter für jede Ausnahme in meiner Ausnahme Hierarchie definiert. Ich benutze ein Wrapper-Objekt für so unter die Ausnahmen Marshalling: -@XmlJavaTypeAdapter mit Vererbung

@XmlRootElement 
public Wrapper<T extends BaseException> { 
    T exception; 
} 

Die Ausnahmen: -

@XmlJavaTypeAdapter(BaseExceptionAdapter.class) { 
public class BaseException extends RuntimeException { 
} 


@XmlJavaTypeAdapter(DerivedExceptionAdapter.class) { 
public class DerivedException extends BaseException { 
} 

Wenn ich ein Wrapper-Objekt Marshalling, JAXB standardmäßig immer ruft die BaseExceptionAdapter auch wenn die tatsächlichen Ausnahme ist vom Typ DerivedException. Wie kann ich es zwingen, nach dem Instanztyp der Ausnahme und nicht nach dem Referenztyp zu suchen?

Nur hinzufügen, package-info/jaxb.index usw. sind wie ausgenommen.

Antwort

0

Haben Sie alle Untertypen für Ausnahmen in paketinfo/jaxb.index/newInitialContext (...) aufgelistet?

JAX-B schaut sich den Instanztyp an, aber ich glaube, dass die Untertypen bei JAX-B registriert werden müssen. Die Annotation XMLJavaTypeAdapter wird nicht erkannt. Zur Laufzeit müssen Sie jede Subklasse explizit mit JaxB registrieren.

Dies kann auch mit der Annotation @XmlSeeAlso einer Klasse erreicht werden, die bei JAX-B registriert ist.

1

Sieht so aus, als ob Sie ein @ XmlElementRef auf Ihrem T-Feld brauchen, um JAXB zu sagen, dass es dynamisch nachsehen soll.