2010-09-16 2 views
3

Существует ли аннотация JAXB для игнорирования родительского класса, когда у вас есть элемент @XmlElement в списке дочерних классов?Игнорировать родительский класс при сериализации в XML

Просто пояснить - мне было интересно, был ли лучший способ, чем маркировать все геттеры/сеттеры родительских классов как переходные, а затем вернуться к дочерним классам и добавить геттеры/сеттеры и аннотировать их как 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 я n GenericHelper, любой класс, который расширяет его, если бы у меня был метод getSpecificHelper(), который возвращал список всех работодателей и аннотировал его с помощью XmlElement, ВСЕ из этих элементов возвращаются с именем, LOE, RoleName и т. д. I Я ищу аннотацию класса, чтобы перейти на GenericHelper, поэтому я могу избежать использования всех @XmlTransients в отдельности и использовать только обозначения XmlElement, которые я поместил в SpecificHelper

+0

Я не уверен, я понимаю. Можно ли разместить короткий пример, чтобы продемонстрировать свой вопрос? –

+0

конечно..подтвердите это сейчас – Derek

ответ

4

Как насчет?

Родитель Класс

Мы будем использовать 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. Вам нужно будет только переопределить getter из родительского класса.

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; 
    } 

} 

Demo Класс

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> 
+0

Я не сделал это точно так, как вы сказали здесь, но близко. Спасибо за советы! – Derek

+0

Как насчет родительского класса в сторонней библиотеке, и мы не можем изменить его исходный код? – CaiNiaoCoder

+0

@CaiNiaoCoder - Если вы используете EclipseLink MOXy в качестве поставщика JAXB, вы можете использовать внешний документ сопоставления для этого случая использования: http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html –

Смежные вопросы