如何在扩展瞬态时排除“xs:type”标签

问题描述 投票:0回答:1

期望的结果:

轻松切换

<root>
  <child>
    <prop1>..</prop1>
    <prop2>..</prop2>
  </child>
<root>

<root>
  <child>
    <prop1>..</prop1>
    <prop2>..</prop2>
    <prop3>..</prop3>
    <prop4>..</prop4>
  </child>
</root>

我的代码

根.java
@XmlRootElement(name= "root")
public class Root {
  @XmlElement(name="child")
  public Child child
}
扩展根.java
@XmlRootElement(name= "root")
public class ExtendedRoot extends Root {
  @XmlElement(name="child")
  public ExtendedChild child
}
Child.java
@XmlTransient
public class Child {
  // prop1, prop2
}
扩展子进程.java
@XmlType(propOrder = {"prop1", "prop3","prop4", "prop2"})
public class ExtendedChild extends Child {
  // prop3, prop4
}

主要

System.setProperty("javax.xml.bind.context.factory", "org.eclipse.persistence.jaxb.JAXBContextFactory")
Class clazz = extendChild ? ExtendedRoot.class : Root.class;
JAXBContext jc = JAXBContext.newInstance(clazz);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(formattedJob, tempFile);

实际效果

<root>
  <child xs:type="ExtendedChild">
    <prop1>..</prop1>
    <prop2>..</prop2>
    <prop3>..</prop3>
    <prop4>..</prop4>
  </child>
</root>

如何从

xs:type=...
标签中排除此
child

java jaxb eclipselink
1个回答
0
投票

此处使用

xs:type
是因为
child
属性的值是多态的。如果没有它,JAXB 就没有机会决定在读取您自己的 XML 文档时使用哪个类。 JAXB 并不是那么聪明,首先要内省元素,然后选择最合适的类。

但是阅读时还有一些其他的要点:

您是否知道,

ExtendedRoot
有两个名为
child
的属性(继承自
Root
的 super.child 和它自己的 this.child)?由于
ExtendedChild
Child
,因此
ExtendedChild
也可以存储到以下两个属性之一:

  1. 首先,您可能想知道子元素出现在对象中的位置。
  2. 因为您可以将
    ExtendedChild
    存储到
    Root.child
    ,所以不需要
    ExtendedRoot.child
    。如果没有这个,本例中甚至不需要
    ExtendedRoot

如果您坚持保留

ExtendedRoot
,请注意,如果 JAXB 遇到
Root
元素,它无法决定是使用
ExtendedRoot
还是使用
root

© www.soinside.com 2019 - 2024. All rights reserved.