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>
(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'? –
@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? –