Игнорировать родительский класс при сериализации в XML - PullRequest
3 голосов
/ 16 сентября 2010

Есть ли аннотация JAXB для игнорирования родительского класса, когда у вас есть @XmlElement в списке дочерних классов?

Просто чтобы уточнить - мне было интересно, есть ли лучший способ, чем отмечать всеиз родительских классов getters / setters как переходные, а затем необходимо вернуться к дочерним классам и добавить getters / setters и также пометить их как XmlElements

Пример:

public class GenericHelper {
    String name="";
    String dates="";
    String roleName="";
    String loe="";
    @XmlTransient
    public String getName() {return name;}
public void setName(String name) {this.name = name;}
@XmlTransient
public String getDates() {return dates;}
public void setDates(String dates) {this.dates = dates;}
@XmlTransient
public String getRoleName() {return roleName;}
public void setRoleName(String roleName) {this.roleName = roleName;}
@XmlTransient
public String getLOE() {return loe;}
public void setLOE(String loe) {
    this.loe = loe.replace("%", "").trim();
}
}

и

public class SpecificHelper extends GenericHelper {
List<ProjectHelper> projects;
public SpecificHelper (){
    projects=new ArrayList<ProjectHelper>();
}
@XmlElement(name = "project")
@XmlElementWrapper (name = "projectlist")
public List<ProjectHelper> getProjects() {return projects;}
public void setProjects(List<ProjectHelper> projects) {this.projects = projects;}
@XmlElement
public String getName(){
    return super.getName();
}

@Override
public String toString(){
    String ret="SpecificHelper [";
    ret+="name:"+name+";";
    ret+="dates:"+dates+";";
    ret+="roleName:"+roleName+";";
    ret+="loe:"+loe+";";
    ret+="\n\tprojects:"+projects+";";
    return ret+"]";
}
}

Так что в этом примере, если я уберу аннотации XmlTransient в GenericHelper, любой класс, который его расширяет, если бы у меня был метод getSpecificHelper (), который возвращал список всех работодателей, ианнотируйте его с помощью XmlElement, все эти элементы будут возвращаться с именем, LOE, RoleName и т. д. Я ищу аннотацию класса для GenericHelper, поэтому я могу избежать необходимости использовать все @XmlTransients по отдельности и использовать толькоНотации XmlElement, которые я поместил в SpecificHelper

1 Ответ

4 голосов
/ 16 сентября 2010

Как насчет?

Родительский класс

Мы будем использовать XmlAccessType.NONE, чтобы сообщить JAXB, что сопоставляются только явно аннотированные поля / свойства.

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

@XmlAccessorType(XmlAccessType.NONE)
public class Parent {

    private String parentProperty1;
    private String parentProperty2;

    public String getParentProperty1() {
        return parentProperty1;
    }

    public void setParentProperty1(String parentProperty1) {
        this.parentProperty1 = parentProperty1;
    }

    public String getParentProperty2() {
        return parentProperty2;
    }

    public void setParentProperty2(String parentProperty2) {
        this.parentProperty2 = parentProperty2;
    }

}

Дочерний класс

Мы будем использовать XmlAccessType.PROPERTY для ребенка.Любые свойства из родительского класса, который мы хотим включить, должны быть переопределены и явно аннотированы.В этом примере мы введем parentProperty2 из класса Parent.Вам нужно только переопределить метод получения из родительского класса.

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

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Child extends Parent {

    private String childProperty;

    @Override
    @XmlElement
    public String getParentProperty2() {
        return super.getParentProperty2();
    }

    public String getChildProperty() {
        return childProperty;
    }

    public void setChildProperty(String childProperty) {
        this.childProperty = childProperty;
    }

}

Демонстрационный класс

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Child.class);

        Child child = new Child();
        child.setParentProperty1("parentProperty1");
        child.setParentProperty2("parentProperty2");
        child.setChildProperty("childProperty");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(child, System.out);
    }
}

Выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<child>
    <childProperty>childProperty</childProperty>
    <parentProperty2>parentProperty2</parentProperty2>
</child>
...