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

前端之家收集整理的这篇文章主要介绍了java – 具有相同名称的Jaxb对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

有一个酒吧班……

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文档列表,类似于以下内容

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

@XmlRootElement
public class Bars {

  @XmlMixed
  @XmlAnyElement(lax = true) 
  @XmlElementRefs({@XmlElementRef(BarA.class),@XmlElementRef(BarB.class)})
  private List

但是我似乎只获取了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,并将其交换为适合的任何类型的实例.是的,这是一个丑陋的解决方案,但它只比你的链接稍微差一点.

原文链接:https://www.f2er.com/java/437993.html

猜你在找的Java相关文章