为什么有时JAXB映射到JAXBElement?

在非官方指南中有一个占位符答案,带有指向(对我而言)似乎无关的文章的链接。

我使用XJC生成我的JAXB类,尽管它们大多数按预期相互映射,但有些元素被映射到JAXBElement<Foo>。这对于带有循环的图最令人讨厌,其中有时Foo元素的父节点将是JAXBElement<Foo>,而它本身没有父属性,从而中断了循环。

我可以想到各种解决方法,但是如果有人可以向我解释这种行为,那就更好了。为什么JAXB有时将<Foo>元素映射到JAXBElement<Foo>而不是Foo?

回答:

在对象模型中没有足够信息的用例中,使用JAXBElement保留元素名称/命名空间。最常见的情况是取代基:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema

xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.example.org"

xmlns="http://www.example.org"

elementFormDefault="qualified">

<xs:element name="root">

<xs:complexType>

<xs:sequence>

<xs:element ref="anElement"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="anElement" type="xs:string"/>

<xs:element name="aSubstituteElement" type="xs:string" substitutionGroup="anElement"/>

</xs:schema>

将产生:

package org.example;

import javax.xml.bind.JAXBElement;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {

"anElement"

})

@XmlRootElement(name = "root")

public class Root {

@XmlElementRef(name = "anElement", namespace = "http://www.example.org", type = JAXBElement.class)

protected JAXBElement<String> anElement;

public JAXBElement<String> getAnElement() {

return anElement;

}

public void setAnElement(JAXBElement<String> value) {

this.anElement = ((JAXBElement<String> ) value);

}

}

如果删除替换组:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema

xmlns:xs="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://www.example.org"

xmlns="http://www.example.org"

elementFormDefault="qualified">

<xs:element name="root">

<xs:complexType>

<xs:sequence>

<xs:element ref="anElement"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="anElement" type="xs:string"/>

</xs:schema>

将生成以下类:

package org.example;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "", propOrder = {

"anElement"

})

@XmlRootElement(name = "root")

public class Root {

@XmlElement(required = true)

protected String anElement;

public String getAnElement() {

return anElement;

}

public void setAnElement(String value) {

this.anElement = value;

}

}

解组时还可能会得到一个JAXBElement,请比较以下示例:

  • 没有任何JAXB元数据,结果将包装在JAXBElement中
  • 使用@XmlRootElement消除了根级别JAXBElement

以上是 为什么有时JAXB映射到JAXBElement? 的全部内容, 来源链接: utcz.com/qa/412280.html

回到顶部