espace de noms de la question sur le service web avec Apache CXF
Je suis en utilisant Apache CXF 2.7.3, et en cours d'exécution dans un espace de noms problème que je ne comprends vraiment pas. J'ai essayé largement à la recherche sur ce sujet, mais la plupart des résultats que je trouve sont pour des comportements différents. Le problème est lors de l'invocation du service web, il échouera si le paramètre élément de l'espace de noms qualifiés. Tout le reste des éléments du message sont qualifiés, et il accepte que, tout simplement pas le paramètre de l'élément. Ici est le comportement précis:
demande SANS paramètre élément qualifié:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ord="http://www.example.org/order">
<soapenv:Header/>
<soapenv:Body>
<ord:getOrder>
<id>a</id>
</ord:getOrder>
</soapenv:Body>
</soapenv:Envelope>
résultats en cas de succès:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getOrderResponse xmlns:ns2="http://www.example.org/order">
<return>
<ns2:errorCode/>
<ns2:errorMessage/>
<ns2:order>
<ns2:orderNumber>ABC123</ns2:orderNumber>
<ns2:lastName>Smith</ns2:lastName>
</ns2:order>
</return>
</ns2:getOrderResponse>
</soap:Body>
</soap:Envelope>
demande AVEC paramètre qualifiés:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ord="http://www.example.org/order">
<soapenv:Header/>
<soapenv:Body>
<ord:getOrder>
<ord:id>a</ord:id>
</ord:getOrder>
</soapenv:Body>
</soapenv:Envelope>
résultats exception de JAXB:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Client</faultcode>
<faultstring>Unmarshalling Error: unexpected element (uri:"http://www.example.org/order", local:"id"). Expected elements are <{}id></faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Dans toutes les recherches que j'ai fait, cela signifie généralement que d'un espace de noms ne correspondent pas quelque part. Mais j'ai vérifié à fond, et l'espace de noms est identique partout, y compris la ObjectFactory.class, package-info.class et la cxf-servlet.xml fichier de configuration ainsi que l' @WebService annotation. Quelqu'un peut me pointer dans la bonne direction, car à ce que je suis en manque ici?
pourquoi quelqu'un downvote avec aucune explication ou un commentaire?
OriginalL'auteur Aaron T | 2013-05-13
Vous devez vous connecter pour publier un commentaire.
La source du problème est wsgen, et je pense que c'est un bug. Il ne fait pas le wsdl et le jaxb classes générées compatible. Dans le jaxb classes générées, les éléments ne sont pas de formulaire par défaut qualifiés, qui met le paramètre élément dans un espace de noms null. Toutefois, dans le WSDL, il EST formulaire par défaut qualifiés, et c'est là que réside le problème. Il y a probablement un certain nombre de méthodes pour résoudre ce problème, le plus rapide et sale façon que j'ai trouvée est de mettre le targetNamespace sur l' @WebParam annotation. Voici des extraits de code pour démontrer ce que je veux dire, et j'espère que cela aide quelqu'un d'autre qui s'exécute dans cette.
Voici ce que j'avais à l'origine pour la mise en œuvre de la classe:
Ce sera généré JAXB classes. Comme vous pouvez le voir, il définit l'espace de noms de la racine, mais sa forme pas qualifié, et il ne permet pas de générer un paquet-info fichier.
Puis j'ai changé la mise en œuvre des services catégorie, ajouter l'espace de noms à l' @WebParam:
Alors que ce n'en est pas de formulaire par défaut qualifié, il ne s'ajouter l'espace de noms de l'élément dans l'généré JAXB classe:
soap:
de la<faultcode>
valeurOriginalL'auteur Aaron T