2016-04-29 7 views
0

Derzeit habe ich eine Reihe von verschiedenen Xml-Elemente Wrapper in einer Klasse.JAXB: Name des XML-Elements transparent machen

Ich möchte ein einzelnes Attribut zu den XML-Tags für die XML-Elemente hinzufügen. Dies wird als eine Flagge für meine Anwendung arbeiten.

Jedes xml-Element wird einen anderen Attributwert haben, also dachte ich mir, sie zusammen zu packen.

Aus diesem Grund schrieb ich ein neues Objekt, das zwei Felder hat. Ein generisches Wertfeld und ein Zeichenfolgenfeld, um es als Attribut zu verwenden.

Leider kann ich keinen Weg finden, den Wert aus dem Wertfeld ohne die Anwesenheit von "Müll" XML-Tag zu extrahieren.

Gibt es eine Möglichkeit, dies zu tun. Um klarer zu sein, präsentiere ich die spezifischen Teile des Codes.

@XmlRootElement(name = "client") 
class Client { 
    private List<String> names; 

    private List<Integer> salaries; 

    private List<Long> socialSecurityNos; 

    @XmlElementWrapper(name = "names") 
    @XmlElement(name = "name") 
    public List<String> getNames() { 
     return this.names; 
    } 

    @XmlElementWrapper(name = "salaries") 
    @XmlElement(name = "salary") 
    public List<String> getSalaries() { 
     return this.salaries; 
    } 

    @XmlElementWrapper(name = "socialsecuritynos") 
    @XmlElement(name = "socialsecurityno") 
    public List<String> getSocialSecurityNo() { 
     return this.socialSecurityNos; 
    } 
    ... 
    ... 
} 

Dies erzeugt die folgenden XML-

<foo> 
    <names> 
     <name> 
      George 
     </name> 
     <name> 
      John 
     </name> 
    </names> 
    <salaries> 
     <salaries> 
     ... 
     ... 
     </salaries> 
    </salaries> 
    <socialSecurityNo> 
     <socialSecurityNo> 
     ... 
     ... 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

Den neuen Wert, Attributpaar Klasse, die ich geschrieben habe.

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    private String attribute; 

    private T value; 

    public T getValue() { 
     return this.value; 
    } 

    @XmlAttribute(name = "flag") 
    public String getAttribute() { 
     return this.attribute; 
    } 

} 

Und natürlich änderte ich die Typen Listen

@XmlRootElement(name = "client") 
class Client { 
    private List<GenericElement<String>> names; 

    private List<GenericElement<Integer>> salaries; 

    private List<GenericElement<Long>> socialSecurityNos; 

    ... 
    ... 

ich dieses Ergebnis zu bekommen.

<foo> 
    <names> 
     <name flag="on"> 
      George 
     </name> 
     ... 
     <name flag="off"> 
      John 
     </name> 
    </names> 

    .... 
    ..... 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

Stattdessen bekomme ich das, mit dem "Müll" -Wert-Tag.

<foo> 
    <names> 
     <name flag="on"> 
      <value>George</value> 
     </name> 
     ... 
     <name flag="off"> 
      <value>Value</value> 
     </name> 
    </names> 

    .... 
    ....  
    ....................</value> 
     </socialSecurityNo> 
    </socialSecurityNo> 
</foo> 

Antwort

0

Es sollte möglich sein, um den zusätzlichen Wert Tags loszuwerden durch den Getter für das value Feld mit @XmlValue Anmerkungen versehen. Es gibt eine blog post vom MOXy Hauptentwickler Blaise Doughan, die einen schönen Überblick gibt, wie es funktioniert.

So sollten Sie dies versuchen:

@XmlRootElement(name = "client") 
class GenericElement <T> { 
    ... 
    @XmlValue 
    public T getValue() { 
     return this.value; 
    } 
    ... 
} 
+0

Offenbar XmlValue funktioniert nur mit mit einem „bekannten“ Typ sonst ein Nullpointer während Rangier geworfen wird. – Chrys

+0

Ah ich sehe, es funktioniert nicht mit generischen Typen. In diesem Fall sollte [diese] (http://stackoverflow.com/questions/8807296/jaxb-generic-xmlvalue/8901997#8901997) andere Antwort den Trick tun. –