Bonjour,

Je rencontre un problème pour générer mon flux Web-Service avec CXF lorsque j'utilise les annotations @XmlID et @XmlIDREF sur des classes dérivées.

Imaginons les 5 classes suivantes (avec les accesseurs et constructeurs qui vont bien) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "A", namespace = "http://mon.exemple.fr/")
@XmlSeeAlso({ B.class, C.class })
public class A {
 
	@XmlID
	private String code;
 
[...]
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B", namespace = "http://mon.exemple.fr/")
public class B extends A {
 
[...]
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "C", namespace = "http://mon.exemple.fr/")
public class C extends A {
 
[...]
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "D", namespace = "http://mon.exemple.fr/")
public class D {
 
	@XmlIDREF
	private A a;
 
[...]
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "E", namespace = "http://mon.exemple.fr/")
public class E {
 
	@XmlElement(nillable = true)
	private List<A> listeA;
 
	@XmlElement(nillable = true)
	private List<D> listeD;
 
[...]
}
Imaginons que j'alimente cette structure de cette maniè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
 
A a1 = new A(); 
a1.setCode("1");
 
A a2 = new B(); 
a1.setCode("2");
 
D d1 = new D(); 
d1.setA(a1)
 
D d2 = new D(); 
d2.setA(a2)
 
E root = new E(); 
root.getListeA().add(a1);
root.getListeA().add(a2);
root.getListeD().add(d1); 
root.getListeD().add(d1);
j'obtiens le flux suivant :
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
<root>
	<a>
		<code>1</code>
	</a>
	<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns:ns4="http://monexemple.fr/"
			xsi:type="ns4:B">
		<code>2</code>
	</a>
	<d>
		<a>1</a>
	</d>
	<d>
		<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xmlns:ns4="http://monexemple.fr/"
				xsi:type="ns4:B">
			<code>2</code>
		</a>
	</d>
</root>
Lorsque j'envoie ce flux et que je veux le désérialiser vers les mêmes classes A, B, C, D et E, j'obtiens l'erreur suivante :
org.apache.cxf.interceptor.Fault: Unmarshalling Error: unexpected element (uri:"", local:"code"). Expected elements are (none)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:822)
at org.apache.cxf.jaxb.JAXBEncoderDecoder.unmarshall(JAXBEncoderDecoder.java:643)
at org.apache.cxf.jaxb.io.DataReaderImpl.read(DataReaderImpl.java:156)
at org.apache.cxf.interceptor.DocLiteralInInterceptor.handleMessage(DocLiteralInInterceptor.java:109)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
[...]
j'en déduit que CXF attend bien le flux que j'aimerais envoyer, à savoir plutôt quelque chose comme ça :
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
<root>
	<a>
		<code>1</code>
	</a>
	<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns:ns4="http://monexemple.fr/"
			xsi:type="ns4:B">
		<code>2</code>
	</a>
	<d>
		<a>1</a>
	</d>
	<d>
		<a>2</a>
	</d>
</root>
Avez-vous une idée du problème svp ?

Merci.