@XmlJavaTypeAdapter w / Inheritance

我在我的exceptionXmlJavaTypeAdapter为每个Exception定义了一个XmlJavaTypeAdapter 。 我使用包装器对象来编组例外如下: –

 @XmlRootElement public Wrapper { T exception; } 

例外: –

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

当我尝试编组包装器对象时,默认情况下JAXB总是调用BaseExceptionAdapter即使实际的exception是DerivedException类型。 如何强制它查找exception的实例类型而不是引用类型。

只是要添加, package-info / jaxb.index等也是例外。

看起来您需要在T字段上使用@XmlElementRef,以告诉JAXB动态查找。

您是否在package-info / jaxb.in​​dex / newInitialContext(…)中列出了所有exception子类型?

JAX-B将查看实例类型,但我认为子类型需要使用JAX-B注册。 它不会在运行时发现XMLJavaTypeAdapter注释,您必须使用JaxB显式注册每个子类。

这也可以通过使用JAX-B注册的类中的@XmlSeeAlso注释来完成。