@XmlJavaTypeAdapter w / Inheritance

时间:2010-06-24 06:02:45

标签: java jaxb

我在异常heirarchy中为每个Exception定义了XmlJavaTypeAdapter。我使用包装器对象来编组例外,如下所示: -

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

例外: -

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


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

当我尝试封送包装器对象时,默认情况下,即使实际异常类型为BaseExceptionAdapter,JAXB也会始终调用DerivedException。如何强制它查找异常的实例类型而不是引用类型。

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

2 个答案:

答案 0 :(得分:1)

看起来你的T字段需要@XmlElementRef,告诉JAXB动态查找。

答案 1 :(得分:0)

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

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

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