Bonjour,
jars utilisés: jaxb-api 2.2 et jaxb-impl 2.1.12
J'ai à générer un xml devant être validé par un xsd, ce dernier impose un ordre précis des balises.
pour des raisons spécifiques au projet, la classe finale à sérialiser hérite d'autres classes (par cascade).
ex: classe_B fille de classe_A et chacune rajoute un détail ou plusieurs en plus.
voici mon code exemple:
classe à sérialiser:
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
41
42 package export.xml.aveclist; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import export.xml.IdentifiableXmlType; import export.xml.simple.Personne; @XmlRootElement(name = "element-compose", namespace="http://x.y.z.com/exchange/hebdo") @XmlType(propOrder={"id", "status" , "maListeDePers"}) public class ElementCompose extends IdentifiableXmlType{ private String _status; @XmlElement(name = "status-personne") public String getStatus() { return _status; } public void setStatus(String status) { _status = status; } @XmlElementWrapper(name = "list-personne", nillable = false) @XmlElement(name = "personne") public List<Personne> maListeDePers = new ArrayList<Personne>(); public List<Personne> getListPersonne() { return maListeDePers; } public ElementCompose() { super(); } public ElementCompose(Long id, List<Personne> maListeDePers, String status) { super(id); this.maListeDePers = maListeDePers; _status = status; } }
classe Personne utilisée:
classe mère :
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
41
42
43
44
45
46
47 package export.xml.simple; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import export.xml.IdentifiableXmlType; @XmlRootElement(name="personne") @XmlType(propOrder={"id","name","age"}) public class Personne extends IdentifiableXmlType{ String _name; Integer _age; @XmlElement(name = "name") public String getName() { return _name; } @XmlElement(name = "age") public Integer getAge() { return _age; } public void setName(String name) { this._name = name; } public void setAge(Integer age) { this._age = age; } /** * @param name * @param age */ public Personne(Long id, String name, Integer age) { super(id); this._name = name; this._age = age; } @SuppressWarnings("unused") private Personne() { super(); } }
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 package export.xml; import javax.xml.bind.annotation.XmlElement; public abstract class IdentifiableXmlType { protected Long _id; protected IdentifiableXmlType() { super(); } public IdentifiableXmlType(Long id) { super(); _id = id; } @XmlElement(name="id") public Long getId() { return _id; } public void setId(Long id) { _id = id; } }
L'exception que je récupère:
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 com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Property id appears in @XmlType.propOrder, but no such property exists. Maybe you meant status? this problem is related to the following location: at export.xml.aveclist.ElementCompose Property id appears in @XmlType.propOrder, but no such property exists. Maybe you meant age? this problem is related to the following location: at export.xml.simple.Personne at public java.util.List export.xml.aveclist.ElementCompose.maListeDePers at export.xml.aveclist.ElementCompose at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472) at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302) at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1136) at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154) at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:592) at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:211) at javax.xml.bind.ContextFinder.find(ContextFinder.java:372) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) at export.xml.aveclist.ElementComposeAccess.marshal(ElementComposeAccess.java:23) at export.xml.aveclist.ElementComposeRepository.write(ElementComposeRepository.java:58) at export.xml.aveclist.TestJaxbElementCompose.main(TestJaxbElementCompose.java:17)
si je n'impose pas l'ordre avec l'annotation @Xmltype.porder, le fichier est généré mais pas avec le bon ordre des balises (une solution de contournement consiste à passer le résultat généré par une transformation XSLT si çe problème n'a pas de solution)
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 <p:element-compose> <id>99</id> <list-personne> <personne> <id>1</id> <age>41</age> <name>name01</name> </personne> <personne> <id>11</id> <age>411</age> <name>name101</name> </personne> </list-personne> <status-personne>StautCOMP</status-personne> </p:element-compose>
Partager