使用JAXB XmlAdapter在没有包装元素的情况下调整整个列表

时间:2013-05-20 03:32:34

标签: java xml jaxb unmarshalling xmladapter

我正在尝试使用XmlAdapterXML解组为自定义集合类型(故意不实现Collection接口,原因是由于另一次使用该类,如果该类包含任何集合,则不幸失败)。难点在于,放置在集合中的XML节点不会包装在包装元素中。

这是XML基本上的样子:

<xml>
  <foo></foo>
  <bar>1</bar>
  <bar>2</bar>
</xml>

我可以将JAXB解组为以下POJO

class Naive {
  Foo foo;
  List<Bar> bar;
}

但是,我想要做的是:

class Bars {
  // There will be a fixed number of these, known in advance
  Bar bar1;
  Bar bar2; 
}

class BarsAdapter extends XmlAdapter<ArrayList<Bar>, Bars> {
  ...
}

class Custom {
  Foo foo;
  @XmlJavaTypeAdapter(BarsAdapter.class)  // won't work
  Bars bar;
}

正如你所看到的,我编写了一个XmlAdapter想要调整整个列表,而不是单个元素,但它永远不会被调用用于解组。 (它会被调用以进行编组。)

如果我的XML包含<bar>元素周围的包装,那么我知道如何解决这个问题:

<xml>
  <foo></foo>
  <wrapper>
    <bar>1</bar>
    <bar>2</bar>
  </wrapper>
</xml>

因为我可以用bars注释@XmlElement(id="wrapper")字段,并且适配器将被正确调用。但是,XML架构来自RFC并且完全不可更改,因此我不知道如何继续。任何想法都赞赏!

0 个答案:

没有答案