如何使用JAXB将继承的类封送到XML?

如何使用JAXB将继承的类封送到XML?,jaxb,Jaxb,我得到了一个xsd,我使用JAXB编译成Java类 生成的类创建了一个名为“Event”的抽象类和几个扩展它的类。 e、 g.“衍生事件” 我使用以下命令将其封送到XML ObjectFactory objectFactory = new ObjectFactory(); DerivedEvent derivedEvent = objectFactory.createDerivedEvent(); JAXBContext context = JAXBContextImpl.newInstanc

我得到了一个xsd,我使用JAXB编译成Java类

生成的类创建了一个名为“Event”的抽象类和几个扩展它的类。
e、 g.“衍生事件” 我使用以下命令将其封送到XML

ObjectFactory objectFactory = new ObjectFactory();
DerivedEvent derivedEvent = objectFactory.createDerivedEvent();

JAXBContext context = JAXBContextImpl.newInstance("com.my.root.namespace");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

Class partialClass = Event.class;
QName partNamespace = new QName(Event.class.getSimpleName());
Object element = new JAXBElement(partNamespace, partialClass, derivedEvent);
// Create a stringWriter to hold the XML
StringWriter stringWriter = new StringWriter();
marshaller.marshal(element, stringWriter);
String xml = stringWriter.toString(); 
然后输出错误的根元素。i、 e

<Event xsi:type="DerivedEvent" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <DerivedStartPeriod xsi:nil="true"/>
    <DerivedEndPeriod xsi:nil="true"/>
</Event>

而不是

<DerivedEvent>
    <DerivedStartPeriod xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <DerivedEndPeriod xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</DerivedEvent>

如果我将partialClass和partNamespace设置为DerivedEvent,它将输出正确的信息。 但是,我不能真正做到这一点,因为这种编组是在一个流中进行的,在这个流中,事件可以是50个不同的派生事件之一

我不能像这里提到的那样将xsd更改为具有替换组,因为当我获得新版本的xsd时,这种更改可能会丢失

我需要使用分部类和命名空间,因为事件不是根元素。
我是否可以通过某种方式将事件添加为带有绑定的XmlRootElements?

或者有其他方法来解决这个问题吗?

通过生成的
ObjectFactory
创建JAXBElement,或者使用正确的QName。 这很糟糕:

QName partNamespace = new QName(Event.class.getSimpleName());
应该是这样的

QName partNamespace = new QName("your namespace", "DerivedEvent");
您应该在
ObjectFactory
中找到这样的qname,可能是常量。。。
ObjectFactory
可能包含方法
createDerivedEvent
,其中一个参数的类型为DerivedEvent。它返回可以封送到xml的JAXBElement。

我最终找到了这个帮助我添加XmlRootElement的页面:

通过使用这里的注释示例,我可以使用它(dependencies/build.xml等):