具有相同名称的Jaxb对象

Joh*_*erg 6 java xml rest jaxb

似乎可以解组具有相同名称的两个不同 jaxb对象.

有一Bar节课......

public abstract Bar {
   private @XmlElement String val;
}
Run Code Online (Sandbox Code Playgroud)

..有两个实现(构造函数等省略):

@XmlRootElement(name="bar")
public class BarA extends Bar { }

@XmlRootElement(name="bar")
public class BarB extends Bar {
     private @XmlElement(required=true) String type;
}
Run Code Online (Sandbox Code Playgroud)

最后,我想Bar从XML 解组一个文档列表,类似于以下内容

<bars>
  <bar>
    <val>1</val>
  </bar>
  <bar>
    <val>1</val>
    <type>2</type>
  </bar>
</bars>
Run Code Online (Sandbox Code Playgroud)

该列表包含在一个使用该类的类中 @XmlAnyElement

@XmlRootElement
public class Bars {

  @XmlMixed
  @XmlAnyElement(lax = true) 
  @XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)})
  private List<Bar> bars;
}
Run Code Online (Sandbox Code Playgroud)

但是我似乎得到的情况下无论是 BarABarB,取其最后的元素@XmlElementRefs链.

测试代码:

String xml = ...
JAXBContext jc = JAXBContext.newInstance(Bars.class);
ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
Bars bars = (Bars) jc.createUnmarshaller().unmarshal(in);
for (Bar bar : bars.getBars()) {
    System.out.println(bar.getClass());
}
Run Code Online (Sandbox Code Playgroud)

我不认为JAXB @XmlElements中XmlAdapter建议,不同类型但同名?必然会是唯一的方法.

Mik*_*zak 3

实际上,我要做的第一件事就是消除问题的根源- 有两个不同的 JAXB 类具有相同的名称。对于您和必须维护您的代码的人员来说,这样的情况肯定会引起头痛。

如果这是不可能的...也许您可以编写另一个名为 EveryBar 的子类,并始终对其进行解组。EveryBar 将包含所有其他 Bar 子类的所有字段。然后,您将在对象树上进行后处理步骤,该步骤将检查 EveryBar,并将其交换为任何合适类型的实例。是的,这是一个丑陋的解决方案,但它只比您链接中的解决方案稍差一点。