JAXB解组过程中的实例化异常(抽象基类,带有@xmlsee和具体子类)

JAXB解组过程中的实例化异常(抽象基类,带有@xmlsee和具体子类),jaxb,abstract-class,Jaxb,Abstract Class,我遇到如下JAXB解组错误。 foo.bar.Base是一个抽象类,带有@XmlSeeAllow注释,其中列出了foo.bar.SubBase(它是foo.bar.Base的一个具体子类) 上述两个类都可以从主/入口类com.example.Request静态访问 JAXBContext是使用包字符串变量viz创建的: JAXBContext.newInstance("com.example",...); 上面创建的JAXBContext正确地列出了所有三个类:com.example.Requ

我遇到如下JAXB解组错误。 foo.bar.Base是一个抽象类,带有@XmlSeeAllow注释,其中列出了foo.bar.SubBase(它是foo.bar.Base的一个具体子类)

上述两个类都可以从主/入口类com.example.Request静态访问

JAXBContext是使用包字符串变量viz创建的:

JAXBContext.newInstance("com.example",...);
上面创建的JAXBContext正确地列出了所有三个类:
com.example.Request、foo.bar.Base和foo.bar.SubBase作为“此JAXBContext已知的类”

但在下面的解组调用期间,它在运行时失败。。我不知道这里出了什么问题

unmarshaller.unmarshal(<some-DOM-Element-Instance>, com.example.Request.class);
编辑@Blaise和@Ross

非常感谢布莱斯和罗斯的指点。我想我应该在这里包括正在研究的模式。 相关架构如下所示:

    <xs:complexType name="Request">
                    <xs:sequence>
                        <xs:element name="selectedBase" form="unqualified" nillable="true" type="xs:anyType" minOccurs="0"/>
                        <xs:element name="selectedSubBase" form="unqualified" nillable="true" type="ns1:SubBase" minOccurs="0"/>
                    </xs:sequence>
                </xs:complexType>


<xs:complexType name="Base">
                <xs:sequence>
                    <xs:element name="ID" form="unqualified" nillable="true" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="SubBase">
                <xs:complexContent>
                    <xs:extension base="ns1:Base">
                        <xs:sequence>
                            <xs:element name="subBaseElement" form="unqualified" nillable="true" type="xs:anyType" minOccurs="0"/>
                        </xs:sequence>
                    </xs:extension>
                </xs:complexContent>
            </xs:complexType>
因此,有效负载中出现的元素是
,而不是


那么在这里应用哪种策略呢?

注释被用作一种方便的机制,告诉您的JAXB impl也应该为引用的类创建元数据。虽然它最常用于指定子类,但它不是配置继承关系的机制

由于JAXB正试图实例化抽象超类(
foo.bar.Base
)的实例,因此XML消息似乎没有包含足够的信息来指定要解组的正确子类型

这可以通过
xsi:type
属性完成:

还可以使用替换组(
@xmlementref
),其中元素名称用于确定适当的子类型:

JAXB实现(如)还包含用于处理继承的扩展:

如果您想完全忽略继承关系,可以使用
@xmltransive
注释:


您需要在包含对Base的引用的字段上使用XmlElementRef,以告诉JAXB它应该查看子类。JAXB显然在尝试实例化您的基类(当然,它不能这样做)

试试看

@xmlseealway({ExchangeFormat.class})公共抽象类MapperJsonXml
@XmlRootElement(name=“ExchangeFormat”)公共类ExchangeFormat扩展了MapperJsonXml

它起作用了

小心点,添加cause@xmlementref
    <xs:complexType name="Request">
                    <xs:sequence>
                        <xs:element name="selectedBase" form="unqualified" nillable="true" type="xs:anyType" minOccurs="0"/>
                        <xs:element name="selectedSubBase" form="unqualified" nillable="true" type="ns1:SubBase" minOccurs="0"/>
                    </xs:sequence>
                </xs:complexType>


<xs:complexType name="Base">
                <xs:sequence>
                    <xs:element name="ID" form="unqualified" nillable="true" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="SubBase">
                <xs:complexContent>
                    <xs:extension base="ns1:Base">
                        <xs:sequence>
                            <xs:element name="subBaseElement" form="unqualified" nillable="true" type="xs:anyType" minOccurs="0"/>
                        </xs:sequence>
                    </xs:extension>
                </xs:complexContent>
            </xs:complexType>
<ns:Request>
         <selectedBase>123</selectedBase>
         <selectedSubBase>
            <ID>321</ID>
            <subBaseElement>123</subBaseElement>
         </selectedSubBase>
      </ns:Request>
@XmlSeeAlso({ExchangeFormat.class}) public abstract class MapperJsonXml <T>


@XmlRootElement(name="ExchangeFormat") public class ExchangeFormat extends MapperJsonXml<ExchangeFormat>