似乎可以使用相同的名称解组两个不同的 jaxb
个对象。
有一个Bar
类......
public abstract Bar {
private @XmlElement String val;
}
..有两个实现(构造函数等省略):
@XmlRootElement(name="bar")
public class BarA extends Bar { }
@XmlRootElement(name="bar")
public class BarB extends Bar {
private @XmlElement(required=true) String type;
}
最后,我想从XML解组一个Bar
文档列表,类似于以下内容
<bars>
<bar>
<val>1</val>
</bar>
<bar>
<val>1</val>
<type>2</type>
</bar>
</bars>
该列表包含在使用@XmlAnyElement
@XmlRootElement
public class Bars {
@XmlMixed
@XmlAnyElement(lax = true)
@XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)})
private List<Bar> bars;
}
但是我似乎只获取 BarA
或BarB
的实例,无论哪个 last 元素在@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());
}
我认为JAXB @XmlElements, different types but same name?中建议的XmlAdapter
不一定是唯一的方法。
答案 0 :(得分:2)
真的,我要做的第一件事是消除问题的源 - 有两个不同的JAXB类同名。对于您和那些必须维护代码的人来说,这样的情况必将引起令人头疼的问题。
如果那是不可能的......也许你可以编写另一个名为EveryBar的子类,并且总是解组它。 EveryBar将包含每个其他Bar子类的所有字段。然后,您将在对象树上执行一个后处理步骤,该步骤将检查EveryBar,并将其交换为适合的任何类型的实例。是的,这是一个丑陋的解决方案,但它只比链接中的那个稍差。
答案 1 :(得分:2)