2017-01-05 1 views
3

ich eine Elternklasse verbergen haben,Ich möchte ein Feld in der abgeleiteten Klasse in jaxb

Class A { 
    @XmlElement(required = true) 
    protected String name; 
} 

und ein Kind Klasse,

Class B extends A { 

    @XmlTransient 
    public String getName() { 
    return name 
    } 

Dies ist der Name der Eigenschaft nicht versteckt, wenn das Objekt B ist serialisiert.

Haben Sie eine Idee, wie das funktioniert?

Dank

+1

Wie kann der Name für die Klasse _Required_ werden 'A' aber nicht für die Klasse 'B', wenn 'B' ist eine Unterklasse von' A'? – RudolphEst

Antwort

1

JAXB ist nicht die definierten Bindung in übergeordneten Elementen in der Kinder-Klasse außer Kraft zu setzen.
Um das zu erreichen, kann ich vorschlagen, eine Zwischenklasse zu verwenden, die alle enthalten sollte, die tatsächlich in Ihrer A-Klasse enthalten sind, aber Sie sollten es mit XmlTransient annotieren und keine Zuordnung darin angeben.
Beide Klassen A und B sollten diese Basisklasse erweitern, aber jeder kann nun definieren, wie seine JAXB-Bindung definiert wird.

Hier ist ein Beispiel, beginnend mit Ihrem Code.

Basisklasse

@XmlTransient 
public class Base { 

    protected String name; 

    public String getName() { 
     return name; 
    } 

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

Die A Klasse die Standard jaxb Verhalten verwenden können, wenn es geeignet ist. Es wird ein Mapping mit öffentlichen Feldern und öffentlichen Getter/Setter erstellt (daher vererbbar von der Elternklasse).

standardmäßig wenn @XmlAccessorType auf ein Paket nicht vorhanden ist, dann ist die folgende Paketebene Anmerkung wird angenommen.

@XmlAccessorType (XmlAccessType.PUBLIC_MEMBER)

A-Klasse

@XmlRootElement 
public class A extends Base { 
} 

Wenn Sie Attribut als required oder irgendwelche Besonderheiten angeben möchten Verwendung in den Elementen Mapping, sollten Sie Bindung explizit verwenden in der A-Klasse.

Aber die B Klasse sollte @XmlAccessorType(XmlAccessType.NONE) angeben, um eine vollständige Kontrolle über Felder zu serialisieren/deserialize aus der Base Klasse zu haben.

B-Klasse

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class B extends Base { 
    @XmlElement 
    private String boundedStringSpecificToB; 
} 
Verwandte Themen