gpt4 book ai didi

java - 具有相同名称的 Jaxb 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:45 26 4
gpt4 key购买 nike

似乎可以解码具有相同名称 的两个不同 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的实例,以为准@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也必然是唯一的方法。

最佳答案

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

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

关于java - 具有相同名称的 Jaxb 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8943493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com