如果流包含集合,则解组?

时间:2016-02-10 12:18:50

标签: java jaxb

目前我有两节课。 procedure proc1; begin // statements that can be executed in a few milliseconds or much slower end; procedure mainproc; begin // statements part1 proc1; // statements part2 end; Customer,每个CustomerItem可以包含多个Customer

CustomerItems

通过REST,我们可以得到一个@XmlRootElement(name = "Customer") @XmlAccessorType(XmlAccessType.FIELD) public class Customer implements Serializable { private final String customerNumber; private final String customerName; @XmlElementWrapper(name = "customerItems") @XmlElement(name = "CustomerItem") private List<CustomerItem> customerItems; ... ,这将导致XML看起来像这样:

List<Customer>

现在,如果我要解组响应,我会收到错误:

  

javax.xml.bind.UnmarshalException:意外元素(uri:“”,   本地: “集合”)。预期的要素是   &LT; {}客户&GT;,&LT; {} CustomerItem&GT;

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
 <collection>
  <Customer>
    // normal values
    <customerItems> 
      <customerItem>
        // normal values
      </customerItem>
    </customerItems>
  </Customer>
  <Customer>
    ...
  </Customer>
  <Customer>
    ...
  </Customer>
</collection>

现在我知道它为什么不起作用,显然Jaxb希望Customer成为根元素,但现在找到一个集合(当List返回时似乎是默认值?)。

解决方法是创建一个新的Customers类,其中包含一个customer列表并将其作为根元素,但实际上我不想要一个新类。

必须有办法告诉jaxb我有一个我想要获得的类的列表,他应该查看集合标记或类似内容吗?!

1 个答案:

答案 0 :(得分:1)

我在这里看到两种方式。

1)使用@XmlRootElement(name = "collection")创建特殊的包装类,并将其设置为unmarshaller。

2)另一种方法 - 使用简单的xml解析器实现将输入SAX拆分为较小的一个,然后使用JAXB分别解析每个片段(请参阅:Split 1GB Xml file using Java)。

我不认为您可以简单地告诉我JAXB:将此xml解析为XXX类型的元素集。