JAXB解组过程中的实例化异常(抽象基类,带有@xmlsee和具体子类)
我遇到如下JAXB解组错误。 foo.bar.Base是一个抽象类,带有@XmlSeeAllow注释,其中列出了foo.bar.SubBase(它是foo.bar.Base的一个具体子类) 上述两个类都可以从主/入口类com.example.Request静态访问 JAXBContext是使用包字符串变量viz创建的: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
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
),其中元素名称用于确定适当的子类型:
@xmltransive
注释:
@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>