2016-05-27 9 views
2

Ich verwende JAX-B (v.2.2.12), um einen Java-Objektbaum zu marshalieren. Eine der Klassen ist CaseObject werden vermarshallten:JAX-B: Elementname dynamisch generieren aus XMLAttribute

public class CaseObject { 
... 
    @XmlAnyElement 
    @XmlJavaTypeAdapter(ParameterAdapter.class) 
    protected List <CaseObject> caseObjects; 
... 
} 

Die aktuelle xml represention nach Rangierung:

<caseObject id="1" name="someName" typeId="0"> 
     ... 
     <caseObject id="29" key="someOtherName" typeId="12"> 
     ... 
     </caseObject> 
</caseObject> 

Das gewünschte Ziel xml represention:

<someName id="1" name="someName" typeId="0"> 
     ... 
     <someOtherNameid="29" key="someOtherName" typeId="12"> 
     ... 
     </someOtherName> 
</someName> 

ich um gespielt habe durch Erweitern @XmlAdapter unter Verwendung des folgenden Schnipsel (example from a blog):

@Override 
    public Element marshal(CaseObject caseObject) throws Exception { 
    if (null == caseObject) { 
     return null; 
    } 

    // 1. Build a JAXBElement 
    QName rootElement = new QName(caseObject.getName()); 
    Object value = caseObject; 
    Class<?> type = value.getClass(); 
    JAXBElement jaxbElement = new JAXBElement(rootElement, type, value); 

    // 2. Marshal the JAXBElement to a DOM element. 
    Document document = getDocumentBuilder().newDocument(); 
    Marshaller marshaller = getJAXBContext(type).createMarshaller(); 

    // where the snake bites its own tail ... 
    marshaller.marshal(jaxbElement, document); 
    Element element = document.getDocumentElement(); 

    return element; 
} 

Frage ist: Wie instrumentieren JAX-B dynamisch Elementnamen aus einer Eigenschaft (XMLAttribute) während des Marshalling generieren?

Antwort

1

Der folgende XMLAdapter funktioniert für mich. Wählen Sie einfach JAXBElement als Adapter ValueType. (Verwenden Sie Ihr konkretes Objekt natürlich als BoundType.) Die Lösung dieser Lösung besteht darin, dass der Wert des QName ein gültiger xml-Elementname ist.

public class CaseObjectAdapter extends XmlAdapter<JAXBElement, CaseObject> { 

@Override 
public JAXBElement marshal(CaseObject caseObject) throws Exception { 

    JAXBElement<CaseObject> jaxbElement = new JAXBElement(new QName(caseObject.methodThatReturnsAnElementName()), caseObject.getClass(), caseObject); 

    return jaxbElement; 
} 

... 
+0

Ein möglicher Nachteil bei der Verwendung von XMLAdapters sollte der Vollständigkeit halber erwähnt werden: wenn sie mit XMLAdapters kommentierte beeing es derzeit keine Möglichkeit zu ähneln Änderungen in XSD automatisch XSD von Klassen zu erzeugen. –