簡體   English   中英

為什么JAXB有時會映射到JAXBElement?

[英]Why does JAXB sometimes map to 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,比較以下示例:

為了避免映射到JAXBElement? 我做過這件事對我有用:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
           jaxb:extensionBindingPrefixes="xjc"
           jaxb:version="2.0">

    <xs:annotation>
       <xs:appinfo>
          <jaxb:globalBindings generateValueClass="false">
           <xjc:simple />
          </jaxb:globalBindings>
       </xs:appinfo>
    </xs:annotation>

</xs:schema>

將此文件保存在xml文件中並作為綁定文件提供。

參考鏈接

使用eclipse生成JAXB類不要忘記給出使用上面的xml創建的綁定文件,並選中“允許供應商擴展”,如下所示:

在此輸入圖像描述

通過更改,我可以在生成的xjc類中刪除JAXBElement,以便將xsd轉換為JAXB生成的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM