J'ai créé un service Web en utilisant:
Le service renvoie un objet Java personnalisé (DataBean) au client, mais je suis tombé sur une exception dans le code client:
org.Apache.axis2.AxisFault: org.Apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
D'après mes recherches, encore et encore ... Je pense que c'est un problème très courant, mais je n'ai pas encore de réponse concluante quant à la marche à suivre pour le corriger.
Certaines publications sur ce forum et d'autres indiquent que le WSDL doit être modifié (un espace nom), ou que le stub client doit être modifié. Certains déclarent même qu'il y a un bug dans la BAD. C’était sûrement un bogue dans les versions précédentes d’Axis, mais il existe de nombreuses publications dans les archives de courrier qui indiquent que le bogue a été corrigé. Ces archives de mailing étaient liées à des versions antérieures d'Axis2.
Maintenant mes questions sont:
Il est à noter que j'ai créé un service Web similaire qui renvoie une "chaîne" au client. Ça fonctionne bien ! Donc, cela échoue lorsqu'un type de données complexe est impliqué.
Il y avait quelques informations sur le site Web d'Apache , sous la rubrique " Limitations connues " ...
Il se lit comme suit: " ADB est censé être un cadre de liaison de données 'simple' et ne vise pas à compiler tous les types de schémas. Les limitations suivantes sont les plus soulignées .
Est-ce le problème?
Ce qui suit est l'extrait du fichier WSDL qui pourrait vous intéresser ...
<wsdl:types>
<xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs">
<xs:import namespace="http://mywebservice/xsd"/>
<xs:element name="getMsg">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getMsgResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd">
<xs:complexType name="DataBean">
<xs:sequence>
<xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
Maintenant, comment puis-je résoudre le problème? Devrais-je inclure d'autres extraits de code ici?
Le code généré par CodeGen (à partir de WSDL) pour l’objet Java (bean) que j’utilisais attendait un espace de noms différent pour les champs du bean. D'une manière ou d'une autre, un espace de nom incorrect était présent dans le code généré par Axis. J'ai corrigé l'espace de noms pour refléter ce qu'il aurait dû être et tout a bien fonctionné. Je peux voir des gens qui répondent encore à cette question, alors j'ai pensé poster à nouveau ma solution ici (je l'ai déjà posté en réponse à la solution de Kenster). Comme aucune des solutions postées avant de trouver la solution ne fonctionnait, je n’ai accepté aucune réponse.
"Sous-élément inattendu" signifie que le message reçu par le destinataire contient un élément XML que le destinataire ne s'attendait pas. "{schemaTargetNs} message" est le nom de l'élément inattendu rencontré. En d'autres termes, l'expéditeur a envoyé un message non valide au destinataire.
Si le serveur a émis l'exception que vous avez signalée, le client a envoyé un message non valide au serveur. Si le client a émis l'exception, alors l'erreur était dans la réponse du serveur au client.
si le xsd (wsdl) est correct avec la demande xml, la réponse est parce que le problème est l'ordre des éléments xml. Une solution possible consiste à générer votre client axis2 avec l'option -Eosv. ça marche pour moi.
Regardez dans votre fichier .xsd. Triez vos éléments xs par ordre alphabétique sous votre <xs:extension base=...>
. Cela conviendra à vos besoins.
dans mon cas, le service Web envoie des éléments dans un ordre différent de celui de la séquence figurant sur le xsd. Je modifie le stub en ce moment, l'ordre n'a donc pas d'importance, car je n'ai aucune chance de modifier le service Web.
Cette erreur peut être un peu trompeuse. Après avoir modifié le WSDL et ajouté un nouvel élément obligatoire, j'ai créé mon client. Que cette erreur est apparue. La solution a été que j'ai oublié de remplir cet élément avec l'une des méthodes de mon service Web. Si cette erreur apparaît, vérifiez également si vos éléments obligatoires sont renseignés sur le serveur.
Quand j'ai vérifié le code de l'axe, j'ai trouvé ce qui suit
if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )
c'est là que l'erreur se produit, . La méthode equals () de QName recherche LocalPart & namespaceURI . mais reader.getName () n'a pas d'URI d'espace de nom défini, d'où l'erreur
J'ai changé tous les if-check de
if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )
à
if( new javax.xml.namespace.QName("someElementName").equals(reader.getName()) )
et cela a bien fonctionné pour moi
J'ai eu le même problème. Lorsque la base64binary a dépassé la limite de 16k, l'analyseur commence à donner l'erreur, mais il arrête substantiellement de lire le contenu après 16k. Il est donc évident que le reste du document semble corrompu.
Mon problème était que j'utilisais com.Sun.xml.stream.XMLReaderImpl.
Enlever
<dependency>
<groupId>com.Sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</dependency>
et en ajoutant
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>wstx-asl</artifactId>
</dependency>
résolu mon problème (donc wstx comme suggéré avant fonctionnait)