Impossible de créer l'enveloppe de la source, parce que l'élément racine n'est pas nommé Enveloppe
J'ai une requête SOAP que je l'ai testé dans SoapUI. J'ai réussi à obtenir la réponse désirée.
Le problème dans mon code se produit lorsque je suis en essais de savoir si ou de ne pas la réponse a réussi à if (isSuccessResponse(soapResponse)) {
ci-dessous:
public static void main(String[] args) throws Exception {
//Establish SOAP connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
//Generate SOAP request
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), namespaceURI);
//Test to see if SOAP response is available
System.out.print("SOAP Response:");
System.out.println();
soapResponse.writeTo(System.out);
//Close connection
soapConnection.close();
if (isSuccessResponse(soapResponse)) {
System.out.println("Success!");
} else {
System.out.println("Fault!");
}
}
Succès?
private static boolean isSuccessResponse(SOAPMessage soapResponse) throws Exception {
NodeList responseNodes = soapResponse.getSOAPBody().getElementsByTagNameNS("*", "HelpDesk_QueryList_Service");
if (responseNodes.getLength() == 1)
return true;
else
return false;
}
Demande:
Ce code ne fait imprimer le bon de demande car elle est identique à la demande de travail dans SoapUI. Alors, pourquoi ne puis-je pas obtenir le liés à de l'information pertinente à partir de la réponse réelle? L'imprimé de la réponse est vide de réponse par défaut avec tous les requis, en-têtes, mais aucune des informations souhaitées à partir de ma demande:
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
//Create SOAP Message
SOAPMessage soapMessage = messageFactory.createMessage();
//Add request envelope, headers, and nodes from SOAP request
SOAPPart soapPart = soapMessage.getSOAPPart();
//I used ? here for privacy reasons
String xmlns = "?";
String username = "?";
String password = "?";
String qualification = "'?";
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("urn", xmlns);
SOAPHeader soapHeader = envelope.getHeader();
SOAPElement authInfoElem = soapHeader.addChildElement("AuthenticationInfo", "urn");
createElementAndSetText(authInfoElem, "userName", username);
createElementAndSetText(authInfoElem, "password", password);
SOAPBody soapBody = envelope.getBody();
SOAPElement bodyElem = soapBody.addChildElement("HelpDesk_QueryList_Service", "urn");
createElementAndSetText(bodyElem, "Qualification", qualification);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", xmlns + "/HelpDesk_QueryList_Service");
//Save request
soapMessage.saveChanges();
//Print the request message
System.out.print("SOAP Request:");
System.out.println();
soapMessage.writeTo(System.out);
System.out.println();
System.out.println();
return soapMessage;
}
Erreur: j'obtiens l'erreur suivante mais je ne sais pas pourquoi.
Lis 07, 2016 6:10:34 ODP. com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl lookForEnvelope
SEVERE: SAAJ0514: Unable to create envelope from given source because the root element is not named Envelope
Lis 07, 2016 6:10:34 ODP. com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory createEnvelope
SEVERE: SAAJ0511: Unable to create envelope from given source
Exception in thread "main" com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source:
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:117)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:69)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:128)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getSOAPBody(MessageImpl.java:1351)
at com.xxxx.automation.remedy.RemedySOAPService.isSuccessResponse(RemedySOAPService.java:135)
at com.xxxx.automation.remedy.RemedySOAPService.main(RemedySOAPService.java:52)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source because the root element is not named "Envelope"
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.lookForEnvelope(SOAPPartImpl.java:154)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:121)
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:110)
... 5 more
CAUSE:
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to create envelope from given source because the root element is not named "Envelope"
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.lookForEnvelope(SOAPPartImpl.java:154)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:121)
at com.sun.xml.internal.messaging.saaj.soap.EnvelopeFactory.createEnvelope(EnvelopeFactory.java:110)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPPart1_1Impl.createEnvelopeFromSource(SOAPPart1_1Impl.java:69)
at com.sun.xml.internal.messaging.saaj.soap.SOAPPartImpl.getEnvelope(SOAPPartImpl.java:128)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.getSOAPBody(MessageImpl.java:1351)
at com.xxxx.automation.remedy.RemedySOAPService.isSuccessResponse(RemedySOAPService.java:135)
at com.xxxx.automation.remedy.RemedySOAPService.main(RemedySOAPService.java
:52)
Réponse SOAP:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns0:HelpDesk_QueryList_ServiceResponse xmlns:ns0="urn:XX:XXXX:HPD_IncidentInterface_WS">
<ns0:getListValues>
<ns0:Assigned_Group>XXXX</ns0:Assigned_Group>
<ns0:Assigned_Group_Shift_Name/>
<ns0:Assigned_Support_Company>XXXX</ns0:Assigned_Support_Company>
<ns0:Assigned_Support_Organization>XXXX</ns0:Assigned_Support_Organization>
<ns0:Assignee/>
<ns0:Categorization_Tier_1/>
<ns0:Categorization_Tier_2/>
<ns0:Categorization_Tier_3/>
<ns0:City/>
<ns0:Closure_Manufacturer/>
<ns0:Closure_Product_Category_Tier1>XXXX</ns0:Closure_Product_Category_Tier1>
<ns0:Closure_Product_Category_Tier2>XXXX</ns0:Closure_Product_Category_Tier2>
<ns0:Closure_Product_Category_Tier3/>
<ns0:Closure_Product_Model_Version/>
<ns0:Closure_Product_Name/>
<ns0:Company>XXXX</ns0:Company>
<ns0:Contact_Company>XXXX</ns0:Contact_Company>
<ns0:Contact_Sensitivity>Standard</ns0:Contact_Sensitivity>
<ns0:Country/>
<ns0:Department>XXXX</ns0:Department>
<ns0:Summary>XXXX</ns0:Summary>
<ns0:Notes/>
<ns0:First_Name>XXXX</ns0:First_Name>
<ns0:Impact>4-Minor/Localized</ns0:Impact>
<ns0:Incident_Number>XXXX</ns0:Incident_Number>
<ns0:Internet_E-mail>XXXX</ns0:Internet_E-mail>
<ns0:Last_Name>XXXX</ns0:Last_Name>
<ns0:Manufacturer/>
<ns0:Organization>XXXX</ns0:Organization>
<ns0:Phone_Number>XXXX</ns0:Phone_Number>
<ns0:Priority>Low</ns0:Priority>
<ns0:Priority_Weight>0</ns0:Priority_Weight>
<ns0:Product_Categorization_Tier_1>XXXX</ns0:Product_Categorization_Tier_1>
<ns0:Product_Categorization_Tier_2>XXXX</ns0:Product_Categorization_Tier_2>
<ns0:Product_Categorization_Tier_3/>
<ns0:Product_Model_Version/>
<ns0:Product_Name/>
<ns0:Region/>
<ns0:Reported_Source xsi:nil="true"/>
<ns0:Resolution/>
<ns0:Resolution_Category/>
<ns0:Resolution_Category_Tier_2/>
<ns0:Resolution_Category_Tier_3/>
<ns0:Service_Type>User Service Restoration</ns0:Service_Type>
<ns0:Site>XXXX</ns0:Site>
<ns0:Site_Group>XXXX</ns0:Site_Group>
<ns0:Status>Cancelled</ns0:Status>
<ns0:Status_Reason xsi:nil="true"/>
<ns0:Urgency>4-Low</ns0:Urgency>
<ns0:VIP>No</ns0:VIP>
<ns0:ServiceCI/>
<ns0:ServiceCI_ReconID/>
<ns0:HPD_CI/>
<ns0:HPD_CI_ReconID/>
<ns0:HPD_CI_FormName/>
<ns0:z1D_CI_FormName/>
<ns0:Vendor_Ticket_Number xsi:nil="true"/>
<ns0:Corporate_ID>XXXX</ns0:Corporate_ID>
<ns0:Submitter>XXXX</ns0:Submitter>
<ns0:Pending_Date xsi:nil="true"/>
</ns0:getListValues>
</ns0:HelpDesk_QueryList_ServiceResponse>
</soapenv:Body>
</soapenv:Envelope>
- De ma lecture: La pile n'est pas dans la forge de la demande, mais dans le traitement de la réponse. La réponse est-elle valable du SAVON ?
- Je pense vraiment que le problème est ici:
private static boolean isSuccessResponse(SOAPMessage soapResponse) throws Exception {
mais je ne suis pas sûr de ce qui va mal pour l'instant. - J'ai inclus un exemple de succès de la réponse ci-dessus. Pour l'un, le nom de ma réponse était fausse, donc je vais changer de HelpDesk_QueryList_Service à HelpDesk_QueryList_ServiceResponse...
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il semble que votre erreur se produit lors de la SAAJ cadre des processus de la réponse. Je ne voudrais pas creuser sur la création de la demande, qui je suppose est très bien, en particulier puisque vous dites que c'est la même que la SoapUI forgé une. Vous pouvez aussi consulter les en-têtes HTTP pour faire plus sûr.
La partie importante de la trace de la pile est :
Qui nous dit que le SAVON cadre n'a pas pu traiter la réponse enveloppe. En supposant que la réponse est bien valide, cela ressemble suspiscious.
En regardant ton code, ce que je soupçonne que c'est une mauvaise utilisation de la SAAJ API :
Vous fermez la connexion avant d'utiliser le message. Si la SAAJ mise en œuvre est paresseux (qui je suppose qu'il est, il serait logique), le message n'est pas immédiatement analysées à partir de la Prise réseau. Par la fermeture de la connexion avant en utilisant le message de réponse, vous fait fermer le socket avant il a été lu, et la mise en œuvre, par conséquent, ne peut pas lire le message.
Je suggère de retarder la fermeture de la connexion à après vous avez utilisé l'objet de réponse.
Le même argument peut être faite de la présente partie du code :
Par le dumping de la réponse à la console, vous avez réellement faire le cadre de consommer de la prise (lire la réponse HTTP). Une fois que vous avez, plus tard, de poser le cadre pour analyser le flux de réponse comme une enveloppe, si elle n'a pas mis en cache le contenu du flux, alors cette opération échoue : il n'y a pas plus d'octets à analyser.
Donc, en un mot : ne pas "toucher" la connexion ou la repsonse objet avant que le cadre a une chance de réellement analyser le résultat. Ce n'est pas évident à partir d'une API point de vue design, mais c'est un comportement compréhensible.
Quelques autres pistes :
D'autres sur stackoverflow ont rapporté que leurs anciennes versions de Xerces/Xalan étaient le coupable (ceux qui sont parseurs XML, le JDK a sa propre version de Xerces intégré), de sorte que vous pourriez vouloir vérifier cela aussi :
Java Spring WS org.springframework.ws.le savon.saaj.SaajSoapEnvelopeException: impossible d'accéder enveloppe
http://mmmsoftware.blogspot.fr/2009/06/xml-namespace-error-with-spring-ws.html
soapConnection.close();
ci-dessous ou après la vérification deisSuccessResponse(soapResponse)
ne semble pas fonctionner. Hmm...NodeList responseNodes = soapResponse.getSOAPBody().getElementsByTagNameNS("*", "HelpDesk_QueryList_ServiceResponse");