2011-07-22 11 views
12

Ho un sacco di classi JAXB annotato che hanno un campo in comune, così ho spostato quel campo a una classe super, come questoÈ possibile/Devo elencare le proprietà ereditate per un bean mappato JAXB nell'annotazione "propOrder"?

public class Base { 
    protected SomeType commonField; 
} 

@XmlRootElement(name = "foo") @XmlType(propOrder = { "commonField", "fooField" }) 
public class Foo extends Base { 
    private SomeOtherType fooField; 
} 

@XmlRootElement(name = "bar") @XmlType(propOrder = { "commonField", "barField" }) 
public class Bar extends Base { 
    private SomeOtherType barField; 
} 

Ora ogni volta che marshall uno dei Foo o Bar ottengo un IllegalAnnotationException lamentarsi circa commonField elencato in propOrder ma non presente nella classe. Rimuovendolo dall'annotazione propOrder, tutto funziona correttamente, ma penso che dovrei elencare tutti i campi mappati. Cosa mi manca?

risposta

23

I campi/proprietà dalla classe ereditata appariranno sempre prima dei campi/proprietà sulle classi figlie. Ciò significa che per impostazione predefinita non è possibile specificarli in propOrder sul tipo di figlio. Se tuttavia contrassegni la classe genitore come @XmlTransient, i campi/proprietà saranno trattati come appartenenti alle classi figlie e potranno essere inclusi nello propOrder.

+0

essere consapevoli che questo coppie l'annotazione della sottoclasse di dettagli di implementazione private della superclasse. Rifacendo casualmente un nome di campo nella superclasse, senza modificare 'propOrder' a mano, si interrompe la serializzazione della sottoclasse. Quindi aggiungerà un campo serializzato alla superclasse. Inoltre, si noti che i nomi in 'propOrder' non sono i nomi forniti dalle annotazioni @XmlElement, ma sono invece gli identificatori di campi o proprietà Java. [Ciò detto, questa risposta mi è stata di grande aiuto oggi.] –

Problemi correlati