具有相同名称的Jaxb对象

时间:2012-01-20 15:09:58

标签: java xml rest jaxb

似乎可以使用相同的名称解组两个不同的 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;
}

但是我似乎获取 BarABarB的实例,无论哪个 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不一定是唯一的方法。

2 个答案:

答案 0 :(得分:2)

真的,我要做的第一件事是消除问题的 - 有两个不同的JAXB类同名。对于您和那些必须维护代码的人来说,这样的情况必将引起令人头疼的问题。

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

答案 1 :(得分:2)