为什么以及何时在JAXB中需要JAXBElement?

Ama*_*ora 13 java xml oracle xsd jaxb

我刚刚学习JAXB(用于XML绑定的Java体系结构).通过一些消息来源,我想到了一个疑问JAXBElement.

Oracle文档说:

When XML element information can not be inferred by the derived Java representation of the XML content, a JAXBElement object is provided. This object has methods for getting and setting the object name and object value. 链接在这里

这是否意味着JAXBElement在Schema定义的数据类型和Java数据类型之间没有直接映射时需要使用?

此外,在下面列出的一个代码示例中.我从这里跟随:

 ObjectFactory factory = new ObjectFactory();

    UserT user = factory.createUserT();
    user.setUserName("Sanaulla");
    ItemT item = factory.createItemT();
    item.setItemName("Seagate External HDD");
    item.setPurchasedOn("August 24, 2010");
    item.setAmount(new BigDecimal("6776.5"));

    ItemListT itemList = factory.createItemListT();
    itemList.getItem().add(item);

    ExpenseT expense = factory.createExpenseT();// we get expense object here
    expense.setUser(user);
    expense.setItems(itemList);

    JAXBContext context = JAXBContext.newInstance("generated");
    JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);//why is this required
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);
    marshaller.marshal(element,System.out);
Run Code Online (Sandbox Code Playgroud)

使用ExpenseT expense = factory.createExpenseT();我们能够获得ExpenseT对象.

如果我们看到,在代码中再次创建

JAXBElement<ExpenseT> element = factory.createExpenseReport(expense);
,根据此源创建的是expense对象的包装器.
另一方面,我们不为使用检索的对象创建包装器
UserT user = factory.createUserT();

所以我的问题是:

  1. JAXBElement包装的需求是expense什么?
  2. 什么时候用JAXBElement

bdo*_*han 9

有一些用例JAXBElement需要a:

  1. 元素是nillable="true"minOccurs="0".在这种情况下null,映射的字段/属性是什么意思?当属性为JAXBElement空值表示该元素不存在,而JAXBElement包装null表示带有的XML元素xsi:nil="true".
  2. 有两个全局元素具有相同的命名复杂类型.由于在JAXB类中对应于复杂类型,因此需要一种方法来捕获遇到的根元素.
  3. 有一种选择结构可以出现任何一种foo或多种bar元素,它们是相同的类型.这里a JAXBElement是必需的,因为仅仅遇到一个String值不足以指示应该编组哪个元素.
  4. xsi:nil在包含属性的文档中遇到元素.在此示例中,对应于该元素的对象仍然可以被解组以保存属性值,但JAXBElement可以指示该元素为null.