В предыдущих статьях я писал о том, как
аннотацию @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; } }
Чтобы исключить отображение класса как части иерархии наследования, вам просто нужно аннотировать его с помощью
@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); } }
Ниже приведен ввод и вывод демонстрационного кода. Обратите внимание, как включены свойства классов, помеченных @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>