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)
但是我似乎只得到的情况下无论是 BarA
或BarB
,取其最后的元素@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
建议,不同类型但同名?必然会是唯一的方法.
实际上,我要做的第一件事就是消除问题的根源- 有两个不同的 JAXB 类具有相同的名称。对于您和必须维护您的代码的人员来说,这样的情况肯定会引起头痛。
如果这是不可能的...也许您可以编写另一个名为 EveryBar 的子类,并始终对其进行解组。EveryBar 将包含所有其他 Bar 子类的所有字段。然后,您将在对象树上进行后处理步骤,该步骤将检查 EveryBar,并将其交换为任何合适类型的实例。是的,这是一个丑陋的解决方案,但它只比您链接中的解决方案稍差一点。
归档时间: |
|
查看次数: |
5191 次 |
最近记录: |