2012-06-10 12 views
29

Ich habe 2 Klassen:Ohne Felder in JAXB

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

und

@XmlRootElement 
public class B { 

    private Long id; 
    private String field1; 
    private String field2; 

    // setters and getters 
} 

standardmäßig, wenn ich eine Instanz der Klasse A in die XML-Transformation, werde ich alle seine Felder (id) und die referenzierten B Klassenfelder (id, field1, field2) wie folgt aus:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
     <field1>test1</field1> 
     <field2>test3</field2> 
    </b> 
</a> 

Ist es möglich zu ändern welche Felder von der referenzierten Klasse B sind im XML der A Klasse enthalten? Z.B. Ich möchte sagen, dass, wenn ich eine Instanz von A Klasse verwandeln, ich will nur id von der B Klasse erhalten (keine field1 und field2 Felder), so möchte ich erhalten:

<a> 
    <id>2</id> 
    <b> 
     <id>5</id> 
    </b> 
</a> 

Ich will nicht um dauerhaft die B Klasse mit Anmerkungen versehen (@XMLTransient oder @XMLElement verwendet wird), es zu erreichen, da es Fälle gibt, in denen ich ganze B Klasse exportieren möchten wie (mit id, field1 und field2.)
ich will nur nicht exportieren all diese Felder, wenn die B Klasse ist referenziert von A.

Ist dies sogar mit JAX-B möglich?

Antwort

7

Die JAXB-Standardbindungen können global oder von Fall zu Fall überschrieben werden, indem Sie custom binding declarations verwenden oder @XmlTransient für das Feld verwenden.

+0

Danke! Ich denke, es verkompliziert die Dinge ein wenig, wenn ich die JAXB-Implementierung von Glassfish verwende ... Es scheint, dass es keine auf Annotationen basierende Lösung gibt, und ich muss ein zusätzliches Anpassungs-XML erstellen. –

86

Sie können die Anmerkung @XmlTransient verwenden, um Felder zu ignorieren. Setzen Sie diese Anmerkung auf das Feld selbst oder dessen Getter.

+0

Wo soll ich es hinstellen? Auf den 'B' Klassen' field1' und 'field2' Feldern? Würde es nicht dazu führen, dass 'field1' und' field2' nicht auftreten, wenn ** eine Instanz der 'B' Klasse ** transformiert wird? –

+0

Sie sollten diese Annotationen auf Felder oder Methoden der Klasse B setzen. Felder von werden nicht entfernt.Sie erscheinen einfach nicht in der resultierenden XML-Datei. – AlexR

+1

Danke Alex, aber ich denke, es ist genau das, was ich nicht machen möchte (siehe den letzten Abschnitt meiner Frage). Diese Änderung verbietet, dass die Felder in der resultierenden XML in ** allen Vorkommen ** der Klasse B erscheinen. –

12

Ok, ich habe mit einiger hacky Lösung zu kommen:

@XmlRootElement 
public class A { 

    private Long id; 
    private B b; 

    // setters and getters 
} 

ich für den Rest Anwendungsfall nur ein zusätzliches Getter zur Verfügung gestellt habe, so ist es wie:

@XMLTransient 
public B getB() { 
    return b; 
} 

@XMLElement(name="b") 
public Long getBForREST() { 
    return b.getId(); 
} 

Es führt in der folgenden Struktur:

<a> 
    <id>2</id> 
    <b>5</b> 
</a> 

Es ist nicht genau die gleiche Struktur, die ich anstrebte, funktioniert es für mich.

Ich mag diese Lösung nicht - eine @XMLExclude({"field1", "field2"}) oder etwas ähnliches wäre meiner Meinung nach viel sauberer.

Trotzdem - für jetzt funktioniert es; es ist hässlich, aber es funktioniert.

+3

Sie können das REST-only-Getter sogar privat machen, damit es die Benutzer Ihrer Klasse nicht verwirrt. –

+0

Es ist nicht hässlich, es ist perfekt, danke! –