2012-03-26 1 views
2

Il existe une classe appelée Parent qui est générée à partir d'un fichier xsd et qui contient une annotation JABX complète List. Cette classe ne peut pas être modifiée. En outre, il existe une classe Child extends Parent qui souhaiterait utiliser un XmlAdapter pour convertir le List en HashMap. Le champ HashMap aura (pourrait avoir) le même nom et le même mappage avec le même élément xsd. Est-ce que JAXB peut définir un champ avec le même nom plusieurs fois?JAXB réutilise l'annotation de la classe parente et le champ de préréglage d'accès

Est-ce que JAXB essaie d'utiliser le List déjà rempli de la classe parent comme entrée pour le XmlAdapter dans la classe enfant? Je présume que cela ne fonctionnera pas comme je l'espère.

Comment cette tâche peut-elle être effectuée proprement?

EDIT: Ma vraie question est de savoir comment utiliser les beans autogénérés JAXB qui ne doivent pas être édités et qui peuvent toujours utiliser un hashmap.

Voici mon code qui ne fonctionne pas. La carte reste nulle. Sry pour le formatage de mauvais code.

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(); 
    } 
} 

est classe A Voici:

public class A { 

    @XmlAttribute 
    String v; 

    @XmlAttribute 
    String k; 
} 

Voici le test.xml:

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

(1) vous ne pouvez pas mapper l'élément 'a' sur deux propriétés en Java. Comment mapper ces deux propriétés différentes en XML (2) Le mapping de la classe 'A' (3) me manque? Pouvez-vous publier votre' test.xml'? –

+0

@dma_k merci voir modifier. Je pense que l'utilisation d'un nom pour plusieurs champs peut poser problème, mais il existe peut-être un moyen intelligent de dire à JAXB d'utiliser la classe la plus élevée de la hiérarchie. J'utilise maintenant la méthode 'afterUnmarshall' pour construire une hashmap, mais l'approche de l'adaptateur serait plus agréable. Mais cela semble impossible? –

Répondre

1

Jetez un oeil à par exemple Blaise Doughan. Dans votre cas class A est class MyMapEntryType, class Parent est class MyMapType. class Child ne doit pas étendre Parent, car il est classe intermédiaire juste pour JAXB pour pouvoir mapper la liste des <a> éléments.

Questions connexes