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; [...] }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 @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; [...] }
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 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);
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 :
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>
j'en déduit que CXF attend bien le flux que j'aimerais envoyer, à savoir plutôt quelque chose comme ça :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)
[...]
Avez-vous une idée du problème svp ?
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>
Merci.
Partager