[CXF] Utilisation de XmlID / XmlIDREF et Polymorphisme
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:
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:
1 2 3 4 5 6 7
| @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B", namespace = "http://mon.exemple.fr/")
public class B extends A {
[...]
} |
Code:
1 2 3 4 5 6 7
| @XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "C", namespace = "http://mon.exemple.fr/")
public class C extends A {
[...]
} |
Code:
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:
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:
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:
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 :
Citation:
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:
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.