【问题标题】:Jaxb objects with same name同名的 Jaxb 对象
【发布时间】:2012-01-20 15:09:58
【问题描述】:

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

但我似乎获得了 either BarABarB 的实例,以 @987654333 中的 last 元素为准@ 链。

测试代码:

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 也不一定是唯一的方法。

【问题讨论】:

    标签: java xml rest jaxb


    【解决方案1】:

    真的,我要做的第一件事就是消除问题的来源 - 有两个不同的 JAXB 类同名。这样的情况肯定会让您和必须维护您的代码的人感到头疼。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-13
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多