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:

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