Bonjour,
je suis assez débutant dans JAXB et je recontre un problème lors d'un marshal d'un objet qui appartient à deux listes différentes.
J'ai une classe principale (le root) ContainerElement que j'ai pas mis ici, elle a une liste children contenant des élements de type NodeElement.
NodeElement contient deux listes, inLinks<Link> et outLinks<Link> contenant les liens d'entrée et de sortie du NodeElement.
Une classe Link avec deux référence à NodeElement, une pour la source et 'autre pour la cible.
Voilà mon code :
La classe de test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 @XmlAccessorType(XmlAccessType.FIELD) class NodeLement{ @XmlElement(name="link") @XmlElementWrapper private List<Link> inLinks = new ArrayList<Link>(); @XmlElement(name="link") @XmlElementWrapper private List<Link> outLinks = new ArrayList<Link>(); ... } @XmlAccessorType(XmlAccessType.FIELD) class Link{ @XmlInverseReference(mappedBy="inLinks") private NodeElement source; @XmlInverseReference(mappedBy="outLinks") private NodeElement target; public NodeElement getSource() { return source; } public void setSource(NodeElement source) { this.source = source; this.source.getInLink().add(this); } public NodeElement getTarget() { return target; } public void setTarget(NodeElement target) { this.target = target; this.target.getOutLink().add(this); } }
Le résultat que j'obtiens est comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 class test { public static void main(String args[]) throws JAXBException, FileNotFoundException { //rootelement ContainerElement c = new ContainerElement(); Link link = new Link(); NodeElement target = new NodeElement(); NodeElement source = new NodeElement(); link.setSource(source); link.setTarget(target); c.addChild(target); c.addChild(source); JAXBContext jc = JAXBContext.newInstance(ContainerElement.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(c, new File(XML_MODEL)); } }
Quand je fais après un unmarshal, j'obtiens deux instances de Link (identique au niveau des variables, ID ici), et chaque instance à soit le source ou le target à null et l'autre target/source correctement initialisé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 <?xml version="1.0" encoding="UTF-8"?> <containerElement> <ID>427485825424142</ID> <inLinks/> <outLinks/> <children> <child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="NodeElement"> <ID>427520478709873</ID> <inLinks/> <outLinks> <link xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Link"> <ID>427582226289815</ID> </link> </outLinks> </child> <child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="NodeElement"> <ID>427548409900894</ID> <inLinks> <link xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Link"> <ID>427582226289815</ID> </link> </inLinks> <outLinks/> </child> </children> </containerElement>
De ce qui me viens à l'esprit actuellement c'est d'utiliser BeforeUnmarshal pour rechercher le Link dans le document xml et l'empècher de créer deux instances. Mais comme mon model métier permet un nesting d'élement à l'infini (un NodeELement peut contenir des NodeElement), celà risque de poser problème si le source est très bas dans la hyérarchie alors que le target est le root par exemple.
Dans un code que j'ai vu dans un livre, ils utilisent plutôt une fonction (coté java) pour "résolver" les différentes relations entre le source et le target mais ça va me poser le même problème aussi au niveau du nesting.
Ce que je cherche c'est plutôt une solution qui le fait automatiquement, le mieux avec JAXB. J'utilise eclipse MOXy ( la 2.5) comme implémentation de JAXB.
Donc comment je pourrais régler ce problème à votre avis ?
Partager