2012-03-26 4 views
2

Es gibt eine Klasse namens Parent, die aus einer xsd-Datei generiert wird und eine vollständige JABX mit Anmerkungen enthält List. Diese Klasse kann nicht geändert werden. Des Weiteren gibt es eine Child extends Parent Klasse, die ein XmlAdapter verwenden möchten, um die List zu einem HashMap zu konvertieren. Das Feld HashMap hat (könnte) denselben Namen haben und demselben xsd-Element zugeordnet sein.JAXB Wiederverwendung Annotation von Elternklasse und Zugriffsvoreinstellungsfeld

Kann eingestellt JAXB ein Feld mit dem gleichen Namen mehrmals? Versucht JAXB, die bereits gefüllte List der Elternklasse als Eingabe für die XmlAdapter in der Kindklasse zu verwenden? Ich nehme an, das wird nicht so funktionieren, wie ich es mir erhofft habe.

Wie kann diese Aufgabe ordentlich zu tun?

EDIT: Meine eigentliche Frage ist wirklich, wie JAXB automatisch generierte Bohnen, die nicht bearbeitet werden sollten und noch in der Lage sein, eine Hashmaps verwenden.

Hier ist mein Code, der nicht funktioniert. Die Karte bleibt null. Sry für die schlechte Code-Formatierung.

public class Adapter extends XmlAdapter<LinkedList<A>,HashMap<String,A>> { 

    @Override 
    public LinkedList<A> marshal(HashMap<String, A> v) throws Exception { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public HashMap<String, A> unmarshal(LinkedList<A> v) throws Exception { 
     HashMap<String, A> map = new HashMap<String, A>(); 
     for(A a:v) { 
      map.put(a.k, a); 
     } 
     return map; 
    } 
} 

@XmlRootElement 
public class Child extends Parent { 

    @XmlElement(name="a") 
    @XmlJavaTypeAdapter(Adapter.class) 
    HashMap<String,A> map; 
} 

@XmlRootElement 
public class Parent { 

    @XmlElement(name="a") 
    LinkedList<A> values = new LinkedList<A>(); 
} 

public class XmlTest { 

    public static void main(String[] args) throws ParserConfigurationException, JAXBException, SAXException, IOException { 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(new File("test.xml")); 
     JAXBContext jc = JAXBContext.newInstance(Child.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Child instance = unmarshaller.unmarshal(doc,Child.class).getValue(); 
    } 
} 

Hier ist die Klasse A:

public class A { 

    @XmlAttribute 
    String v; 

    @XmlAttribute 
    String k; 
} 

Hier die test.xml:

<root> 
    <a v="1" k="a"/> 
    <a v="2" k="b"/> 
</root> 
+0

(1) Sie können kein 'a'-Element zwei Eigenschaften in Java zuordnen. Wie diese zwei verschiedenen Eigenschaften zurück zu XML zugeordnet werden (2) Ich vermisse das Mapping für die Klasse 'A' (3) Kannst du deine' test.xml' veröffentlichen? –

+0

@dma_k danke siehe bearbeiten. Ich denke, dass die Verwendung eines Namens für mehrere Felder ein Problem sein kann, aber vielleicht gibt es eine kluge Möglichkeit JAXB zu sagen, die höchste Klasse in der Hierarchie zu verwenden. Ich benutze jetzt die 'afterUnmarshall'-Methode, um eine Hashmaps aufzubauen, aber die Adapter-Approach wäre schöner. Aber es scheint unmöglich zu sein? –

Antwort

1

Hier finden Sie aktuelle Beispiel von Blaise Doughan. In Ihrem Fall ist class Aclass MyMapEntryType, class Parent ist . class Child sollte Parent nicht verlängern, da es Zwischenklasse ist nur für JAXB der Lage sein, die Liste der <a> Elemente abzubilden.