2016-11-07 3 views
-1

У меня есть запрос SOAP, который я тестировал в SoapUI. Я успешно получаю желаемый ответ.Невозможно создать конверт из данного источника, потому что корневой элемент не назван Envelope

Проблема в моем коде происходит, когда я проверяю, был ли ответ успешным в if (isSuccessResponse(soapResponse)) { ниже:

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!"); 
} 

} 

успеха?

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; 
} 

Запрос: Этот код делает фактически распечатать правильной просьбе, как она идентична рабочей запрос в SoapUI. Так почему я не могу получить соответствующую релевантную информацию от фактического ответа? Напечатанный ответ является пустым ответом по умолчанию со всеми неизбежных заголовками, но ни один из требуемой информации из моего запроса:

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; 
} 

Ошибка: я получаю следующее сообщение об ошибке, но я не знаю, почему.

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) 

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> 
+0

От чтения: Стек не находится в подделке запроса, а в обработке ответа. Является ли ответ действительным SOAP? – GPI

+0

Я действительно думаю, что проблема здесь: '' private static boolean isSuccessResponse (SOAPMessage soapResponse) throws Exception {'', но я не уверен, что еще не так. – santafebound

+0

Я включил образец успешного ответа выше. Во-первых, имя моего ответа было неправильным, поэтому я изменил HelpDesk_QueryList_Service на HelpDesk_QueryList_ServiceResponse ... – santafebound

ответ

1

Во-первых, кажется, что ваша ошибка возникает в то время как структура SAAJ обрабатывает ответ. Поэтому я не стал бы генерировать запрос, который я бы предположил, это прекрасно, особенно если вы считаете, что это то же самое, что и SoapUI. Вы также можете проверить заголовки HTTP, чтобы убедиться в этом.

Важной частью трассировки стека является:

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) 

Который говорит нам о том, что структура SOAP не может обработать конверт ответ. Предполагая, что ответ действительно действителен, это выглядит подозрительно.

Глядя на ваш код, что я подозреваю, что это злоупотребление SAAJ API:

// Close connection 
soapConnection.close(); 

if (isSuccessResponse(soapResponse)) { 
    System.out.println("Success!"); 
} else { 
    System.out.println("Fault!"); 
} 

Вы закрываете соединение перед фактическим использованием сообщения. Если реализация SAAJ является ленивой (что, я думаю, это так, это имеет смысл), сообщение не сразу анализируется из сети Socket. Закрывая соединение до, используя ответное сообщение, вы фактически закрываете сокет, прежде чем он будет прочитан, и, следовательно, реализация не сможет прочитать сообщение.

Я предлагаю отложить закрытие соединения до после того, как вы использовали объект ответа.

Тот же аргумент может быть сделан из этой части коды:

System.out.print("SOAP Response:"); 
System.out.println(); 
soapResponse.writeTo(System.out); 

// Close connection 
soapConnection.close(); 

сбросов ответа на консоль, вы на самом деле сделать каркас потреблять сокет (прочитать ответ HTTP). Как только вы, позже, попросите фреймворк проанализировать поток ответов в качестве конверта, если он не кэшировал содержимое потока, то эта операция завершается с ошибкой: больше нет байтов для синтаксического анализа.

Итак, вкратце: не прикасайтесь к соединению или объекту ответа до того, как у фреймворка есть шанс фактически проанализировать результат. Это не очевидно с точки зрения дизайна API, но это понятное поведение.

Другие ссылки: Другие участники stackoverflow сообщили, что их старые версии Xerces/Xalan были виновниками (это синтаксические анализаторы XML, JDK имеет собственную версию встроенных Xerces), поэтому вы можете проверить это тоже: Java Spring WS org.springframework.ws.soap.saaj.SaajSoapEnvelopeException: Could not access envelope http://mmmsoftware.blogspot.fr/2009/06/xml-namespace-error-with-spring-ws.html

+0

Перемещение 'soapConnection.close();' 'ниже или после проверки' 'isSuccessResponse (soapResponse)' 'не кажется работать. Хмм ... – santafebound

+0

Я отредактирую. Следующим подозреваемым является response.writeTo (System.out), который потребляет поток! – GPI

+0

Хорошие моменты, и я включу изменения в свой дизайн, но он, похоже, не предотвращает ошибки SAAJ. После отладки проблема определенно здесь: '' NodeList responseNodes = soapResponse.getSOAPBody(). GetElementsByTagNameNS ("*", "HelpDesk_QueryList_ServiceResponse"); '' – santafebound