2010-06-24 6 views
7

J'ai un XmlJavaTypeAdapter défini pour chaque exception dans ma hiérarchie d'exception. J'utilise un objet wrapper pour marshaling les exceptions ci-dessous: -@XmlJavaTypeAdapter w/Inheritance

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

Les exceptions: -

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


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

Lorsque je tente marshaling un objet wrapper, JAXB par défaut appelle toujours le BaseExceptionAdapter même si le réel l'exception est de type DerivedException. Comment puis-je le forcer à rechercher le type d'instance de l'exception plutôt que le type de référence.

Juste pour ajouter, package-info/jaxb.index etc sont comme excepté.

Répondre

0

Avez-vous tous les sous-types d'exception répertoriés dans package-info/jaxb.index/newInitialContext (...)? JAX-B examinera le type d'instance, mais je crois que les sous-types doivent être enregistrés avec JAX-B. Il ne découvrira pas l'annotation XMLJavaTypeAdapter au moment de l'exécution, vous devez enregistrer explicitement chaque sous-classe avec JaxB. Cela peut également être accompli avec l'annotation @XmlSeeAlso d'une classe enregistrée avec JAX-B.

1

On dirait que vous avez besoin d'un @XmlElementRef sur votre champ T, pour dire à JAXB de le rechercher dynamiquement.