Message SOAP avec javax.xml.savon de l'espace de noms d'erreur?
Ce qui suit est un exemple générique de requête SOAP .NET web service, je suis censé appeler à partir de mon java web app:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<setAMRequestData xmlns="http://tempuri.org/">
<id>int</id>
</setAMRequestData>
</soap:Body>
</soap:Envelope>
Je suis en mesure de générer quelque chose de similaire à partir de la console java de l'application à l'aide de ce segment de code:
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
...
SOAPConnectionFactory sfc = SOAPConnectionFactory.newInstance();
SOAPConnection connection = sfc.createConnection();
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage sm = mf.createMessage();
SOAPHeader sh = sm.getSOAPHeader();
SOAPBody sb = sm.getSOAPBody();
sh.detachNode();
QName bodyName = new QName("http://tempuri.org/", "setAMRequestData", XMLConstants.DEFAULT_NS_PREFIX);
SOAPBodyElement bodyElement = sb.addBodyElement(bodyName);
QName n = new QName("id");
SOAPElement quotation = bodyElement.addChildElement(n);
quotation.addTextNode("121152");
Le résultat est le code XML suivant:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<setAMRequestData xmlns="http://tempuri.org/">
<id>121152</id>
</setAMRequestData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Ce invoque le service. Ensuite, j'ai utilisé soapUI pour essayer d'appeler ce service, et il a généré le message soap à partir de WSDL comme ceci (il diffère de la précédente dans la déclaration d'espace de noms dans l'enveloppe, et préfixes):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:setAMRequestData>
<tem:id>?</tem:id>
</tem:setAMRequestData>
</soapenv:Body>
</soapenv:Envelope>
Cela fonctionne aussi à partir de soapUI. Mais enfin, quand j'ai essayé de recréer cette forme de message soap à l'aide de cette séquence de code:
//factories and stuff, like in the example above
SOAPPart part = sm.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
envelope.addNamespaceDeclaration("tem", "http://tempuri.org/");
SOAPHeader sh = sm.getSOAPHeader();
SOAPBody sb = sm.getSOAPBody();
sh.detachNode();
QName bodyName = new QName(null, "setAMRequestData", "tem");
SOAPBodyElement bodyElement = sb.addBodyElement(bodyName);
QName n = new QName(null, "id", "tem");
SOAPElement quotation = bodyElement.addChildElement(n);
quotation.addTextNode("7028");
Je suis l'exception suivante dans la ligne de SOAPElement citation = bodyElement.addChildElement(n);:
org.le w3c.dom.DOMException: NAMESPACE_ERR: Une tentative est faite pour créer ou modifier un objet dans une manière qui est incorrect à l'égard des espaces de noms.
Peu importe ce que j'ai essayé, je ne pouvais simplement pas ensemble "tem" préfixe pour le id élément... Ce qui se passe ici?
Grâce.
OriginalL'auteur Less | 2011-08-22
Vous devez vous connecter pour publier un commentaire.
Vous êtes de la liaison d'un uri d'espace de noms d'un préfixe et, plus tard, essayez de créer un élément avec le même préfixe, mais avec une valeur null uri d'espace de noms:
Un élément est identifié par la combinaison de l'uri d'espace de noms et le nom local. Pour résoudre ce problème, vous devez spécifier l'espace de noms sur chaque élément que vous créez:
OriginalL'auteur Jörn Horstmann
De ne pas obtenir tous travaillé parce que le XML en sortant de votre application n'a pas exactement le même aspect (surtout avec les préfixes d'espace de noms) que la demande faite par SoapUI. Collez votre code dans un SoapUI demande, cliquez avec le bouton droit de le re-formater, et de voir si SoapUI comprend votre stuff (et si vous avez la version pro, vérifier dans la forme et le contour de vues). Si ça a l'air ok, le feu de l'enlever et voir si vous obtenez la même réponse que celle de l'indigène (soapUI) demande. Si oui, vous êtes bon pour aller. Si, toutefois, les choses sont au mauvais endroit, les espaces de noms sont déformés, SoapUI ne peut pas rendre votre XML, alors vous avez quelques réglages à faire dans votre code.
Correct. Tant chez les préfixes de référence de la même URI, vous êtes bon.
OriginalL'auteur Chris Thornton