Статьи

JAXB’s @XmlTransient и Property Order


В предыдущих статьях я писал о том, как
аннотацию
@XmlTransient можно использовать на уровне типа, чтобы
исключить класс из иерархии наследования , или на уровне поля / свойства, чтобы
отобразить поле / свойство . В этой статье я покажу вам , как делать это влияет на
propOrder настройку на
@XmlType аннотации.

Модель Java

Основание
Этот класс будет служить корнем иерархии наследования. Это будет сопоставленный класс, и поэтому мы ничего особенного не должны сделать, чтобы это произошло.

package blog.proporder.xmltransient;
 
public abstract class Base {
 
    private int id;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
}
Person

Чтобы исключить отображение класса как части иерархии наследования, вам просто нужно аннотировать его с помощью
@XmlTransient .  
Любые суперклассы этого класса, которые не аннотированы
@XmlTransient (т.
Е.
Base ), будут по-прежнему отображаться.

package blog.proporder.xmltransient;
 
import javax.xml.bind.annotation.XmlTransient;
 
@XmlTransient
public class Person extends Base {
 
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
}

Customer

Так как родительский класс ( Person ) был помечен как @XmlTransient, свойство name будет рассматриваться как часть класса Customer и может быть включено в propOrder . Класс Customer также расширяет Base, который не был помечен как @XmlTransient, поэтому свойство id не может быть указано в propOrder . Параметр propOrder не должен содержать поле / свойство, аннотированное @XmlTransient .

package blog.proporder.xmltransient;
 
import java.util.List;
import javax.xml.bind.annotation.*;
 
@XmlRootElement
@XmlType(propOrder = { "phoneNumbers", "name"})
public class Customer extends Person {
 
    private String password;
    private List<String> phoneNumbers;
 
    @XmlTransient
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    @XmlElement(name = "phone-number")
    public List<String> getPhoneNumbers() {
        return phoneNumbers;
    }
 
    public void setPhoneNumbers(List<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }
 
     
}
Демонстрационный код

Ниже приведен демонстрационный код, который можно использовать для запуска этого примера:

package blog.proporder.xmltransient;
 
import java.io.File;
import javax.xml.bind.*;
 
public class Demo {
 
    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);
 
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);
 
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }
 
}
XML (input.xml / Output)

Ниже приведен ввод и вывод демонстрационного кода. Обратите внимание, как включены свойства классов, помеченных @XmlTransient, а свойства, помеченные @XmlTransient , не включены.

<?xml version="1.0" encoding="UTF-8"?>
<customer>
   <id>123</id>
   <phone-number>555-1111</phone-number>
   <phone-number>555-2222</phone-number>
   <name>Jane Doe</name>
</customer>