我需要执行一个选择性的编组对象。例如:

有一个班级联系方式:

@XmlRootElement(name = "contact")
public class Contact {

    private String name;
    private String number;
    private String address;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}


编组对象:

public static void main(String[] args) throws JAXBException {
        Contact contact = new Contact();
        contact.setAddress("5 Av.");
        contact.setName("John");
        contact.setNumber("5555555");

        JAXBContext context = JAXBContext.newInstance(Contact.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(contact, System.out);
    }


结果,我们有:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 street</address>
    <name>John</name>
    <number>5555555</number>
</contact>


有什么简单的方法可以执行选择性编组吗?例如,只有要获取的地址:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 street</address>
</contact>


谢谢!

最佳答案

如果未指定,则默认值为-如果类上具有以下注释:

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)


这意味着JAXB将使用所有公共成员,即您的所有getter方法。

您可以保留该默认值并取消不需要的getter方法,也可以更改默认值并显式标记要处理的getter方法。

要禁止使用getter方法,请使用@XmlTransient进行注释:


  防止将JavaBean属性/类型映射到XML表示形式。


要更改默认值,请使用@XmlAccessorType(XmlAccessType.NONE)进行注释:


  除非使用某些JAXB注释专门对其进行注释,否则没有任何字段或属性绑定到XML。


然后使用@XmlElement显式注释所需的getter方法:


  将JavaBean属性映射到从属性名称派生的XML元素。


使用@XmlTransient

@XmlRootElement(name = "contact")
class Contact {

    private String name;
    private String number;
    private String address;

    @XmlTransient
    public String getName() {
        return name;
    }

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

    @XmlTransient
    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}


使用@XmlAccessorType(XmlAccessType.NONE)

@XmlRootElement(name = "contact")
@XmlAccessorType(XmlAccessType.NONE)
class Contact {

    private String name;
    private String number;
    private String address;

    public String getName() {
        return name;
    }

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

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    @XmlElement
    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}


输出(从两者)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<contact>
    <address>5 Av.</address>
</contact>

09-30 18:07