2011-09-21 15 views
5

Ho appena iniziato a utilizzare JAXB per rendere l'output XML da oggetti java. Esiste un polimorfismo nelle mie classi java, che sembra non funzionare in JAXB.jaxb - come creare XML da classi polimorfe

Di seguito è il modo in cui ho cercato di affrontarlo, ma nell'output non mi aspettavo campo: campoA o campoB.

@XmlRootElement(name = "root") 
public class Root { 
    @XmlElement(name = "fieldInRoot") 
    private String fieldInRoot; 
    @XmlElement(name = "child") 
    private BodyResponse child; 
    // + getters and setters 
} 

public abstract class BodyResponse { 
} 

@XmlRootElement(name = "ResponseA") 
public class ResponseA extends BodyResponse { 
    @XmlElement(name = "fieldA") 
    String fieldB; 
    // + getters and setters 
} 

@XmlRootElement(name = "ResponseB") 
public class ResponseB extends BodyResponse { 
    @XmlElement(name = "fieldB") 
    String fieldB; 
    // + getters and setters 
} 

Prima di iniziare a inventare qualche eredità intricati, c'è qualche buon approccio per fare questo?

risposta

7

Per il vostro caso d'uso probabilmente si vuole sfruttare @XmlElementRefs, questo corrisponde al concetto di gruppi di sostituzione in XML Schema:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 
    @XmlElement 
    private String fieldInRoot; 
    @XmlElementRef 
    private BodyResponse child; 
    // + getters and setters 
} 

È anche possibile sfruttare la xsi:type attributo come indicatore di ereditarietà:

EclipseLink JAXB (moxy) ha anche l'estensione @XmlDescriminatorNode/@XmlDescriminatorValue:

+0

sì, funziona perfettamente. Grazie per questo post e il riferimento al tuo blog. – smas

1
@XmlRootElement(name = "root") 
public class Root { 
    .... 

    @XmlElements({ 
     @XmlElement(type = ResponseA.class, name = "ResponseA"), 
     @XmlElement(type = ResponseB.class, name = "ResponseB")}) 
    private BodyResponse child; 

} 

Forse avete bisogno di un @XmlType(name = "ResponseX") sui vostri Response classi.

+2

La mappatura XmlElements' '@ in JAXB esiste per rappresentare strutture scelta (http: //blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html). Per questo caso d'uso dell'ereditarietà il concetto di gruppi di sostituzione è più adatto e viene mappato con '@ XmlElementRefs' (http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html). –

Problemi correlati