XmlRootElement

8132 ワード

役割は
JAvaオブジェクトxmlファイル間の変換
 
JAXB Annotation
@XmlRootElement//xmlファイルのルート要素
@XmlElement
@XmlAccessorType//クラス内で、どのようなメンバーがxmlに変換されて伝送できるかを示すFIELD PROPERTY...
@XmlTransient
@XmlJavaTypeAdaptor
 
=========================================
 
次に例を示します.
 
Boy.java
 

package jaxb;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement //          
@XmlAccessorType(XmlAccessType.FIELD)
public class Boy {    
    String name = "CY";
}

JAXBTest.java

 

package jaxb;

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXBTest {

    public static void main(String[] args) throws JAXBException {
        JAXBContext context = JAXBContext.newInstance(Boy.class);
        
        Marshaller marshaller = context.createMarshaller();
        Unmarshaller unmarshaller = context.createUnmarshaller();
        
        Boy boy = new Boy();
        marshaller.marshal(boy, System.out);
        System.out.println();
        
        String xml = "David";
        Boy boy2 = (Boy) unmarshaller.unmarshal(new StringReader(xml));
        System.out.println(boy2.name);
    }
}

 
次に、実行結果を示します.
CYDavidはまずmarshallをxmlファイルにし、
xmlファイルunmarshalをjava objectにします.
 
--------------------------------------------------
 
変更1:
@XmlAccessorType(XmlAccessType.FIELD)  --> @XmlAccessorType(XmlAccessType.PROPERTY)
属性のみがxmlのラベルに変換されるという意味です.
再実行の結果は次のとおりです.
CY
つまりjava objectをxmlに変換する場合、nameは属性ではありません(get setメソッドはありませんので)、nameはラベルに変換されません.
 
-----------------------------------------------------
 
変更2:
1を変更した上で、nameプロパティにget setメソッドを追加します.再実行の結果:
CYDavidから@XmlAccessorTypeというannotationの役割が分かる.
 
-----------------------------------------------------
 
変更3:
2を変更した上で、Boyにfieldを追加し、int age=10、すなわち:
 

package jaxb;

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {    
    String name = "CY";
    int age = 10; 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

明らかに、このageはxmlファイルに変換されません.解決策は次のとおりです.
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlAccessType;

@XmlRootElement // bixude 
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    
    String name = "CY";
    @XmlElement
    int age = 10; 
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

@XmlElement annotationを加える.実行結果:
10 CYDavid
 
--------------------------------------
 
ルート要素の場合、属性を設定できます.
@XmlRootElement(name="b"nameSpace="http://test")
これにより、生成されたxmlファイルでラベルがラベルに変わります.ネーミングスペースを追加します.
 
----------------------------------------
 
@XmlJavaType Adaptorの役割について説明します.
 
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
    
    private String name = "CY";

 

    private Address address; //      
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Java objectがxmlに変換された場合、インタフェースAddressは変換できません.
ここに@XmlJavaType Adapter(AddressAdapter.class)を追加します
AddressAdaptorクラスを1つ多く書きます.
このクラスはAddressインタフェースの特定の実装クラスのオブジェクトを返します.
 
これが@XmlJavaType Adapterの役割です.
転載先:https://www.cnblogs.com/hujingwei/p/4737383.html