利用繼承關(guān)系

2019-05-25 22:14 更新

利用繼承關(guān)系

既然 XML 中的節(jié)點(diǎn)元素都是對(duì)應(yīng)著 Java 類(lèi),可以利用繼承關(guān)系來(lái)動(dòng)態(tài)生成 XML 元素。

‘商品信息’(Product.java)是之前用過(guò)的例子,它的第二個(gè)字段是引用類(lèi)型:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
    @XmlAttribute
    private String id;
    @XmlElementRef
    private Fruit fruit;
//  setters,getters
}

‘水果’(Fruit.java)只有一個(gè)字段,并且已經(jīng)設(shè)置了別名@XmlRootElement(name = "水果")

@XmlRootElement(name = "水果")
public class Fruit {
    private String color;
//  setters,getters
}

‘水果1’()繼承了‘水果’,并且有一個(gè)特殊字段:

@XmlRootElement
public class Pomelo extends Fruit{
    private String name;
//  setters,getters
}

‘水果2’()繼承了‘水果’,并且有一個(gè)特殊字段:

@XmlRootElement
public class Watermelon extends Fruit{
    private String shape;
//  setters,getters
}

當(dāng)商品信息是第一種水果時(shí):

    @Test
    public void test5() throws JAXBException {
        Pomelo pomelo = new Pomelo();
        pomelo.setName("柚子");
        pomelo.setColor("Orange");

        
        Product product = new Product();
        product.setFruit(pomelo);
        product.setId("1205");

        
        JAXBContext context = JAXBContext.newInstance(Product.class,Pomelo.class,Fruit.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(product, System.out);
    }

生成的 XML 如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
    <pomelo>
        <color>Orange</color>
        <name>柚子</name>
    </pomelo>
</product>

換一種水果再看看:

    @Test
    public void test5_2() throws JAXBException {
        Watermelon watermelon = new Watermelon();
        watermelon.setShape("橢圓形");
        watermelon.setColor("Green");

        
        Product product = new Product();
        product.setFruit(watermelon);
        product.setId("1205");

        
        JAXBContext context = JAXBContext.newInstance(Product.class,Watermelon.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        
        marshaller.marshal(product, System.out);
    }

生成的 XML 如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
    <watermelon>
        <color>Green</color>
        <shape>橢圓形</shape>
    </watermelon>
</product>

商品信息每次根據(jù)不同的子商品而變化,之前已經(jīng)設(shè)置過(guò)的主商品Fruit已經(jīng)不能影響最終結(jié)果。

需要注意的是,這里不能直接使用靜態(tài)工具類(lèi)JAXB,下面的方式生成的結(jié)果不正確:

    @Test
    public void test5_3() throws JAXBException {
        Watermelon watermelon = new Watermelon();
        watermelon.setShape("橢圓形");
        watermelon.setColor("Green");

        
        Product product = new Product();
        product.setFruit(watermelon);
        product.setId("1205");

        
        JAXB.marshal(product, System.out);
    }

得到的 XML 和之前的預(yù)期不一致:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<product id="1205">
    <水果>
        <color>Green</color>
    </水果>
</product>

因?yàn)?JAXB 工具類(lèi)在注冊(cè)newInstance時(shí),只關(guān)注第一個(gè)參數(shù)JAXB.marshal(object, out),而這里的第一個(gè)參數(shù)是Product,因此不能注冊(cè)Fruit的子類(lèi) Watermelon,所有與 Watermelon 相關(guān)的設(shè)置都不能成功,不過(guò)這里與父類(lèi) Fruit 相關(guān)的設(shè)置都生效了。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)